From 91c097aad6ca59f6225dc41737dfed9d2f62df8c Mon Sep 17 00:00:00 2001 From: xiaoyi1212 Date: Fri, 6 Sep 2024 23:11:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Echange=5Fpath=E7=9A=84syscall?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/include/syscall.h | 2 ++ apps/init/init.c | 2 +- apps/libs/syscall.c | 8 ++++++++ src/include/syscall.h | 1 + src/kernel/kernel.c | 10 +++++----- src/kernel/page.c | 11 +++++++---- src/kernel/syscall.c | 5 +++++ src/kernel/task.c | 3 +-- 8 files changed, 30 insertions(+), 12 deletions(-) diff --git a/apps/include/syscall.h b/apps/include/syscall.h index 0914765..748a3ba 100644 --- a/apps/include/syscall.h +++ b/apps/include/syscall.h @@ -14,6 +14,7 @@ #define SYSCALL_VFS_WRITEFILE 11 #define SYSCALL_SYSINFO 12 #define SYSCALL_EXEC 13 +#define SYSCALL_CHANGE_PATH 14 #include "ctype.h" @@ -30,5 +31,6 @@ void syscall_vfs_readfile(char* filename,char* buffer); void syscall_vfs_writefile(char* filename,char* buffer,unsigned int size); void* syscall_sysinfo(); int syscall_exec(char *filename); +void syscall_vfs_change_path(const char* path); #endif diff --git a/apps/init/init.c b/apps/init/init.c index ef1373c..ce941a3 100644 --- a/apps/init/init.c +++ b/apps/init/init.c @@ -3,8 +3,8 @@ int main(){ printf("Init service launched.\n"); + syscall_vfs_change_path("apps"); int pid = exec_elf("shell.bin"); - printf("Launching shell pid [%d]\n",pid); if(pid != -1){ printf("Shell launch win! PID:[%d]\n",pid); } else printf("Error: Cannot launch shell\n"); diff --git a/apps/libs/syscall.c b/apps/libs/syscall.c index 86ccfbe..37d3941 100644 --- a/apps/libs/syscall.c +++ b/apps/libs/syscall.c @@ -94,4 +94,12 @@ int syscall_exec(char *filename){ register uint32_t ebx asm("ebx") = __arg1; asm volatile("int $31\n\t" : "=a"(rets) : "0"(SYSCALL_EXEC), "r"(ebx) : "memory", "cc"); return rets; +} + +void syscall_vfs_change_path(const char *path){ + uint32_t rets; + uint32_t __arg1 = (uint32_t)(path); + register uint32_t ebx asm("ebx") = __arg1; + asm volatile("int $31\n\t" : "=a"(rets) : "0"(SYSCALL_CHANGE_PATH), "r"(ebx) : "memory", "cc"); + return rets; } \ No newline at end of file diff --git a/src/include/syscall.h b/src/include/syscall.h index c084af2..2c03ca5 100644 --- a/src/include/syscall.h +++ b/src/include/syscall.h @@ -18,6 +18,7 @@ #define SYSCALL_VFS_WRITEFILE 11 #define SYSCALL_SYSINFO 12 #define SYSCALL_EXEC 13 +#define SYSCALL_CHANGE_PATH 14 void syscall_install(); diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 75a9942..d67e9d5 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -159,13 +159,13 @@ void kernel_main(multiboot_t *multiboot) { clock_sleep(25); vfs_change_path("apps"); - klogf(user_process("init.bin","InitService") != -1,"Init service process init.\n"); + //klogf(user_process("init.bin","InitService") != -1,"Init service process init.\n"); + int pid = user_process("shell.bin","UserShell"); + kernel_thread(check_task_usershell,&pid,"CTU"); - //klogf(user_process("init.bin","Init") != -1,"Init base process init.\n"); - - //int pid = kernel_thread(setup_shell,NULL,"CPOS-Shell"); - //klogf(pid != -1,"Launch kernel shell.\n"); + // int pid = kernel_thread(setup_shell,NULL,"CPOS-Shell"); + // klogf(pid != -1,"Launch kernel shell.\n"); //kernel_thread(check_task,&pid,"CPOS-CK"); //panic_pane("System out of memory error!",OUT_OF_MEMORY); diff --git a/src/kernel/page.c b/src/kernel/page.c index bdc231a..2aa97e9 100644 --- a/src/kernel/page.c +++ b/src/kernel/page.c @@ -230,7 +230,7 @@ void init_page(multiboot_t *mboot) { current_directory = kernel_directory; int i = 0; - while (i < placement_address + 0x50000) { + while (i < placement_address + 0xf0000) { /* * 内核部分对ring3而言不可读不可写 * 无偏移页表映射 @@ -240,6 +240,11 @@ void init_page(multiboot_t *mboot) { i += 0x1000; } + + for (int i = KHEAP_START; i < KHEAP_START + KHEAP_INITIAL_SIZE; i++) { + alloc_frame(get_page(i, 1, kernel_directory,false), 1, 1); + } + unsigned int j = mboot->framebuffer_addr,size = mboot->framebuffer_height * mboot->framebuffer_width*mboot->framebuffer_bpp; while (j <= mboot->framebuffer_addr + size){ @@ -247,9 +252,7 @@ void init_page(multiboot_t *mboot) { j += 0x1000; } - for (int i = KHEAP_START; i < KHEAP_START + KHEAP_INITIAL_SIZE; i++) { - alloc_frame(get_page(i, 1, kernel_directory,false), 1, 1); - } + register_interrupt_handler(14, page_fault); diff --git a/src/kernel/syscall.c b/src/kernel/syscall.c index 53c768f..201ca9a 100644 --- a/src/kernel/syscall.c +++ b/src/kernel/syscall.c @@ -63,6 +63,10 @@ static void syscall_vfs_writefile(uint32_t ebx,uint32_t ecx,uint32_t edx,uint32_ vfs_writefile(ebx,ecx,edx); } +static void syscall_vfs_chang_path(uint32_t ebx,uint32_t ecx,uint32_t edx,uint32_t esi,uint32_t edi){ + vfs_change_path(ebx); +} + struct sysinfo{ char* osname; char* kenlname; @@ -133,6 +137,7 @@ void *sycall_handlers[MAX_SYSCALLS] = { [SYSCALL_VFS_WRITEFILE] = syscall_vfs_writefile, [SYSCALL_SYSINFO] = syscall_sysinfo, [SYSCALL_EXEC] = syscall_exec, + [SYSCALL_CHANGE_PATH] = syscall_vfs_chang_path, }; typedef size_t (*syscall_t)(size_t, size_t, size_t, size_t, size_t); diff --git a/src/kernel/task.c b/src/kernel/task.c index 74718ba..8a92908 100644 --- a/src/kernel/task.c +++ b/src/kernel/task.c @@ -194,6 +194,7 @@ int32_t user_process(char *path, char *name){ // 用户进程创建 return -1; } io_sti(); + uint32_t size = vfs_filesize(path); if(size == -1){ return -1; @@ -221,8 +222,6 @@ int32_t user_process(char *path, char *name){ // 用户进程创建 new_task->tty = kmalloc(sizeof(tty_t)); init_default_tty(new_task); - extern char root_disk; - vfs_change_disk(new_task,root_disk); vfs_copy(new_task,get_current()->vfs_now); io_sti();