系统调用
运行库:应用程序和系统调用的中间层,为了兼容性,这样Windows可以用printf、Linux也可以使用printf,而不用知道它的底层逻辑。
代码地址
https://github.com/niu0217/NiuOS
参考资料
- 《Linux内核完全注释》
- 《程序员的自我修养—链接、装载与库》
1. 源代码分析
1.1 向中断向量表注册中断处理函数(int 0x80)
0x80:系统调用号;
system_call:0x80对应的系统调用函数;
1.2 分析system_call函数
linux-0.11/kernel/system_call.s
我们观察到:
call sys_call_table(,%eax,4) # 查系统调用表,根据系统调用号(eax)找到要调用的函数
这里它会去查系统调用表,eax保存的是一个下标,对应具体要调用的系统调用函数,那么sys_call_table到底是什么样子的呢?
1.3 分析sys_call_table函数
linux-0.11/kernel/system_call.s
从这里我们得到sys_call_table就是一个数组,其中保存的是系统调用函数,eax就是下标。
2. Linux系统中断流程图解