Windows如何执行Win32进程?

Windows如何执行Win32进程?,windows,multithreading,process,portable-executable,Windows,Multithreading,Process,Portable Executable,因此,当您打开PE(.exe)或调用CreateProcess(从Win32 API)时,将遵循以下过程: 文件头、图像扇区以及exe链接所针对的DLL都映射到进程自己的虚拟内存中 CPU在程序开始地址开始执行 所以我的问题来了——PE映像中的所有指令都使用一个相对于它自己的私有地址空间(虚拟内存)的地址,该地址以0开头。有时,此内存会被Windows调出辅助内存(HDD)中的某个位置。CPU如何找出RAM中的实际物理地址?另外,Windows如何根据优先级从一个线程切换到另一个线程,以支持多线

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

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

  • CPU在程序开始地址开始执行

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


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

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

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

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

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