📄 booting-memory_check_6.htm
字号:
face="Times New Roman TUR" size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></SPAN></SPAN></FONT></SPAN> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
face="Times New Roman TUR" size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输出:</SPAN></SPAN></FONT></SPAN></P><FONT
size=+0><FONT size=+0><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
size=+0><FONT face="Times New Roman TUR"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD><STRONG><FONT face="Times New Roman TUR">Register</FONT></STRONG></TD>
<TD><STRONG><FONT face="Times New Roman TUR">Meaning</FONT></STRONG></TD>
<TD><STRONG><FONT
face="Times New Roman TUR">Description</FONT></STRONG></TD></TR>
<TR>
<TD><FONT face="Times New Roman TUR">CF</FONT></TD>
<TD><FONT face="Times New Roman TUR">进位标志</FONT></TD>
<TD><FONT face="Times New Roman TUR">不进位表示没有错误</FONT></TD></TR>
<TR>
<TD><FONT face="Times New Roman TUR">AX</FONT></TD>
<TD><FONT face="Times New Roman TUR">扩展1</FONT></TD>
<TD><FONT face="Times New Roman TUR">1到16M内存的容量,以KB为单位,最大数量0x3C00 =
15M</FONT></TD></TR>
<TR>
<TD><FONT face="Times New Roman TUR">BX</FONT></TD>
<TD><FONT face="Times New Roman TUR">扩展2</FONT></TD>
<TD><FONT face="Times New Roman TUR">16MB到4GB之间的内存容量,以64K为单位</FONT></TD></TR>
<TR>
<TD><FONT face="Times New Roman TUR">CX</FONT></TD>
<TD><FONT face="Times New Roman TUR">配置1</FONT></TD>
<TD><FONT face="Times New Roman TUR">1到16M内存的容量,以KB为单位,最大数量0x3C00 =
15M</FONT></TD></TR>
<TR>
<TD><FONT face="Times New Roman TUR">DX</FONT></TD>
<TD><FONT face="Times New Roman TUR">配置2</FONT></TD>
<TD><FONT
face="Times New Roman TUR">16MB到4GB之间的内存容量,以64K为单位</FONT></TD></TR></TBODY></TABLE></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><BR><FONT
face="Times New Roman TUR">无法确定"扩展"和"配置"之间的不同到底在哪里,事实上它们的值是相同的。<BR></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT
face="Times New Roman TUR">注意:一个机器可能使用这个接口来报告16M以下内存空洞(count1小于15M,但count2却为非0)。</FONT></P>
<P><FONT size=3>
<HR width="100%" SIZE=2>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman TUR"
size=5><STRONG>1.6.4 INT 15h, AH=88h - Get Extended Memory
Size</STRONG></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT
size=4><STRONG><BR></STRONG></FONT><FONT
face="Times New Roman TUR">E88h只能在实模式下使用。<BR></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></FONT><FONT
face="Times New Roman TUR">这个接口是相当原语性的,它返回1M地址以上的后续内存容量。最大的限止是它的返回值是16-bit的,以KB为单位,所以它最多能够返回64M。在某些系统上,它仅仅能够返回16M以内的内存。</FONT></SPAN></SPAN></FONT></FONT></SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
face="Times New Roman TUR" size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></SPAN></SPAN></FONT></SPAN> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
face="Times New Roman TUR" size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和前两者相比,它的唯一好处是它在所有的PC上都工作。</SPAN></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
face="Times New Roman TUR" size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></SPAN></SPAN></FONT></SPAN> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
face="Times New Roman TUR" size=3><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输入:</SPAN></SPAN></FONT></SPAN></P><FONT
size=+0><FONT size=+0><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT
size=+0><FONT face="Times New Roman TUR"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD><STRONG><FONT face="Times New Roman TUR">Register</FONT></STRONG></TD>
<TD><STRONG><FONT face="Times New Roman TUR">Meaning</FONT></STRONG></TD>
<TD><STRONG><FONT
face="Times New Roman TUR">Description</FONT></STRONG></TD></TR>
<TR>
<TD><FONT face="Times New Roman TUR">AH</FONT></TD>
<TD><FONT face="Times New Roman TUR">功能码</FONT></TD>
<TD><FONT face="Times New Roman TUR">88h</FONT></TD></TR></TBODY></TABLE></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><BR><FONT
face="Times New Roman TUR">输出:</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD><STRONG><FONT face="Times New Roman TUR">Register</FONT></STRONG></TD>
<TD><STRONG><FONT face="Times New Roman TUR">Meaning</FONT></STRONG></TD>
<TD><STRONG><FONT
face="Times New Roman TUR">Description</FONT></STRONG></TD></TR>
<TR>
<TD><FONT face="Times New Roman TUR">CF</FONT></TD>
<TD><FONT face="Times New Roman TUR">进位标志</FONT></TD>
<TD><FONT face="Times New Roman TUR">不进位表示没有错误</FONT></TD></TR>
<TR>
<TD><FONT face="Times New Roman TUR">AX</FONT></TD>
<TD><FONT face="Times New Roman TUR">内存容量</FONT></TD>
<TD><FONT
face="Times New Roman TUR">以KB为单位,1MB以上的内存容量</FONT></TD></TR></TBODY></TABLE></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"> </P><FONT
face="Times New Roman TUR"><STRONG>
<HR width="100%" SIZE=2>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></STRONG></FONT> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face="Times New Roman TUR"
size=4><STRONG>1.6.5 Directly Probing Memory</STRONG></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT
face="Times New Roman TUR">我们在前面已经提到,使用BIOS的方法在某些情况下会无法工作。在这些情况下,可以使用直接探测内存方法。直接探测内存,是一种不依赖于BIOS的内存检测方法,这使得它是一种更加轻便的方法。当使用这种方法的时候,你或许需要考虑系统内存空洞,以及被映射到外部设备上的内存(比如frame
buffering SVGA cards)。</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT
face="Times New Roman TUR"></FONT> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT
face="Times New Roman TUR">使用这种方法的时候,必须进入Protected Mode。</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT
face="Times New Roman TUR"></FONT> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT
face="Times New Roman TUR">另外,由于Intel的386以后的CPU为了提高内存访问速度,使用了memory
cache,来缓冲内存中的内容。但对于我们想通过直接探测内存来确定内存容量的方法来讲, memory
cache反而会造成负面的影响,因此我们必须禁止memory cache。</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT
face="Times New Roman TUR"></FONT> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT face=System>/*<BR>* ULONG
count_memory (void)<BR>*<BR>* probes memory above 1mb<BR>*<BR>* last mod :
05sep98 - stuart
george<BR>*
08dec98 - ""
""<BR>*
21feb99 - removed dummy calls<BR>*<BR>*/<BR>ULONG
count_memory(void)<BR>{<BR>register ULONG *mem;<BR>ULONG mem_count, a;<BR>USHORT
memkb;<BR>UCHAR irq1, irq2;<BR>ULONG cr0;<BR><BR>/* save IRQ's
*/<BR>irq1=inb(0x21);<BR>irq2=inb(0xA1);<BR><BR>/* kill all irq's
*/<BR>outb(0x21, 0xFF);<BR>outb(0xA1,
0xFF);<BR><BR>mem_count=0;<BR>memkb=0;<BR><BR>// store a copy of CR0<BR>__asm__
__volatile__("movl %%cr0, %%eax":"=a"(cr0))::"eax");<BR><BR>// invalidate the
cache<BR>// write-back and invalidate the cache<BR>__asm__ __volatile__
("wbinvd");<BR><BR>// plug cr0 with just PE/CD/NW<BR>// cache disable(486+),
no-writeback(486+), 32bit mode(386+)<BR>__asm__ __volatile__("movl %%eax,
%%cr0", :: "a" (cr0 | 0x00000001 | 0x40000000 | 0x20000000) :
"eax");<BR><BR>do<BR>{<BR>memkb++;<BR>mem_count+=1024*1024;<BR>mem=(ULONG*)mem_count;<BR><BR>a=*mem;<BR><BR>*mem=0x55AA55AA;<BR><BR>//
the empty asm calls tell gcc not to rely on whats in its registers<BR>// as
saved variables (this gets us around GCC optimisations)<BR>asm(" ": :
:"memory");<BR>if(*mem!=0x55AA55AA)<BR>mem_count=0;<BR>else<BR>{<BR>*mem=0xAA55AA55;<BR>asm("
": :
:"memory");<BR>if(*mem!=0xAA55AA55)<BR>mem_count=0;<BR>}<BR><BR>asm("":::"memory");<BR>*mem=a;<BR>}while(memkb<4096
&& mem_count!=0);<BR><BR>__asm__ __volatile__("movl %%eax, %%cr0", ::
"a" (cr0) : "eax");<BR><BR>outb(0x21, irq1);<BR>outb(0xA1, irq2);</FONT></P><PRE><FONT face=System> return (memkb<<20);
}</FONT></PRE></SPAN></SPAN></FONT></FONT></SPAN></FONT></FONT></FONT></SPAN></SPAN></SPAN></FONT></SPAN></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -