增加部分namespace代码
This commit is contained in:
@@ -7,3 +7,11 @@ msg_tag_t thread_msg_buf_get(obj_handler_t obj, umword_t *msg, umword_t *len);
|
||||
msg_tag_t thread_exec_regs(obj_handler_t obj, umword_t pc, umword_t sp, umword_t ram, umword_t cp_stack);
|
||||
msg_tag_t thread_run(obj_handler_t obj, uint8_t prio);
|
||||
msg_tag_t thread_bind_task(obj_handler_t obj, obj_handler_t tk_obj);
|
||||
|
||||
#define thread_get_cur_ipc_msg() \
|
||||
( \
|
||||
{ \
|
||||
umword_t buf; \
|
||||
thread_msg_buf_get(-1, &buf, NULL); \
|
||||
((ipc_msg_t *)buf); \
|
||||
})
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
int app_load(const char *name);
|
||||
#include "u_env.h"
|
||||
|
||||
int app_load(const char *name, uenv_t *cur_env);
|
||||
|
||||
@@ -6,3 +6,4 @@
|
||||
obj_handler_t handler_alloc(void);
|
||||
void handler_free(obj_handler_t hd_inx);
|
||||
void handler_free_umap(obj_handler_t hd_inx);
|
||||
void hanlder_pre_alloc(obj_handler_t inx);
|
||||
|
||||
@@ -37,11 +37,10 @@ static umword_t app_stack_push(umword_t *stack, umword_t val)
|
||||
* @param name app的名字
|
||||
* @return int
|
||||
*/
|
||||
int app_load(const char *name)
|
||||
int app_load(const char *name, uenv_t *cur_env)
|
||||
{
|
||||
msg_tag_t tag;
|
||||
sys_info_t sys_info;
|
||||
uenv_t *cur_env = u_get_global_env();
|
||||
|
||||
tag = sys_read_info(SYS_PROT, &sys_info);
|
||||
if (msg_tag_get_val(tag))
|
||||
@@ -127,7 +126,11 @@ int app_load(const char *name)
|
||||
{
|
||||
goto end_del_obj;
|
||||
}
|
||||
|
||||
tag = task_map(hd_task, cur_env->ns_hd, cur_env->ns_hd, 0);
|
||||
if (msg_tag_get_prot(tag) < 0)
|
||||
{
|
||||
goto end_del_obj;
|
||||
}
|
||||
tag = thread_msg_buf_set(hd_thread, (void *)(ram_base + app->i.ram_size));
|
||||
if (msg_tag_get_prot(tag) < 0)
|
||||
{
|
||||
@@ -138,6 +141,7 @@ int app_load(const char *name)
|
||||
{
|
||||
goto end_del_obj;
|
||||
}
|
||||
|
||||
// tag = ipc_bind(hd_ipc, hd_thread, 0);
|
||||
// if (msg_tag_get_prot(tag) < 0)
|
||||
// {
|
||||
@@ -170,7 +174,7 @@ int app_load(const char *name)
|
||||
memcpy((char *)buf_bk + ARG_WORD_NR * 4 + 16, "PATH=/", strlen("PATH=/") + 1);
|
||||
|
||||
// set user env.
|
||||
uenv_t *uenv = (uenv_t *)((char *)buf_bk + 9 * 4 + 16 + 16);
|
||||
uenv_t *uenv = (uenv_t *)((char *)buf_bk + ARG_WORD_NR * 4 + 16 + 16);
|
||||
uenv->log_hd = LOG_PROT;
|
||||
uenv->ns_hd = cur_env->ns_hd;
|
||||
uenv->rev1 = HANDLER_INVALID;
|
||||
|
||||
@@ -19,4 +19,7 @@ void u_env_default_init(void)
|
||||
void u_env_init(void *in_env)
|
||||
{
|
||||
env = *((uenv_t *)in_env);
|
||||
hanlder_pre_alloc(env.log_hd);
|
||||
hanlder_pre_alloc(env.ns_hd);
|
||||
/*TODO:*/
|
||||
}
|
||||
@@ -11,6 +11,23 @@
|
||||
|
||||
static umword_t bitmap_handler_alloc[HANDLER_MAX_NR / WORD_BYTES];
|
||||
static pthread_spinlock_t lock;
|
||||
|
||||
void hanlder_pre_alloc(obj_handler_t inx)
|
||||
{
|
||||
inx -= HANDLER_START_INX;
|
||||
umword_t word_offset = inx / WORD_BITS;
|
||||
umword_t bits_offset = inx % WORD_BITS;
|
||||
|
||||
if (word_offset >= (HANDLER_MAX_NR / WORD_BYTES))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
pthread_spin_lock(&lock);
|
||||
MK_SET_BIT(bitmap_handler_alloc[word_offset], bits_offset);
|
||||
pthread_spin_unlock(&lock);
|
||||
}
|
||||
|
||||
obj_handler_t handler_alloc(void)
|
||||
{
|
||||
pthread_spin_lock(&lock);
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
#include "u_app_loader.h"
|
||||
|
||||
#include "test/test.h"
|
||||
#include "rpc.h"
|
||||
#include "namespace.h"
|
||||
|
||||
extern void futex_init(void);
|
||||
int main(int argc, char *args[])
|
||||
{
|
||||
@@ -31,11 +34,20 @@ int main(int argc, char *args[])
|
||||
mm_test();
|
||||
app_test();
|
||||
#endif
|
||||
int ret = app_load("shell");
|
||||
uenv_t env = *u_get_global_env();
|
||||
obj_handler_t ipc_hd;
|
||||
|
||||
int ret = rpc_creaite_bind_ipc(THREAD_MAIN, NULL, &ipc_hd);
|
||||
assert(ret >= 0);
|
||||
|
||||
env.ns_hd = ipc_hd;
|
||||
ret = app_load("shell", &env);
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("app load fail, 0x%x\n", ret);
|
||||
}
|
||||
ns_pre_alloc_map_fd(thread_get_cur_ipc_msg());
|
||||
rpc_loop(ipc_hd, ns_dispatch);
|
||||
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS)); // 删除当前task,以及申请得所有对象
|
||||
printf("exit init.\n");
|
||||
return 0;
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
|
||||
#include <u_types.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include "u_hd_man.h"
|
||||
#include "u_ipc.h"
|
||||
#define NAMESPACE_PATH_LEN 32
|
||||
#define NAMESAPCE_NR 32
|
||||
|
||||
@@ -34,14 +38,35 @@ static int ns_alloc(const char *path, obj_handler_t hd)
|
||||
return -1;
|
||||
}
|
||||
|
||||
enum ns_op
|
||||
{
|
||||
OP_REGISTER,
|
||||
OP_QUERY,
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 注册一个obj
|
||||
*
|
||||
* @param path 注册的路径
|
||||
* @param hd 注册的hd
|
||||
* @return int
|
||||
*/
|
||||
int ns_register(const char *path, obj_handler_t hd)
|
||||
{
|
||||
if (ns_alloc(path, hd) < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
printf("register svr, name is %d, hd is %d\n", path, hd);
|
||||
return 0;
|
||||
}
|
||||
/**
|
||||
* @brief 申请一个obj
|
||||
*
|
||||
* @param path
|
||||
* @param hd
|
||||
* @return int
|
||||
*/
|
||||
int ns_query(const char *path, obj_handler_t *hd)
|
||||
{
|
||||
for (int i = 0; i < NAMESAPCE_NR; i++)
|
||||
@@ -57,3 +82,46 @@ int ns_query(const char *path, obj_handler_t *hd)
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
obj_handler_t pre_alloc_hd = HANDLER_INVALID;
|
||||
int ns_pre_alloc_map_fd(ipc_msg_t *msg)
|
||||
{
|
||||
obj_handler_t hd = handler_alloc();
|
||||
|
||||
if (hd == HANDLER_INVALID)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
msg->map_buf[0] = vpage_create_raw3(0, 0, hd).raw;
|
||||
pre_alloc_hd = hd;
|
||||
return 0;
|
||||
}
|
||||
msg_tag_t ns_dispatch(ipc_msg_t *msg)
|
||||
{
|
||||
msg_tag_t tag = msg_tag_init4(0, 0, 0, -ENOSYS);
|
||||
assert(msg);
|
||||
|
||||
switch (msg->msg_buf[0])
|
||||
{
|
||||
case OP_REGISTER:
|
||||
{
|
||||
size_t len = msg->msg_buf[1];
|
||||
if (len > NAMESPACE_PATH_LEN)
|
||||
{
|
||||
tag = msg_tag_init4(0, 0, 0, -EINVAL);
|
||||
break;
|
||||
}
|
||||
((char *)&(msg->msg_buf[2]))[len] = 0;
|
||||
ns_register((char*)msg->msg_buf[2], pre_alloc_hd);
|
||||
ns_pre_alloc_map_fd(msg);
|
||||
tag = msg_tag_init4(0, 0, 0, 0);
|
||||
}
|
||||
break;
|
||||
case OP_QUERY:
|
||||
tag = msg_tag_init4(0, 0, 0, 0);
|
||||
break;
|
||||
default:
|
||||
tag = msg_tag_init4(0, 0, 0, -ENOSYS);
|
||||
break;
|
||||
}
|
||||
return tag;
|
||||
}
|
||||
|
||||
8
mkrtos_user/server/init/src/namespace.h
Normal file
8
mkrtos_user/server/init/src/namespace.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
#include "u_types.h"
|
||||
#include "u_prot.h"
|
||||
|
||||
int ns_register(const char *path, obj_handler_t hd);
|
||||
int ns_query(const char *path, obj_handler_t *hd);
|
||||
msg_tag_t ns_dispatch(ipc_msg_t *msg);
|
||||
int ns_pre_alloc_map_fd(ipc_msg_t *msg);
|
||||
57
mkrtos_user/server/init/src/rpc.c
Normal file
57
mkrtos_user/server/init/src/rpc.c
Normal file
@@ -0,0 +1,57 @@
|
||||
|
||||
#include "u_ipc.h"
|
||||
#include "u_factory.h"
|
||||
#include "u_hd_man.h"
|
||||
#include "u_thread.h"
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int rpc_creaite_bind_ipc(obj_handler_t th, void *obj, obj_handler_t *ret_ipc_hd)
|
||||
{
|
||||
obj_handler_t ipc_hd;
|
||||
msg_tag_t tag;
|
||||
|
||||
assert(ipc_hd);
|
||||
|
||||
ipc_hd = handler_alloc();
|
||||
if (ipc_hd == HANDLER_INVALID)
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(0, 0, ipc_hd));
|
||||
if (msg_tag_get_val(tag) < 0)
|
||||
{
|
||||
return msg_tag_get_val(tag);
|
||||
}
|
||||
tag = ipc_bind(ipc_hd, th, (umword_t)obj);
|
||||
if (msg_tag_get_val(tag) < 0)
|
||||
{
|
||||
handler_free_umap(ipc_hd);
|
||||
return msg_tag_get_val(tag);
|
||||
}
|
||||
*ret_ipc_hd = ipc_hd;
|
||||
return 0;
|
||||
}
|
||||
void rpc_loop(obj_handler_t ipc_hd, msg_tag_t (*rpc_dispatch)(ipc_msg_t *msg))
|
||||
{
|
||||
umword_t obj;
|
||||
msg_tag_t tag;
|
||||
umword_t buf;
|
||||
ipc_msg_t *msg;
|
||||
|
||||
thread_msg_buf_get(-1, &buf, NULL);
|
||||
msg = (ipc_msg_t *)buf;
|
||||
while (1)
|
||||
{
|
||||
tag = ipc_wait(ipc_hd, &obj);
|
||||
if (msg_tag_get_val(tag) < 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (rpc_dispatch) {
|
||||
tag = rpc_dispatch(msg);
|
||||
}
|
||||
ipc_reply(ipc_hd, tag);
|
||||
}
|
||||
}
|
||||
6
mkrtos_user/server/init/src/rpc.h
Normal file
6
mkrtos_user/server/init/src/rpc.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "u_types.h"
|
||||
|
||||
int rpc_creaite_bind_ipc(obj_handler_t th, void *obj, obj_handler_t *ipc_hd);
|
||||
void rpc_loop(obj_handler_t ipc_hd, msg_tag_t (*rpc_dispatch)(ipc_msg_t *msg));
|
||||
@@ -33,10 +33,17 @@ int main(int argc, char *args[])
|
||||
printf("argc:%d args[0]:%s\n", argc, args[0]);
|
||||
ulog_write_str(u_get_global_env()->log_hd, "MKRTOS:\n");
|
||||
malloc_test();
|
||||
char *buf;
|
||||
ipc_msg_t *ipc_msg;
|
||||
thread_msg_buf_get(THREAD_MAIN, (umword_t *)(&buf), NULL);
|
||||
ipc_msg = (ipc_msg_t *)buf;
|
||||
ipc_msg->msg_buf[0] = 0x112233;
|
||||
ipc_msg->msg_buf[1] = 0x223344;
|
||||
msg_tag_t tag = ipc_call(u_get_global_env()->ns_hd, msg_tag_init4(0, 2, 0, 0), ipc_timeout_create2(0, 0));
|
||||
printf("msg %d\n", tag.msg_buf_len);
|
||||
irq_test();
|
||||
// ipc_wait(12, 0);
|
||||
// ipc_reply(12, msg_tag_init4(0, 0, 0, 0));
|
||||
// char *buf;
|
||||
// umword_t len;
|
||||
// thread_msg_buf_get(THREAD_MAIN, (umword_t *)(&buf), NULL);
|
||||
// printf(buf);
|
||||
|
||||
Reference in New Issue
Block a user