Windows如何执行Win32进程?

时间:2013-10-15 14:40:12

标签: windows multithreading process portable-executable

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

  1. 文件头,图像扇区以及exe链接的DLL将映射到进程自有虚拟内存。

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

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

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

1 个答案:

答案 0 :(得分:3)

完整的答案将填满整本书,但简而言之:

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