分类:
2009-04-17 23:34:11
一、处理缺页中断,其向量为14(T_PGFLT)。trap_dispatch()函数将缺页中断分派给page_fault_handler()函数,让page_fault_handler()函数处理缺页中断。其代码如下:
//dispatch page fault exceptions
if(tf->tf_trapno == T_PGFLT){
page_fault_handler(tf);
return;
}
二、断点,其向量为3 (T_BRKPT)。JOS将这个异常分派给内核的monitor()函数,monitor()函数被用作基本的调试函数。其代码如下:
//breakpoint exceptions invoke the kernel monitor
if(tf->tf_trapno == T_BRKPT){
monitor(tf);
return;
}
三、系统调用,
1、关于系统调用有以下几点说明:
1)、系统调用通过软件中断实现
int 0x30
2)、设置idt
需要在idt中进行相应的设置
3)、参数传递:
传递系统调用号:EAX ;5个参数:EDX, ECX, EBX, EDI, ESI
返回值:EAX
2、系统调用流程:内核中通过trapdispatch根据trapno进行分发 kern/syscall.c/syscall()是实现系统调用指定功能的函数。
3、实现syscall()函数:根据系统调用号完成分发到正确的内核函数。系统调用号在inc/syscall.h中定义。代码如下:
switch(syscallno){
case SYS_cputs:
……
default:
panic("shouldn't go here\n");
return -E_INVAL;
}
}
四、启动用户态,在lib/entry.S的开始运行一个用户程序,然后进行一些设置,调用lib/libmain.c中libmain()函数。
libmain()完成以下工作:1)、使env指向给定的环境;2)、保存程序名,以便panic()函数能够使用;3)、调用用户的main()函数;4)、执行完毕返回。
由于目前还没有文件系统,所以用户的程序只能通过ENV_CREATE()函数进行调用。在JOS中编写了hello.c、buggyhello.c等文件并编译成二进制文件以便init.c调用。