笔记:Linux系统调用

Linux系统调用目前了解到的情况如下

一、基础概念
1. 中断向量表 IDT(Interrupt Descriptor Table)
  1. 这个是CPU提供了一系列的中断类型,用一个整型的值表示,对于x86架构的CPU而言,其中断取值类型有256个。可以为每个中断类型注册一个中断发生后的回调处理地址,一旦对应的中断发生,CPU中断当前正在处理的任务,直接跳转到对应的注册地址进行中断处理。
  2. 注册的这256个中断及其回调处理地址(函数的地址)构成了一个IDT(中断描述符表),每个中断条目长4个字节,总共1024个字节,偏移量为0-255。应该注意的是,IDT包含中断处理程序和异常处理程序的向量,因此“IDT”有点用词不当,但这就是事实。
  3. 备注:对于X86的CPU而言,系统调用的中断类型是0x80(下同:仅限于x86),属于软中断。
2. 系统调用表(sys_call_table)
  1. 系统调用表是所有系统调用函数组成的一个数组,系统为每个系统调用分配了一个ID,表示在系统调用表的偏移量,根据ID可以在系统调用表中快速定位到具体的系统调用。
二、系统调用流程
  1. 操作系统启动时,已经初始化好中断向量表和系统调用表
  2. 向CPU发起0x80中断,x86对应的中断汇编指令为int 0x80,发起中断时需要指定对应的系统调用的ID,这就是传说中的“陷入内核
  3. CPU收到中断请求后,保存和修改必要的寄存器信息,然后将IP寄存器指向中断处理函数的地址,这里的中断处理函数为系统调用:system_call
  4. 在系统调用中,根据发起中断时指定的系统调用ID,在系统调用表中找到对应的系统调用,然后执行系统调用:call *sys_call_table(,%eax,4)
  5. 系统调用执行完毕后,恢复中断前的执行状态
三、如何发起中断
  1. glibc库:glibc库几乎为所有的系统调用都做了一层封装,使得系统调用可以像普通函数一样进行调用,不用显示发起软中断。Linux自带的系统调用的函数名都是sys_xxx(或sysxxx,与版本有关)形式的,使用glibc后可以直接去掉对应的sys前缀了。
  2. syscall 直接调用
  3. 通过 int 指令陷入
四、注意事项
  1. 由于执行系统调用时发生了中断,且这个正在执行的中断不能被打断,所以如果在系统调用的回调函数中发生了死循环,那么将导致处理该中断的线程直接被卡死
  2. 进程收到某个信号时,若该进程有多个线程,则每个线程都有同等的机会去处理信号回调函数
五、参考资料
  1. 《Linux System Calls》
  2. 《linux syscall 详解》
  3. 《应用程序如何直接调用一个系统调用, 不经过C库?》
  4. 《linux操作系统中断、异常和系统调用》
  5. 《Linux 下系统调用的三种方法》
  6. 《linux系统调用表(system call table)》
  7. 《int指令(软件中断指令)》
  8. 《glibc源码分析(一)系统调用》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值