修复内核申请内存未清零导致死机的bug
This commit is contained in:
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@@ -188,7 +188,9 @@
|
||||
"cwchar": "c",
|
||||
"test.h": "c",
|
||||
"uart5.h": "c",
|
||||
"wk2xx_hw.h": "c"
|
||||
"wk2xx_hw.h": "c",
|
||||
"cstdlib": "c",
|
||||
"locale": "c"
|
||||
},
|
||||
"cortex-debug.showRTOS": false,
|
||||
"cortex-debug.variableUseNaturalFormat": true,
|
||||
|
||||
@@ -123,6 +123,7 @@ void obj_unmap(obj_space_t *obj_space, vpage_t vpage, kobj_del_list_t *del_list)
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(!slist_is_empty(&entry->node));
|
||||
slist_del(&entry->node);
|
||||
entry->obj = NULL;
|
||||
// slist_init(&entry->node);
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "mm.h"
|
||||
#include "ram_limit.h"
|
||||
#include "globals.h"
|
||||
|
||||
#include "string.h"
|
||||
void *mm_limit_alloc(ram_limit_t *limit, size_t size)
|
||||
{
|
||||
if (ram_limit_alloc(limit, size) == FALSE)
|
||||
@@ -27,6 +27,7 @@ void *mm_limit_alloc(ram_limit_t *limit, size_t size)
|
||||
ram_limit_free(limit, size);
|
||||
return NULL;
|
||||
}
|
||||
memset(new_mem, 0, size + sizeof(size_t));
|
||||
*((size_t *)new_mem) = size;
|
||||
|
||||
return (char *)new_mem + sizeof(size_t);
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#include "obj_space.h"
|
||||
#include "types.h"
|
||||
#include "mm_wrap.h"
|
||||
|
||||
#include "string.h"
|
||||
void obj_space_init(obj_space_t *obj_space, ram_limit_t *ram)
|
||||
{
|
||||
for (int i = 0; i < OBJ_MAP_TAB_SIZE; i++)
|
||||
@@ -60,6 +60,7 @@ obj_map_entry_t *obj_space_insert(obj_space_t *obj_space, ram_limit_t *ram, kobj
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
// memset(obj_space->tab.tabs[tab_inx], 0, sizeof(obj_map_item_t));
|
||||
}
|
||||
obj_map_entry_t *entry = &obj_space->tab.tabs[tab_inx]->items[entry_inx];
|
||||
|
||||
|
||||
@@ -49,6 +49,57 @@ task_t *thread_get_bind_task(thread_t *th)
|
||||
{
|
||||
return container_of(th->task, task_t, kobj);
|
||||
}
|
||||
static void task_unlock_2(spinlock_t *sp0, spinlock_t *sp1, int status0, int status1)
|
||||
{
|
||||
if (sp0 < sp1)
|
||||
{
|
||||
spinlock_set(sp1, status1);
|
||||
spinlock_set(sp0, status0);
|
||||
}
|
||||
else
|
||||
{
|
||||
spinlock_set(sp0, status0);
|
||||
spinlock_set(sp1, status1);
|
||||
}
|
||||
}
|
||||
static int task_lock_2(spinlock_t *sp0, spinlock_t *sp1, int *st0, int *st1)
|
||||
{
|
||||
int status0;
|
||||
int status1;
|
||||
if (sp0 < sp1)
|
||||
{
|
||||
status0 = spinlock_lock(sp0);
|
||||
if (status0 < 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
status1 = spinlock_lock(sp1);
|
||||
if (status1 < 0)
|
||||
{
|
||||
spinlock_set(sp0, status0);
|
||||
return FALSE;
|
||||
}
|
||||
*st0 = status0;
|
||||
*st1 = status1;
|
||||
}
|
||||
else
|
||||
{
|
||||
status0 = spinlock_lock(sp1);
|
||||
if (status0 < 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
status1 = spinlock_lock(sp0);
|
||||
if (status1 < 0)
|
||||
{
|
||||
spinlock_set(sp1, status0);
|
||||
return FALSE;
|
||||
}
|
||||
*st0 = status1;
|
||||
*st1 = status0;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f)
|
||||
{
|
||||
task_t *cur_task = thread_get_current_task();
|
||||
@@ -78,13 +129,20 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
|
||||
case TASK_OBJ_MAP:
|
||||
{
|
||||
kobj_del_list_t del;
|
||||
int st0, st1;
|
||||
|
||||
kobj_del_list_init(&del);
|
||||
int suc = task_lock_2(&tag_task->kobj.lock, &cur_task->kobj.lock, &st0, &st1);
|
||||
if (!suc)
|
||||
{
|
||||
tag = msg_tag_init4(0, 0, 0, -EINVAL);
|
||||
break;
|
||||
}
|
||||
int ret = obj_map_src_dst(&tag_task->obj_space, &cur_task->obj_space,
|
||||
f->r[2], f->r[1],
|
||||
tag_task->lim, f->r[3], &del);
|
||||
|
||||
kobj_del_list_to_do(&del);
|
||||
task_unlock_2(&tag_task->kobj.lock, &cur_task->kobj.lock, st0, st1);
|
||||
tag = msg_tag_init4(0, 0, 0, ret);
|
||||
}
|
||||
break;
|
||||
@@ -103,6 +161,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
|
||||
obj_unmap(&tag_task->obj_space, vpage_create_raw(f->r[1]), &kobj_list);
|
||||
kobj_del_list_to_do(&kobj_list);
|
||||
spinlock_set(&tag_task->kobj.lock, status);
|
||||
tag = msg_tag_init4(0, 0, 0, 0);
|
||||
}
|
||||
break;
|
||||
case TASK_ALLOC_RAM_BASE:
|
||||
@@ -191,7 +250,7 @@ task_t *task_create(ram_limit_t *lim, int is_knl)
|
||||
return NULL;
|
||||
}
|
||||
task_init(tk, lim, is_knl);
|
||||
|
||||
printk("create task is 0x%x\n", tk);
|
||||
return tk;
|
||||
}
|
||||
|
||||
|
||||
@@ -137,7 +137,7 @@ int app_load(const char *name, uenv_t *cur_env)
|
||||
{
|
||||
goto end_del_obj;
|
||||
}
|
||||
tag = task_map(hd_task, cur_env->ns_hd, cur_env->ns_hd, 0);
|
||||
tag = task_map(hd_task, cur_env->ns_hd, cur_env->ns_hd, KOBJ_DELETE_RIGHT);
|
||||
if (msg_tag_get_prot(tag) < 0)
|
||||
{
|
||||
goto end_del_obj;
|
||||
|
||||
@@ -21,11 +21,6 @@ typedef struct file_desc
|
||||
#define FILE_DESC_NR 8
|
||||
static file_desc_t files[FILE_DESC_NR];
|
||||
|
||||
void *file_temp_buf_get(void)
|
||||
{
|
||||
return (void *)(&files[0]);
|
||||
}
|
||||
|
||||
static file_desc_t *alloc_file(int *fd)
|
||||
{
|
||||
for (int i = 0; i < FILE_DESC_NR; i++)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <ff.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
static FATFS fs;
|
||||
static MKFS_PARM defopt = {FM_ANY, 0, 0, 0};
|
||||
|
||||
@@ -24,13 +25,12 @@ int main(int args, char *argv[])
|
||||
|
||||
if (res != FR_OK)
|
||||
{
|
||||
assert(sizeof(FIL) >= FF_MAX_SS);
|
||||
res = f_mkfs("0:", &defopt, file_temp_buf_get(), FF_MAX_SS); // 第三个参数可以设置成NULL,默认使用heap memory
|
||||
assert(sizeof(fs.win) >= FF_MAX_SS);
|
||||
res = f_mkfs("0:", &defopt, (void *)(fs.win), FF_MAX_SS); // 第三个参数可以设置成NULL,默认使用heap memory
|
||||
if (res != FR_OK)
|
||||
{
|
||||
ulog_write_str(u_get_global_env()->log_hd, "f_mkfs err.\n");
|
||||
while (1)
|
||||
;
|
||||
exit(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -38,15 +38,12 @@ int main(int args, char *argv[])
|
||||
if (res != FR_OK)
|
||||
{
|
||||
ulog_write_str(u_get_global_env()->log_hd, "f_mount err.\n");
|
||||
while (1)
|
||||
;
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
ulog_write_str(u_get_global_env()->log_hd, "mount success\n");
|
||||
|
||||
fs_svr_loop();
|
||||
while (1)
|
||||
;
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -44,11 +44,16 @@ int main(int argc, char *args[])
|
||||
env.ns_hd = ipc_hd;
|
||||
namespace_init(ipc_hd);
|
||||
u_sleep_init();
|
||||
ret = app_load("app", &env);
|
||||
// ret = app_load("app", &env);
|
||||
// if (ret < 0)
|
||||
// {
|
||||
// printf("app load fail, 0x%x\n", ret);
|
||||
// // ulog_write_str(LOG_PROT, "app load fail.\n");
|
||||
// }
|
||||
ret = app_load("hello", &env);
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("app load fail, 0x%x\n", ret);
|
||||
// ulog_write_str(LOG_PROT, "app load fail.\n");
|
||||
}
|
||||
ret = app_load("fatfs", &env);
|
||||
if (ret < 0)
|
||||
@@ -57,11 +62,7 @@ int main(int argc, char *args[])
|
||||
}
|
||||
// u_sleep_ms(500);
|
||||
// u_sleep_ms(500);
|
||||
ret = app_load("hello", &env);
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("app load fail, 0x%x\n", ret);
|
||||
}
|
||||
|
||||
namespace_pre_alloc_map_fd();
|
||||
namespace_loop();
|
||||
// task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS)); // 删除当前task,以及申请得所有对象
|
||||
|
||||
Reference in New Issue
Block a user