【原理】
- 透過INT15/E820,讀取 Memory Map,一次讀 20 bytes。
【平台】
- 主機板: ASUS P5KPL-C/1600。
【工具】
- debug32 http://www.phatcode.net/downloads.php?id=180
- E820工具 http://biosengineer.blogspot.com/2008/07/int-15haxe820h.html
【使用】
- 範例一: 用Debug嘗試拿到 e820 的資料。
C:\>debug32 Debug32 - Version 1.0 CPU = 686, Real Mode. Id/Step = 0FF2, A20 disable -a 100 317D:0100 mov eax, 0000e820 ; eax = E820 317D:0106 mov ecx, 14 ; ecx = 20, size of memory 317D:010C mov edx, 534d4150 ; edx = ASCII 'SMAP' 317D:0112 mov di, 200 317D:0115 int 15 [Enter] 317D:0117 [Enter] -p [Enter] (-p下個約5次) AX=4150 BX=0001 CX=0014 DX=4150 SP=0000 BP=0000 SI=0000 DI=0200 DS=313C ES=313C SS=313C CS=313C IP=0117 NV UP DI PL NZ NA PO NC 317D:0115 CD15 INT 15h Instruction Breakpoint -d 200 [Enter] 317D:0200 00 00 00 00 00 00 00 00-00 FC 09 00 00 00 00 00 317D:0210 01 00 00 00 93 01 83 C4-08 8D 46 F6 89 46 F0 8C
上面結果為
Offset Name Value 00~03 BaseAddrLow 00000000 04~07 BaseAddrHigh 00000000 08~0B LengthLow 0009FC00 0C~0F LengthHigh 00000000 10~13 Type 00000001
像上面的探測要一直跑到C Flag或其他條件成立,基本上Sanos那邊code照抄就好。
- 範例二: 用E820.EXE嘗試拿到 e820 的資料。
C:\>e820 >> m C:\>type m BassLow BaseHigh SizeLow SizeHigh Type ------------------------------------------------------ 00000000 0000 0009FC00 0000 1 AddressRangeMemory(EfiLoaderCode) 0009FC00 0000 00000400 0000 2 AddressRangeMemory(EfiLoaderData) 000E4000 0000 0001C000 0000 2 AddressRangeMemory(EfiLoaderData) 00100000 0000 3FE90000 0000 1 AddressRangeMemory(EfiLoaderCode) 3FF90000 0000 0000E000 0000 3 AddressRangeMemory(EfiBootServiceCode) 3FF9E000 0000 00032000 0000 4 AddressRangeMemory(EfiBootServiceData) 3FFD0000 0000 0000E000 0000 2 AddressRangeMemory(EfiLoaderData) 3FFE0000 0000 00020000 0000 2 AddressRangeMemory(EfiLoaderData) FEE00000 0000 00001000 0000 2 AddressRangeMemory(EfiLoaderData) FFF00000 0000 00100000 0000 2 AddressRangeMemory(EfiLoaderData) Dump Memory map v1.0.0 by Harrison Hsieh
【參考】
- E820 http://lrs.uni-passau.de/support/doc/interrupt-57/RB-1692.HTM#Table555
- Sanos e820loop http://www.jbox.dk/sanos/source/sys/boot/ldrinit.asm.html
- E820簡介 http://blog.csdn.net/gxfan/archive/2008/09/22/2962236.aspx
- INT 15h, AX=E820h - Query System Address Map http://www.uruk.org/orig-grub/mem64mb.html
【備註】
- 好用的DOS下測試記憶體工具Memtest86+ http://www.memtest.org/
【問題】
- 如何查看 Status Register?