首页 文章

如何运行多个进程的x86处理器'aware'?

提问于
浏览
0

我确定这个问题的答案是在互联网上的某个地方(甚至是stackoverflow),然而,我很难设计问题以获得好的结果 .

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

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

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

3 回答

  • 1

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

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

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

    所以现在我们已经完成了所有工作:CPU上电时执行的代码是操作系统,操作系统动态管理其他代码的执行 . 大多数这些执行单元都称为进程 . (但并非所有代码都是这样的 . 例如,Linux中的可加载内核模块是动态加载的,但不是自己的代码和它根据请求运行的"hosted"代码 .

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

    Example: 也许有必要说明在x86硬件上运行的流行Linux操作系统上有哪些进程:当现有进程(例如shell或 init )调用 clone 系统调用时,通过引发中断128来启动新进程 . 中断使CPU转移控制到中断处理程序例程,该例程由OS在启动期间设置 . 进入中断处理程序后,CPU切换到响铃0,特权模式 . 中断处理程序使内核创建新进程,并且然后将控制转移回调用进程(这意味着切换到保护环3,非特权;进程只在环3中执行) . 为了创建新进程,内核创建相关的内部簿记结构,在MMU中设置新的页表,然后将控制转移到 clone 调用的入口点,类似于原始调用返回的方式 . (I 'm glossing over issues of scheduling here; only one transfer of control happens at a time, and the others are 2905617 to happen later.) The fact that a new process exists now is merely reflected in the kernel'的内部簿记数据.CPU对此一无所知;它只看到中断被触发,页面表定期更改 .

  • 5

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

    这是怎么回事

    • 操作系统处于控制状态(读取:CPU正在执行操作系统例程)并设置沙箱A以用于运行过程A的量程 .

    • 进程A在此沙箱中执行 .

    • 发生周期性中断,服务于此中断的例程属于操作系统,它位于沙箱之外 .

    • 操作系统处于控制状态并设置了一个沙箱B,用于运行一个过程B的量子 .

    • 进程B在此沙箱中执行 .

    这个过程重复进行 .

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

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

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

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

  • 1

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

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

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

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

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

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

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

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

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

    加上中断是进程调度的关键部分 .

相关问题