操作系统关键词——中断与系统调用

中断机制

当CPU启动设备进行输入/输出后,设备便可以独立工作,CPU转去处理与此次输入/输出不相关的事情;当设备完成输入/输出后,通过向CPU发中断报告此次输入/输出的结果,让CPU决定如何处理以后的事情。
可以说中断本质上是一种由硬件设备发向处理器的特殊的电信号。CPU接收到中断后,会马上向操作系统反映此信号的到来,然后就由操作系统负责处理这些新到来的数据。硬件设备生成中断的时候并不考虑与处理器的时钟同步,因此内核随时可能因为新到来的中断而被打断,这就体现了操作系统的随机性(即中断是异步发生的)。中断信号由硬件设备生成,并直接送入中断控制器中。当接收到一个中断后,中断控制器会给CPU发送一个电信号。CPU一经检测到此信号,便中断自己的当前工作通知操作系统已经产生中断,这样,操作系统就会对这个中断进行适当地处理。不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标志(中断码),使得操作系统能够对中断进行区分,并知道哪个硬件设备产生了哪个中断。这样,操作系统才能给不同的中断提供对应的中断处理程序。
image.png

参考

[1] 《Linux内核设计与实现(第三版)》罗伯特 · 洛夫
[2] 《深入理解计算机系统》兰德尔 E. 布莱恩特, 大卫 R. 奥哈拉伦
[3] 《程序员的自我修养——链接、装载与库》俞甲子,石凡,潘爱民

系统调用

系统调用(System Call)一般指用户在程序中调用操作系统所提供的一些子功能,这里是用户层面和内核层面的界限(用户态到内核态的唯一入口)。在用户程序中,凡是与资源有关的操作都必须经过系统调用的方式向操作系统提出服务请求,并由操作系统代为完成,可以理解为“系统调用是应用程序〈运行库也是应用程序的一部分) 与操作系统内核之间的接口,它决定了应用程序是如何与内核打交道的。”(操作系统具有两种主要的功能:为用户程序提供抽象和管理计算机资源。多数情况下,对用户程序而言,与操作系统之间的交互处理的是前者,而资源管理部分更多是透明和自动完成的。实际上,我们与操作系统的交互就是通过接口提供的调用来处理抽象。这就是系统调用。)

为什么要使用系统调用?这是因为系统有限的资源常常被多个不同的应用程序同时访问,如果不加以保护,那么各个应用程序之间难免会发生冲突,我们的操作系统把这一部分系统资源保护起来,阻止应用程序的直接访问,同时使系统资源能够更加合理地分配。
为了让应用程序有能力访问系统资源, 也为了让程序借助操作系统做一些必须由操作系统支持的行为, 每个操作系统都会提供一套接口以供应用程序使用。这些接口往往通过中断来实现,比如Linux使用0x80号中断作为系统调用的入口Windows采用0x2E号中断作为系统调用入口。

系统调用的大致流程为:

  1. 用户程序启用系统调用
  2. 陷入内核态
  3. 硬件保护现场;通过查中断向量表把控制权转给系统调用总入口程序
  4. 保存现场;将参数保存在内核堆栈里;通过查系统调用表把控制权转给相应的系统调用处理例程或内核函数
  5. 执行系统调用例程
  6. 恢复现场,返回用户程序

对于Linux,其系统调用流程通常如下所示:
image.png

参考

[1] 《现代操作系统》安德鲁 S. 塔嫩鲍姆, 赫伯特 · 博斯
[2] 《程序员的自我修养——链接、装载与库》俞甲子,石凡,潘爱民
[3] 《深入理解计算机系统》兰德尔 E. 布莱恩特, 大卫 R. 奥哈拉伦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值