MmInitializeMemoryManager函数是BootMain函数中很重要的一步。
MmInitializeMemoryManager的前面会打印出一段log,代码如下。
#if DBG // Dump the system memory map DPRINTM(DPRINT_MEMORY, "System Memory Map (Base Address, Length, Type):\n"); while ((MemoryDescriptor = ArcGetMemoryDescriptor(MemoryDescriptor)) != NULL) { DPRINTM(DPRINT_MEMORY, "%x\t %x\t %s\n", MemoryDescriptor->BasePage * MM_PAGE_SIZE, MemoryDescriptor->PageCount * MM_PAGE_SIZE, MmGetSystemMemoryMapTypeString(MemoryDescriptor->MemoryType)); } #endif
打开DPRINT_MEMORY开关,会得到如下log
(boot\freeldr\freeldr\mm\meminit.c:61) MEMORY: Initializing Memory Manager.
(boot\freeldr\freeldr\mm\meminit.c:65) MEMORY: System Memory Map (Base Address, Length, Type):
(boot\freeldr\freeldr\arch\i386\pcmem.c:150) MEMORY: GetBiosMemoryMap()
(boot\freeldr\freeldr\arch\i386\pcmem.c:180) MEMORY: Memory Map Entry 0
(boot\freeldr\freeldr\arch\i386\pcmem.c:181) MEMORY: Int15h AX=E820h
(boot\freeldr\freeldr\arch\i386\pcmem.c:182) MEMORY: EAX = 0x534d4150
(boot\freeldr\freeldr\arch\i386\pcmem.c:183) MEMORY: EBX = 0x1
(boot\freeldr\freeldr\arch\i386\pcmem.c:184) MEMORY: ECX = 0x14
(boot\freeldr\freeldr\arch\i386\pcmem.c:185) MEMORY: CF set = FALSE
(boot\freeldr\freeldr\arch\i386\pcmem.c:197) MEMORY: BaseAddress: 0x00000000
(boot\freeldr\freeldr\arch\i386\pcmem.c:198) MEMORY: Length: 0x0009FC00
(boot\freeldr\freeldr\arch\i386\pcmem.c:199) MEMORY: Type: 0x1
(boot\freeldr\freeldr\arch\i386\pcmem.c:200) MEMORY: Reserved: 0x0
(boot\freeldr\freeldr\arch\i386\pcmem.c:201) MEMORY:
(boot\freeldr\freeldr\arch\i386\pcmem.c:180) MEMORY: Memory Map Entry 1
(boot\freeldr\freeldr\arch\i386\pcmem.c:181) MEMORY: Int15h AX=E820h
(boot\freeldr\freeldr\arch\i386\pcmem.c:182) MEMORY: EAX = 0x534d4150
(boot\freeldr\freeldr\arch\i386\pcmem.c:183) MEMORY: EBX = 0x2
(boot\freeldr\freeldr\arch\i386\pcmem.c:184) MEMORY: ECX = 0x14
(boot\freeldr\freeldr\arch\i386\pcmem.c:185) MEMORY: CF set = FALSE
(boot\freeldr\freeldr\arch\i386\pcmem.c:197) MEMORY: BaseAddress: 0x0009FC00
(boot\freeldr\freeldr\arch\i386\pcmem.c:198) MEMORY: Length: 0x00000400
(boot\freeldr\freeldr\arch\i386\pcmem.c:199) MEMORY: Type: 0x2
(boot\freeldr\freeldr\arch\i386\pcmem.c:200) MEMORY: Reserved: 0x0
(boot\freeldr\freeldr\arch\i386\pcmem.c:201) MEMORY:
(boot\freeldr\freeldr\arch\i386\pcmem.c:180) MEMORY: Memory Map Entry 2
(boot\freeldr\freeldr\arch\i386\pcmem.c:181) MEMORY: Int15h AX=E820h
(boot\freeldr\freeldr\arch\i386\pcmem.c:182) MEMORY: EAX = 0x534d4150
(boot\freeldr\freeldr\arch\i386\pcmem.c:183) MEMORY: EBX = 0x3
(boot\freeldr\freeldr\arch\i386\pcmem.c:184) MEMORY: ECX = 0x14
(boot\freeldr\freeldr\arch\i386\pcmem.c:185) MEMORY: CF set = FALSE
(boot\freeldr\freeldr\arch\i386\pcmem.c:197) MEMORY: BaseAddress: 0x000F0000
(boot\freeldr\freeldr\arch\i386\pcmem.c:198) MEMORY: Length: 0x00010000
(boot\freeldr\freeldr\arch\i386\pcmem.c:199) MEMORY: Type: 0x2
(boot\freeldr\freeldr\arch\i386\pcmem.c:200) MEMORY: Reserved: 0x0
(boot\freeldr\freeldr\arch\i386\pcmem.c:201) MEMORY:
(boot\freeldr\freeldr\arch\i386\pcmem.c:180) MEMORY: Memory Map Entry 3
(boot\freeldr\freeldr\arch\i386\pcmem.c:181) MEMORY: Int15h AX=E820h
(boot\freeldr\freeldr\arch\i386\pcmem.c:182) MEMORY: EAX = 0x534d4150
(boot\freeldr\freeldr\arch\i386\pcmem.c:183) MEMORY: EBX = 0x4
(boot\freeldr\freeldr\arch\i386\pcmem.c:184) MEMORY: ECX = 0x14
(boot\freeldr\freeldr\arch\i386\pcmem.c:185) MEMORY: CF set = FALSE
(boot\freeldr\freeldr\arch\i386\pcmem.c:197) MEMORY: BaseAddress: 0x00100000
(boot\freeldr\freeldr\arch\i386\pcmem.c:198) MEMORY: Length: 0x1FEF0000
(boot\freeldr\freeldr\arch\i386\pcmem.c:199) MEMORY: Type: 0x1
(boot\freeldr\freeldr\arch\i386\pcmem.c:200) MEMORY: Reserved: 0x0
(boot\freeldr\freeldr\arch\i386\pcmem.c:201) MEMORY:
(boot\freeldr\freeldr\arch\i386\pcmem.c:180) MEMORY: Memory Map Entry 4
(boot\freeldr\freeldr\arch\i386\pcmem.c:181) MEMORY: Int15h AX=E820h
(boot\freeldr\freeldr\arch\i386\pcmem.c:182) MEMORY: EAX = 0x534d4150
(boot\freeldr\freeldr\arch\i386\pcmem.c:183) MEMORY: EBX = 0x5
(boot\freeldr\freeldr\arch\i386\pcmem.c:184) MEMORY: ECX = 0x14
(boot\freeldr\freeldr\arch\i386\pcmem.c:185) MEMORY: CF set = FALSE
(boot\freeldr\freeldr\arch\i386\pcmem.c:197) MEMORY: BaseAddress: 0x1FFF0000
(boot\freeldr\freeldr\arch\i386\pcmem.c:198) MEMORY: Length: 0x00010000
(boot\freeldr\freeldr\arch\i386\pcmem.c:199) MEMORY: Type: 0x3
(boot\freeldr\freeldr\arch\i386\pcmem.c:200) MEMORY: Reserved: 0x0
(boot\freeldr\freeldr\arch\i386\pcmem.c:201) MEMORY:
(boot\freeldr\freeldr\arch\i386\pcmem.c:180) MEMORY: Memory Map Entry 5
(boot\freeldr\freeldr\arch\i386\pcmem.c:181) MEMORY: Int15h AX=E820h
(boot\freeldr\freeldr\arch\i386\pcmem.c:182) MEMORY: EAX = 0x534d4150
(boot\freeldr\freeldr\arch\i386\pcmem.c:183) MEMORY: EBX = 0x0
(boot\freeldr\freeldr\arch\i386\pcmem.c:184) MEMORY: ECX = 0x14
(boot\freeldr\freeldr\arch\i386\pcmem.c:185) MEMORY: CF set = FALSE
(boot\freeldr\freeldr\arch\i386\pcmem.c:197) MEMORY: BaseAddress: 0xFFFC0000
(boot\freeldr\freeldr\arch\i386\pcmem.c:198) MEMORY: Length: 0x00040000
(boot\freeldr\freeldr\arch\i386\pcmem.c:199) MEMORY: Type: 0x2
(boot\freeldr\freeldr\arch\i386\pcmem.c:200) MEMORY: Reserved: 0x0
(boot\freeldr\freeldr\arch\i386\pcmem.c:201) MEMORY:
(boot\freeldr\freeldr\arch\i386\pcmem.c:209) MEMORY: End Of System Memory Map!
(boot\freeldr\freeldr\mm\meminit.c:68) MEMORY: 0 9f000 Free memory
(boot\freeldr\freeldr\mm\meminit.c:68) MEMORY: 100000 1fef0000 Free memory
(boot\freeldr\freeldr\mm\meminit.c:68) MEMORY: 0 1000 Firmware permanent
(boot\freeldr\freeldr\mm\meminit.c:68) MEMORY: 1000 7000 Firmware temporary
(boot\freeldr\freeldr\mm\meminit.c:68) MEMORY: 8000 70000 Loaded program
(boot\freeldr\freeldr\mm\meminit.c:68) MEMORY: 78000 8000 Special memory
(boot\freeldr\freeldr\mm\meminit.c:68) MEMORY: 80000 10000 Firmware temporary
(boot\freeldr\freeldr\mm\meminit.c:68) MEMORY: 90000 10000 Firmware temporary
(boot\freeldr\freeldr\mm\meminit.c:68) MEMORY: a0000 60000 Firmware permanent
(boot\freeldr\freeldr\mm\meminit.c:68) MEMORY: fff000 1000 Special memory
首先用BIOS扫内存,得到6块内存,其中有两块是可以使用的,即BiosMemoryUsable(2)类型。
另外在补充8块内存,这八块是固定地址,并且不再BIOS检查出的内存范围内。
static const MEMORY_DESCRIPTOR_INT MemoryDescriptors[] =
{
#if defined (__i386__) || defined (_M_AMD64)
{ { MemoryFirmwarePermanent, 0x00, 1 }, 0, }, // realmode int vectors
{ { MemoryFirmwareTemporary, 0x01, 7 }, 1, }, // freeldr stack + cmdline
{ { MemoryLoadedProgram, 0x08, 0x70 }, 2, }, // freeldr image (roughly max. 0x64 pages)
{ { MemorySpecialMemory, 0x78, 8 }, 3, }, // prot mode stack. BIOSCALLBUFFER
{ { MemoryFirmwareTemporary, 0x80, 0x10 }, 4, }, // File system read buffer. FILESYSBUFFER
{ { MemoryFirmwareTemporary, 0x90, 0x10 }, 5, }, // Disk read buffer for int 13h. DISKREADBUFFER
{ { MemoryFirmwarePermanent, 0xA0, 0x60 }, 6, }, // ROM / Video
{ { MemorySpecialMemory, 0xFFF, 1 }, 7, }, // unusable memory
#elif __arm__ // This needs to be done per-platform specific way
#endif