系统调用解释

什么是中断

硬中断

当外部设备(比如磁盘写入内存完成)或 CPU 内部的硬件事件(比如运算器除 0 错误)发生时,会通过总线向 中断控制器(常见的中断控制器包括 8259A 芯片)发送中断请求信号,中断控制器会协调所有中断请求信号并将其传递给 CPU。CPU 在接收到中断请求信号后会进入特权模式(也就是切换到内核态,拥有读写内核内存虚拟空间的权限),然后执行一段内核空间的特定代码。即首先保存当前线程的上下文,然后根据中断号查找中断向量表并跳转执行中断处理函数,中断处理函数执行结束后会切换回用户态,返回原来的程序继续执行。

软中断

软中断是由 int 指令触发的,这条指令会使 CPU 进入特权模式(也就是切换到内核态,拥有读写内核内存虚拟空间的权限),然后执行一段内核空间的特定代码。即首先保存当前线程的上下文,然后根据中断号查找中断向量表并跳转执行中断处理函数,中断处理函数执行结束后会使用 iret 指令实现中断返回,即切换回用户态然后返回原来的程序继续执行。
注:硬中断和软中断都是立刻中断当前程序的运行,软中断中int 指令的下一条指令已经是内核代码的某条指令了,硬中断中 CPU 收到中断请求信号后的下一条指令已经是内核代码的某条指令了

什么是系统调用

系统调用的核心作用是限制程序员操作底层资源,限制程序员读写内核虚拟内存空间。所有系统调用函数均存储于内核内存。
GNU C 库(glibc)提供了 C 标准库函数,其中就包含对系统调用的封装。无论调用哪一个系统调用函数,其函数执行的最后一定是先将中断号和系统调用参数写入 CPU 寄存器,然后执行 int 0x80 指令触发软中断(0x80 是系统调用中断),进入特权模式(切换到内核态),中断处理函数中会读取 EAX 寄存器中的系统调用号并查询系统调用表来确定对应系统调用函数地址并跳转执行,系统调用函数结束时会将结果写回 CPU 寄存器,中断处理函数执行 iret 指令实现中断返回,即切换回用户态然后返回原来的程序继续执行。

系统调用的简单理解

系统调用的整个过程可以简单理解为:线程通过系统调用进入特权模式,执行一些内核功能代码后返回结果。
注:系统调用不等于切换线程,执行的仍然是当前线程,只不过是在内核态执行的。但系统调用过程中可能切换线程,比如阻塞 IO 的系统调用,当等待 IO 资源时,线程从运行态变为阻塞态的时候仍处于特权模式。

阻塞系统调用是如何实现的

首先线程通过系统调用进入特权模式,当判断需要阻塞时(比如等待文件 IO),就将当前线程从运行态切换为阻塞态并保存线程上下文(程序计数器、通用寄存器等),线程调度器根据调度算法在就绪态队列中选择一个线程,加载该线程的线程上下文,最后将该线程下一条要执行指令的地址写入程序计数器,跳转到这个线程执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值