系统调用
Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。系统调用实际上是内核中的一些C函数,它们都以sys开头的,如sys_mkdir()。它们通过一个指令int 0x80(软中断)把控制权交给内核,即进入特权级执行。int 0x80指令会使“执行”跳转到系统调用在内核中定义的入口地址。这个位置是唯一确定的,且只可被用户进程读,不可写,这正是利用了“陷阱们”跳转的优点。 进程可以跳转到的内核在的位置叫做system_call。它通过查找系统调用表sys_call_table,找到希望调用的内核函数的地址,调用此函数后返回。Linux里面的每个系统调用是由一些宏,一张系统调用表,一个系统调用入口来完成的。 设定0x80号中断 系统启动后,初始化工作中较重要的一部分在start_kernel()函数中进行,函数start_kernel调用了函数trap_init并设置了各种中断服务程序入口。与系统调用相关的是宏set_system_gate(0x80,&system_call),set_system_gate函数调用层次图如下: 宏_set_gate()的作用是把addr地址值放入gate_addr所指向的内存单元中,使中断向量表中的0x80项保存中断服务程序system_call的入口地址。 系统调用现场保护 系统调用表sys_call_table,部分列出如下: