|
Memory Management(3)
 也许你担心,光为了分页就用掉 4MB,是不是太多了些。噢,不必担心,操作系统可以藉由 page directory 这一层,告诉 CPU 说某一个page table(占用 4KB)不在内存中(not present),于是就可以省下 4KB RAM。Page directory 和 page tables 很少真正使用将近 4MB 的实际内存,但它们的确是使用 4MB 地址空间,就从 FF800000h 开始。Page directory 也位于这 4MB 之中。利用 SoftIce/W 可以观察得到它们。
Windows 95 的内存管理函式Windows 95 的内存管理函式分为四层,上层函式依赖下层函式。最底层是 VMM 提供的函式,用来配置大块内存并在其中操作 pages。应用程序并不直接呼叫这一层函式,KERNEL32.DLL 才会用到它们,用以成就较高阶的函式。 第二层是 KERNEL32 提供的 VirtualXXX 函式:VirtualAlloc、VirualFree、VirtualProtect等等。这些函式系以 VMM 函式为基础,用来管理大块内存,并以 page 为单位。 更上一层是 KERNEL32 的 HeapXXX 函式,包括 HeapAlloc、HeapFree、HeapCreate 等等。它们大约相当于 C 函式库中的内存相关函式(如 malloc、free 等等)。事实上,在 Windows NT SDK 的 C 函式库中,malloc 只是 HeapAlloc 的另一个包装而已。 最上一层是 LocalXXX 和 GlobalXXX 函式。但和 Win16 不同的是,这两组函式基本上没有差别,例如 LocalAlloc 就和 GlobalAlloc 完全相同。KERNEL32 开放出这两个函式,但使用同一个函式地址。LocalXXX 和 GlobalXXX 其实只是 HeapXXX 的上层包装而已,其实没有太多理由需要在 Win32 程序中使用LocalAlloc 和 GlobalAlloc 这样的函式。这些内存管理函式不再像 Win16 的GlobalAlloc 一样需要和selector 打交道,也不再像 Win16 的LocalAlloc 一样从程序的数据节区中挖空间。它们之所以继续存在于Win32,主要理由就是让原来的 Win16 程序更容易生存。
|