linux系统调用
WHY
- 系统调用时内核向用户进程服务的唯一方式;
- 通过系统调用,用户程序从用户态切换到核心态,从而访问内核资源
- 好处:
- 安全,避免访问内核资源
- 抽象:使得编程更加方便
- 统一:接口统一,便于移植
x86的运行模式、地址空间与上下文
- linux使用了两个运行模式
- 特权级0:内核模式
- 特权级3:用户模式
- 地址空间
- 用户空间
- 内核空间:3G~4G
- 上下文
- 用户级上下文:代码、数据、用户栈、共享存储区
- 系统级上下文:PCB(task_struct)、MMU、内核栈
- 存储器上下文:各种存储器、栈指针
系统调用、API库和C库
- API是一组函数定义,遵循POSIX标准,说明了如何获取一个特定服务;
- 系统调用则是通过软中断向内核发出请求,每个系统调用对应于一个内核函数,系统调用被使用时,会切换到内核态去找内核函数执行;
- C库函数中包含了部分系统调用,实现了linux主要的API;
- 操作系统命令则比API更高一层,包含了一个或多个API
系统调用处理过程
- 应用程序调用C库函数
- 通过软中断int 0x80进入内核,中断程序将参数,一般是系统调用号放在寄存器eax上传到内核
- 调用system_call函数,保存系统调用号和所有需要的寄存器到栈中;保存PCB的地址;检查系统调用号;有效则根据系统调用号表去调用内核函数(特定的服务程序)
- 转入ret_from_sys_call例程,返回