标签:
作者:黎静
1.系统调用在内核代码中的工作机制和初始化
整个系统调用过程中,时间很重要。
以system_call为例,int 0x80指令与systemcall是通过中断向量联系起来的,而API和对应的sys是通过系统调用号联系起来的。
右边的处理过程(汇编代码)非常重要,通过系统调用号匹配起来。
2.系统调用机制的初始化
trap_init
函数里面有一个set_system_trap_gate
函数,其中涉及到了系统调用的中断向量SYSCALL_VECTOR
和汇编代码入口system_call
,一旦执行int 0x80,CPU直接跳转到system_call
来执行。
3.简化后便于理解的system_call
伪代码
systemcall的位置就在ENTRY(systemcall)处,其他中断的处理过程与此类似。
SAVE_ALL:保存现场
call *sys_call_table(,%eax,4)
调用了系统调度处理函数,eax存的是系统调用号,是实际的系统调度程序
sys_call_table
:系统调用分派表
syscall_after_all
:保存返回值
若有sys_exit_work
,则进入sys_exit_work
:会有一个进程调度时机。work_pending -> work_notifysig
,用来处理信号。
若无sys_exit_work
,就执行restore_all
恢复,返回用户态。
INTERRUPT_RETURN <=> iret,结束。
4.简单浏览system_call
到iret之间的主要代码
1.先执行rm menu -rf,强制删除原有的menu文件夹,使用git命令更新menu代码至最新版。
2.在test.c中添加C函数、汇编函数
3.make rootfs,输入help,可以看到qemu中增加了我们先前添加的命令。
标签:
原文地址:http://www.cnblogs.com/heiguirenxi/p/5326586.html