网站建设优化seo,做最漂亮的网站,展示型为主的网站,wordpress 发邮件设置接上文#xff0c;另一个获取内存容量的方法是bios 0x15中断的子功能0xE801。
此方法虽然简单#xff0c;但功能也不强大#xff0c;最大只能识别4G内存#xff0c;不过这对咱们32位地址总线足够了。稍微有点不便的是#xff0c;此方法检测到的内存是分别存放到两组寄存器…接上文另一个获取内存容量的方法是bios 0x15中断的子功能0xE801。
此方法虽然简单但功能也不强大最大只能识别4G内存不过这对咱们32位地址总线足够了。稍微有点不便的是此方法检测到的内存是分别存放到两组寄存器中的。低于15MB的内存是以1KB为单位大小来记录单位数量在寄存器AX和CX中记录其中AX和CX的值是一样的所以在15MB空间以下的实际内存容量AX*1024。AX、CX最大值为0x3c00即0x3c00*102415MB。16MB~4GB是以64KB为单位大小来记录单位数量在寄存器BX和DX中记录其中BX和DX的值是一样的所以16MB以上空间的内存实际大小BX*64*1024不用在意BX和DX最大值是多少前面说过啦只支持4G空间您可以反推一下看看。
咱们还是列个表将其用法分为输入、输出两部分介绍。 再次提醒中断返回后AX和CX中其值的单位是1KB而BX和DX的单位是64KB。
当初我看到这儿的时候脑子中不禁弹出了两个问号
1 为什么要分“前15MB”和“16MB以上”这两部分来展示4GB内存
2 为什么寄存器结果是重复的如寄存器AX和CX相等BX和DX相等
为了解决第1个问题让我们实际测试下让事实说话。测试方法是修改bochs配置文件bochsrc.disk中的内存容量参数megs然后执行bios中断。测试结果见表 表中“实际物理内存”和“检测到的内存大小”它们之间总是差1MB言外之意是总有1MB内存不可用。这是怎么回事真是一波未平一波又起啊。
很多问题都是祖上传下来的^_^即著名的历史遗留问题。80286是拥有24位地址线其寻址空间是16MB。当时有一些ISA设备要用到地址15MB以上的内存做为缓冲区也就是此缓冲区为1MB大小所以硬件系统就把这部分内存保留下来操作系统不可以用此段内存空间。保留的这部分内存区域就像不可以访问的黑洞这就成了内存空洞memory hole。现在虽然很少很少能碰到这些老ISA设备了但为了兼容这部分空间还是保留下来只不过是通过bios选项的方式由用户自己选择是否开启。bios厂商不同一般的菜单选项名称也不相同不过大概意思都差不多。比如咱们开机进入bios界面后会有类似这样的选项
memory hole at address 15m-16m
将此选项设为enable或disable便开启或关闭对这类扩展ISA设备的支持。
话说起初定义这个0xe801子功能就是为了支持扩展ISA服务。现在来回答这个问题。
如果检测到的内存容量大于等于16MBbios 0x15中断返回的结果中AX*1024必然是小于等于15MB而BX*64*1024肯定大于0。所以内存容量分成两部分展示只要符合这两个结果就能检查出内存空洞。当然如果物理内存在16MB以下此方法就不灵了但检测到的内存依然会小于实际内存1MB。所以实际的物理内存大小在检测结果的基础上一定要加上1MB。
至于第2个疑问手册上是这么说的
Not sure what this difference between the Extended and Configured numbers are, but they appear to be identical, as reported from the BIOS.
这句英文中的两个单词Extended和Configured已经在表5-4的“用途”列中出现了后面数字相同的为一组比如AX的用途为 Extended 1CX的用途为Configured 1AX和CX为一组BX和DX类同。
这句英文大概意思是不清楚Extended 和 Configured之间的区别但它们似乎是相同的bios就是这样说的。咱们这里暂时就不深究了毕竟咱们只是想拿到内存容量以后等咱们有精力了再深入学习吧。
此中断的调用步骤
1将AX寄存器写入0xE801。
2执行中断调用int 0x15。
3在CF位为0的情况下“返回后输出”中对应的寄存器便会有对应的结果.