MmInitializeMemoryManager分析一

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

转载于:https://www.cnblogs.com/fanzi2009/archive/2011/03/16/1985849.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值