0

因此,当您打开 PE (.exe) 或调用 CreateProcess(来自 Win32 API)时,将遵循以下过程:

  1. 文件头、图像扇区以及 exe 链接的 DLL 都映射到进程自己的虚拟内存中。

  2. CPU 从程序起始地址开始执行。

所以我的问题来了 - PE 映像中的所有指令都使用相对于它自己的私有地址空间(虚拟内存)的地址,该地址以 0 开头。有时这个内存会被 Windows 在辅助内存(HDD)的某个地方分页. CPU如何找出RAM中的真实物理地址?此外,Windows 如何通过优先级从一个线程切换到另一个线程,以支持多线程以及当 CPU 未完全使用时发送空闲指令?在所有这些发现之后,我开始认为实际上存储在 PE 文件中的机器代码并不是真正由 CPU 直接执行,而是在某些 Windows 托管环境中执行?这是真的吗?如果是这样,这不会减慢执行速度吗?

编辑:好的,所以问题应该改写如下:“Windows 进程是在核心布局程序中执行还是直接在 CPU 上执行?”。我得到了我想要的答案,所以无论如何问题都解决了。

4

1 回答 1

3

一个完整的答案会写满整本书,但简而言之:

  1. 从高级的角度来看,找到物理地址是通过将地址除以某个常数(通常为 4096),将地址转换为其对应的“页”,然后在表中查找该页,该表指向的索引真实的物理内存页(如果存在)。根据具体情况,其中一些或全部可能由 CPU 自动完成,而不会引起任何人的注意。
    如果页面不存在,操作系统将不得不在让试图访问该页面的代码继续之前从磁盘读取该页面——并且不一定总是进入同一个物理页面。
    实际上它要复杂得多,因为表实际上是一个完整的表层次结构,此外还有一个小缓存(通常大约 50 个条目)在 CPU 内部为最近访问的页面自动执行此任务,而无需触发中断并运行特殊的内核代码。
    因此,根据情况,事情可能会完全自动且不可见地发生,或者可能会调用操作系统内核,遍历整个表层次结构,最后求助于从磁盘加载数据(我什至没有考虑过页面可能有防止它们被访问的保护措施,或在写入时会导致它们被复制的保护措施等)。
  2. 相比之下,多线程“相对简单”。这是通过让定时器每隔一段时间定期触发一个中断(在 Windwos 下通常大约 16 毫秒,但这可以调整),并在中断处理程序中运行一些代码(“调度程序”)来决定是否返回当前线程或更改为另一个线程的上下文并运行该上下文。
    在 Windows 的特定情况下,调度程序将始终首先满足最高优先级的任务,并且仅在没有剩余非阻塞的高优先级任务时才考虑较低优先级的任务。
    如果没有其他任务在运行,则空闲任务(优先级最低)运行。空闲任务可以执行诸如“免费”将回收的内存页面归零之类的任务,
    此外,当线程阻塞时(例如,当读取文件或套接字时),即使没有定时器中断,调度程序也会运行。这确保了在被阻塞的线程不能做任何事情的时候,CPU 可以用于一些有用的事情。
于 2013-10-15T15:48:22.090 回答