x86处理器如何识别'正在运行多个进程?

时间:2017-01-21 18:26:18

标签: assembly x86 operating-system cpu

我确定这个问题的答案是在互联网上的某个地方(甚至是堆栈溢出),但是,我很难制定问题以获得好的结果。

我上周一直在研究x86,并且对于x86处理器意识到'的概念感到困惑。不同的进程运行。例如,在受保护模式下运行时,x86处理器能够限制进程可以访问的内存。这让我相信处理器在某种程度上意识到存在多个进程。

这让我很困惑。从处理器的角度来看,我认为它只是获取要执行的指令列表,操作系统负责订购这些指令(通过时间片,内存管理等),以便可以运行多个进程。从处理器的角度来看,我认为所有它都会看到一个连续的指令列表。

但是,由于x86处理器可以通过进程限制内存访问,因此CPU会以某种方式意识到存在多个进程。

3 个答案:

答案 0 :(得分:5)

CPU不了解进程调度,后者可以用许多不同的方式实现,而前者必须是通用芯片。

这是怎么回事?

  1. 操作系统处于控制状态(读取:CPU正在执行操作系统例程)并设置沙箱A以用于运行过程A的量程。
  2. 进程A在此沙箱中执行。
  3. 发生周期性中断,服务于此中断的例程属于操作系统,位于沙箱之外。
  4. 操作系统处于控制状态,并设置了一个沙盒B,用于运行一个过程B的量子。
  5. 进程B在此沙箱中执行。
  6. 重复这个过程。

    受保护模式允许操作系统创建沙箱,特别是它定义权限(在实模式下,每个程序都具有相同的权限),以便进程A和进程B无法转义沙箱(例如,通过禁用中断并永久运行)。

    CPU不知道它发生了什么,它只是看到在不同特权和"约束下执行的一系列指令"。
    在执行不同的程序之前,操作系统以不同的方式配置CPU 这也有助于解释线程和进程之间的区别:线程调度不会更改沙箱。

    正如Jester在评论中记得的那样,x86支持任务管理 但是,HW任务并不是一对一映射到OS进程(IIRC主要操作系统几乎不使用此功能)。

    阅读Intel Manual 3将帮助您了解CPU的功能以及安全操作系统的责任从CPU转移到内核。

答案 1 :(得分:1)

CPU一次看到一个进程。除非正在执行,否则CPU不了解进程。

  

例如,在受保护模式下运行时,x86处理器能够限制进程可以访问的内存。

您所描述的是逻辑地址转换。操作系统为进程定义一组页表,提供从逻辑页到物理页框的映射。页表还定义了允许访问这些页面的访问权限。每个进程都有自己的一组页表(在某些情况下,可以共享该组的各个部分)。

页表的结构由处理器定义。这些表的内容由操作系统建立。因此,存储器上的“限制”来自操作系统。

更改当前进程(由操作系统触发)的部分过程是交换新进程的页表而不是旧进程的页表。

处理器从当前正在执行的进程的角度看待内存访问的“限制”,并且在任何给定时间都不知道任何其他进程的等效“限制”(页表)。

  

但是,由于x86处理器可以通过进程限制内存访问,因此CPU会以某种方式意识到存在多个进程。

CPU只知道当前进程的页表。它只知道正在执行的进程的“限制”。当前页表集定义了进程可以访问的物理内存以及它如何访问它(按模式读/写/执行+限制)。

  

从处理器的角度来看,我认为所有它都会看到一个顺序的指令列表。

正中断是流程调度的关键部分。

答案 2 :(得分:1)

从硬件的角度来看,你所做的一切都是“执行指令”,一次一个。在一些(也许是温和简化的)意义上,这就是所有这一切。

如果您要执行某些特定的计算任务,您确实可以编写合适的指令流,以便您可以打开硬件电源,执行指令,然后暂停或关闭等等。这就是早期计算机实际运行的方式。

然而,这种操作计算机的模式非常笨重,根本无法扩展,因为它需要一个操作员负责所有,并在此过程中重新发明各种轮子。这就是操作系统的概念所在:OS是一种特定类型的指令流,在启动时加载,可以依次加载并执行其他位说明,动态。这种划分允许重用核心功能(想想设备驱动程序),并动态地调整机器的功能(即,当它运行时,而不是重新编程和重置它)。更重要的是,它允许动态加载的指令的那些部分由不同的人创作,因此我们有一个可以执行“用户定义的指令”的平台,即我们通常理解为“程序”。

现在我们拥有所有部分:CPU在启动时执行的代码是操作系统,操作系统动态管理其他代码的执行。大多数这些执行单元称为进程。 (但并非所有代码都是这样的。例如,Linux中的可加载内核模块是动态加载的,但不构成进程。)也就是说,进程是操作系统中的一个抽象概念,用于描述操作系统自身的代码以及根据请求运行的“托管”代码。

根据操作系统的类型,进程的执行可能具有奇特的功能,例如虚拟内存(每个进程看到自己的,独立的内存)和保护(没有进程可能会干扰操作系统或其他进程的操作)。操作系统通过使用CPU功能实现此类功能:提供地址转换的内存管理器单元,以及限制执行可用指令的保护环。但并非所有操作系统都这样做;例如,在DOS中,每个进程都可以完全访问物理内存,从而可以访问操作系统的状态。无论如何,OS通常再次使用硬件特征(中断或特殊系统调用指令)为进程(例如“系统调用”)提供API,并且用户代码通常通过该API与环境交互而不是直接与外围设备通信。例如,这意味着硬件驱动程序仅由操作系统实现,用户代码可以进行不透明的“打印输出”调用,而无需了解可用输出设备的详细信息。

示例:也许有必要说明在x86硬件上运行的流行Linux操作系统上有哪些进程:在现有进程(例如shell或{{1)时启动新进程通过引发中断128来调用init系统调用。中断使CPU转移控制到中断处理程序例程,该例程由OS在启动期间设置。进入中断处理程序后,CPU切换到响铃0,特权模式。中断处理程序使内核创建新进程,然后将控制权转移回调用进程(这意味着切换到保护环3,非特权;进程只在环3中执行)。为了创建新进程,内核创建相关的内部簿记结构,在MMU中设置新的页表,然后将控制权转移到clone调用的入口点,类似于原始方式呼叫返回。 (我在这里掩饰了调度问题;一次只发生一次控制转移,其他的“调度”发生在以后发生。)现在存在新进程的事实仅反映在内核的内部簿记数据中。 CPU对此一无所知;所有它看到的是中断被触发,页面表定期更改。