你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

【操作系统】IO、系统调用、中断、内核态转换

2021/12/19 12:56:46

文章目录

  • 软件需要硬件资源,操作系统是如何执行的?
  • 系统调用
  • 中断
    • 中断简介
    • 中断的作用
  • 用户态到内核态的转化原理

软件需要硬件资源,操作系统是如何执行的?

软件需要硬件资源,这属于一次IO请求。

通常把I/O软件组织成四个层次:

  1. 用户层I/O软件, 实现与用户交互的接口, 用户可直接调用该层所提供的、 与I/O操作有关的库函数对设备进行操作。
  2. 设备独立性软件, 用于实现用户程序与设备驱动器的统一接口、 设备命名、 设备的保护以及设备的分配与释放等, 同时为设备管理和数据传送提供必要的存储空间。
  3. 设备驱动程序, 与硬件直接相关, 用于具体实现系统对设备发出的操作指令, 驱动I/O设备工作的驱动程序。
  4. 中断处理程序, 用于保存被中断进程的CPU环境, 转入相应的中断处理程序进行处理, 处理完毕再恢复被中断进程的现场后, 返回到被中断的进程。

在这里插入图片描述
我认为,除了第一层,其他都属于系统调用,操作系统将硬件资源封装起来,对用户提供接口,不允许用户直接调用硬件资源。

系统调用

  • 为使诸进程能有条不紊地使用I/O设备, 且能保护设备的安全性, 不允许运行在用户态的应用进程去直接调用运行在核心态(系统态)的OS过程。
  • 同时应用进程在运行时, 又必须取得OS所提供的服务, 否则, 应用程序几乎无法运行。

为了解决以上两个问题,OS在用户层中引入了一个中间过程——系统调用,来对I/O设备进行操作。当应用程序需要执行某种I/O操作时, 在应用程序中必须使用相应的系统调用。

  • 当OS捕获到应用程序中的该系统调用后, 便将CPU的状态从用户态转换到核心态,然后转向操作系统中相应过程, 由该过程完成所需的I/O操作。
  • 执行完成后, 系统又将CPU状态从核心态转换到用户态, 返回到应用程序继续执行。
  • 对文件进行写操作,程序向打开的文件写入字符串“hello world”,open和write都是系统调用。

事实上, 由OS向用户提供的所有功能, 用户进程都必须通过系统调用来获取, 或者说, 系统调用是应用程序取得OS所有服务的唯一途径。

中断

中断简介

中断:

  • 中断是指CPU对I/O设备发来的中断信号的一种响应。 CPU暂停正在执行的程序, 保留CPU环境后, 自动地转去执行该I/O设备的中断处理程序。
  • 执行完后, 再回到断点, 继续执行原来的程序。
  • I/O设备可以是字符设备, 也可以是块设备、 通信设备等。 由于中断是由外部设备引起的, 故又称外中断。

陷入

  • 另外还有一种由CPU内部事件所引起的中断, 例如进程在运算中发生了上溢或下溢,又如程序出错, 如非法指令、 地址越界, 以及电源故障等。 通常把这类中断称为内中断或陷入(trap)。
  • 与中断一样, 若系统发现了有陷入事件, CPU也将暂停正在执行的程序, 转去执行该陷入事件的处理程序。 中断和陷入的主要区别是信号的来源, 即是来自CPU外部,还是CPU内部。

中断的作用

中断在操作系统中有着特殊重要的地位, 它是多道程序得以实现的基础:

  • 没有中断, 就不可能实现多道程序, 因为进程之间的切换是通过中断来完成的。
  • 另一方面,中断也是设备管理的基础, 为了提高处理机的利用率和实现CPU与I/O设备并行执行, 也必需有中断的支持。
  • 中断处理程序是I/O系统中最低的一层, 它是整个I/O系统的基础。

用户态到内核态的转化原理

参考回答:
1)用户态切换到内核态的3种方式

1、系统调用

这是用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的ine 80h中断。

2、异常

当CPU在执行运行在用户态的程序时,发现了某些事件不可知的异常,这是会触发由当前运行进程切换到处理此。异常的内核相关程序中,也就到了内核态,比如缺页异常。

3、外围设备的中断

当外围设备完成用户请求的操作之后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条将要执行的指令,转而去执行中断信号的处理程序,如果先执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了有用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

2)切换操作

从出发方式看,可以在认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说,涉及的关键步骤是完全一样的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断处理机制基本上是一样的,用户态切换到内核态的步骤主要包括:

1、从当前进程的描述符中提取其内核栈的ss0及esp0信息。

2、使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈找到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令。

3、将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。