linux系统调用

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例程,返回