📄 exec.c
字号:
#include "hos.h"unsigned long EXEC_load_body(char *buf, int len){ // load code in free frame unsigned long sloc; printk("in EXEC load body\n"); sloc = get_free_pgframe(); mymemcpy(sloc, buf, len); // for now return sloc; } int do_execve(struct pt_regs *regs){// regs->ecx points to the file path for exec char *path; int x,n; char buf[512]; unsigned long * xx, *dir0; unsigned long start_loc; path=regs->ecx; printk("path is %s\n",path); x=do_open(path); asm("sti\n\t"::); // we need timer int to read from disk n=kernel_do_read(x, buf, 512); asm("cli\n\t"::); printk("the buf read from disk is: "); xx=(unsigned long *)buf; for(x=0;x<32;x++) printk("%x ", xx[x]); //wait_for_anykey(); start_loc = EXEC_load_body(buf,n); // assume our process fits in 1 page // set page table set_page_table(current, start_loc); dir0 = (unsigned long *)mloc(current->mm.pgdir[0]); printk("aft set page table.pgdir %x, pgdir[0] %x, dir0[512] %x\n", current->mm.pgdir, current->mm.pgdir[0], dir0[512]); printk("the code at start_loc:%x is: ",start_loc); xx=(unsigned long *)start_loc; for(x=0;x<16;x++) printk("%x ", xx[x]); printk("now check paging sytem. dumping USER_PROCESS_LOCATION\n"); xx=(unsigned long *)USER_PROCESS_LOCATION; for(x=0;x<16;x++) printk("%x ", xx[x]); //asm("sti\n\t"::); //dump_directory_table(current->mm.pgdir); //asm("cli\n\t"::); // change starting ip printk("dumping done\n"); regs->eip = USER_PROCESS_LOCATION; //we assume all processes starts at virt 0x200000}int sys_execve(struct pt_regs regs){ printk("in sys execve\n"); return do_execve(®s);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -