OSTEP 笔记(二)

什么是受限直接执行

直接执行指的是程序直接在硬件CPU上执行。

但是会有问题:如果进程希望执行某种受限操作(例如访问IO)怎么办?

问题一:受限制的操作:

可以引入一种新的处理器模式,称为用户模式。在用户模式下运行的代码会受到限制。与用户模式不同的内核模式,操作系统就以这种模式运行。然后通过系统调用来实现用户模式对内核的访问。

要执行系统调用,程序必须执行特殊的陷阱指令,该指令同时跳入内核并将权限级别改为内核模式,完成后,操作系统调用一个特殊的从陷阱返回指令以回到用户模式。

陷阱如何知道在OS内运行了哪些代码?

内核通过在启动时设置陷阱表来实现。操作系统告诉硬件发生某件异常事件时要运行哪些代码。

内核(启动) 硬件 用户
初始化陷阱表
记住系统调用处理程序的地址
内核(运行) 硬件 用户
在进程列表创建条目,为程序分配内存,将程序加载在内存中,根据argv分配程序栈,用寄存器/程序计数器填充内核栈,从陷阱返回。
从内核恢复寄存器,转向用户模式,跳到main
运行main,调用系统调用,陷入操作系统
将寄存器保存到内核栈,转向内核模式,跳到陷阱处理程序
处理陷阱,做系统调用的工作,从陷阱返回
从内核栈恢复寄存器,转到用户模式,跳到陷阱之后的程序计数器
释放内存,将进程从进程列表中删除 从main返回

问题二:在进程之间切换:

操作系统如何重新获得CPU的控制权,以便它可以在进程之间切换?

协作方式 —— 等待系统调用:

在协作调度系统中,OS通过等待系统调用,或某种非法操作产生,从而重新获得CPU的控制权。

非协作方式 —— 时钟中断:

时钟设备可以每隔一段时间产生一次中断。产生中断时,当前正在运行的进程停止,操作系统运行中断处理程序,此时操作系统会重新获得CPU的控制权。