二,从程序到内核 程序是被CreateProcess载入的,中间过程就略去不说了。不过程序为何可以在不同系统上运行呢?

首先每个程序会调用一系列的库函数,具体视使用语言和编译工具,编程框架而定。程序或者框架会调用系统的API,这个部分是SDK编程的内容。具体调用哪个API,在什么DLL里面,传入啥参数,在所有windows系统中都是一样的。不过每个windows系统对于具体实现就完全不同了。调用的API会在程序文件中载明。然后系统会将每个DLL载入进程空间,于是就实现了具体和系统的链接。每个DLL最终都会调用int 2eh(或者SYSENTER)陷入系统来完成各种使用。这部分就是内核的事情了。由刚刚的程序载入(每个系统都相同的动作),到内核实现(每个内核都不同的事情)。中间具体的过程就是系统附带的DLL的所完成的。

三,MM,不是美媚

MM是MemoryMangermant的简称,而非美媚。windows的内存管理在程序来看是透明的,因为对于程序来说,地址空间是连续的。主要原因是系统通过段寄存器索引了某个表,通过此表来映射你的“连续”内存地址到真实内存地址上来。当然,也有可能映射到了硬盘上的某个区域。Windows的每个内存块都对应某个硬盘上的区域。不过如果在内存中,则区域保留等待写入。如果不在内存中,需要的时候读出来而已。在你“透明”访问内存的时候,段寄存器会访问这张表(实际一般不访问,表的项目会在首次访问的时候载入某个缓冲用的快速寄存器),而后映射到真实的内存地址。如果“真实”的内存地址不存在,则会发生异常。windows的异常捕获会直接将硬盘内数据调入,然后继续程序执行。所以在访问内存过程中,程序看来是“透明”的。