Linux中的系统调用 学习笔记

系统调用总结

系统调用的定位:

应用程序没有访问系统资源的权限,所以为了防止应用程序对系统资源的破坏,操作系统限制了应用程序的直接访问。通过一个架构,让所有的应用程序通过统一的系统调用来访问系统资源(文件、网络、内存、IO设备)。

系统调用的步骤:

  1. 执行前准备工作
  2. 处理函数
  3. 后续任务

系统调用难点(步骤1、3):

  1. 内核模式切换
  2. 栈切换

应用程序直接系统调用步骤
为了支持系统调用,Linux glibc库提供许多共享库(so)文件。
以文件操作为例:

int read(int fd, void *buf, int count) // 读取系统文件
int write(int fd, const void *buf, int couint); //写文件数据
int open(const char *pathname, int flags, mode_t mode); //打开文件

高级编程语言的作用(以c为例)

c语言标准库可以作为不同平台的上层实现,顺利通过不同操作系统编译器的编译。对于用标准库开发的应用程序,其系统调用步骤参考下图:
c标准库调用

c的标准库的调用关系如下图。
c标准库
存在缺陷:只能取各个操作系统调用的交集,一些时候需要一些操作系统专有功能时,应直接进行系统调用或调用API。

fork函数

fork函数前后涉及到9个系统调用步骤,如下图:
Linux系统调用过程

  1. 应用程序调用linux库提供的fork函数,发起一个fork系统调用,目的是为了创建子进程,该紫禁城拷贝了父进程的虚拟进程空间。
  2. fork函数
    1)将编号2的系统调用放入寄存器eax(默认用于传递系统调用编号的寄存器)。如果系统调用有参数,将参数传入到各个寄存器(EBX、ECX、EDX、ESI、EDI、EBP),可以看出系统调用最多支持6个参数,fork系统调用没有参数。
    2)执行中断指令int 0x80,中断指令int用于发送中断信号给处理器,0x80为中断向量号。int指令同时会将模式从用户态切换到内核态,用户栈切换到内核栈,同时会将当前被中断的应用程序,中断时的寄存器内容入栈(SS、ESP、EFLAGS、CS、EIP),这里的入栈指的是入内核栈(每个应用程序徐都有一个用户栈和内核栈)。
    该段操作的汇编指令如下:
push EAX, 2
mov EBX, arg1;
mov ECX, arg1;
mov EDX, arg1;
mov ESI, arg1;
mov EDI, arg1;
mov EBP, arg1;
int 0x80;
  1. 当称呼力气执行完当前指令后,会检查处理器的中断引脚,发现有中断信号,然后检查状态寄存器(EFLAGS),发现中断屏蔽IF标志是打开的(系统调用中断信号不会被屏蔽),处理器根据中断信号,分析出中断向量号,然后根据中断向量号去查找对应中断描述符表,找到了该中断向量号对应的中断处理程序。
  2. 操作系统跳转到中断处理程序,然后开始执行中断处理程序,0x80对应的中断处理程序是系统调用中断处理程序(system_call)。
    汇编指令:
push EAX;
push EBX;
push ECX;
push EDX;
push ESI;
push EDI;
push EBP;

该中断程序会将这些寄存器入栈,以防止后续的工作覆盖这些寄存器。
5. 系统中断处理程序根据fork系统调用号(2)查找系统调用表,找到对应的处理函数,(一般以sys开头,例如fork的系统处理函数是sys_work)。
6. 找到并执行系统处理函数,通过该函数从内核栈中获取函数的参数,函数执行完成后,函数的返回值默认用EAX寄存器返回。
7. 与步骤8是开始执行iret指令(负责从内核态切换到用户态),将内核态入栈的寄存器数据出栈到各种寄存器中,后跳转到系统调用处。
8. 见7
9. 系统调用fork返回到应用程序。

我是一名刚在深圳工作的Linux开发工程师,欢迎关注我的微信订阅号,后续会坚持输出自己的开发心得,与君共勉。
微信关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构森林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值