系统调用

系统调用是用户空间与内核交互的关键途径,涉及从用户态到核心态的切换。调用过程包括:C库函数调用、参数复制到寄存器、触发中断、内核处理、服务例程执行及返回。系统调用有固定编号,且涉及内存验证和数据交换,相对普通函数调用,开销较大。标准C库如glibc会利用系统调用实现部分功能。
摘要由CSDN通过智能技术生成

 

系统调用是受控的内核入口;

 

系统调用将处理器从用户态切换到核心态,以便CPU 访问受到保护的内核内存。

系统调用的组成是固定的,每个系统调用都由一个唯一的数字来标识。(程序通过名
称来标识系统调用,对这一编号方案往往一无所知。)

 

每个系统调用可辅之以一套参数,对用户空间(亦即进程的虚拟地址空间)与内核空
间之间(相互)传递的信息加以规范。

 

1. 应用程序通过调用C 语言函数库中的外壳(wrapper) 函数,来发起系统调用。

 

2. 对系统调用中断处理例程(稍后介绍)来说,外壳函数必须保证所有的系统调用参数可用。通过堆栈,这些参数传入外壳函数,但内核却希望将这些参数置入特定寄存器。因此,外壳函数会将上述参数复制到寄存器。

 

3. 由千所有系统调用进入内核的方式相同,内核需要设法区分每个系统调用。为此,外壳函
数会将系统调用编号复制到一个特殊的CPU 寄存器(¾eax) 中。

 

4. 外壳函数执行一条中断机器指令(int Ox80), 引发处理器从用户态切换到核心态,并执行
系统中断Ox80 (十进制数128) 的中断矢噩所指向的代码。

 

5. 为响应中断Ox80, 内核会调用system_callO例程(位千汇编文件arch/i386/entry.S 中)来
处理这次中断,具体如下。
a) 在内核栈中保存寄存器值(参见6.5 节)。
b) 审核系统调用编号的有效性。
c) 以系统调用编号对存放所有调用服务例程的列表(内核

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值