oracle获取缓冲区的大小怎么换算成mb_一步步编写操作系统 34 内核利用bios中断获取物理内存大小...

通过BIOS中断0x15的子功能0xE801可以获取物理内存大小,但在15MB以下和16MB以上分别用不同单位记录。该方法在检测到的内存大小上会比实际内存少1MB,这1MB是由于历史遗留的内存空洞。AX和CX记录15MB以下内存,BX和DX记录16MB以上内存,其值相等。要得到完整内存大小,需在检测值基础上加1MB。
摘要由CSDN通过智能技术生成
0b45d4c859a947c9998ac84c2146dbf9.png

接上文,另一个获取内存容量的方法是bios 0x15中断的子功能0xE801。

此方法虽然简单,但功能也不强大,最大只能识别4G内存,不过这对咱们32位地址总线足够了。稍微有点不便的是,此方法检测到的内存是分别存放到两组寄存器中的。低于15MB的内存是以1KB为单位大小来记录,单位数量在寄存器AX和CX中记录,其中AX和CX的值是一样的,所以在15MB空间以下的实际内存容量=AX*1024。AX、CX最大值为0x3c00,即0x3c00*1024=15MB。16MB~4GB是以64KB为单位大小来记录,单位数量在寄存器BX和DX中记录,其中BX和DX的值是一样的,所以16MB以上空间的内存实际大小=BX*64*1024,不用在意BX和DX最大值是多少,前面说过啦,只支持4G空间,您可以反推一下看看。

咱们还是列个表,将其用法分为输入、输出两部分介绍。

501b760f2f15b829f8ecb65509de1fbd.png

再次提醒,中断返回后,AX和CX中,其值的单位是1KB,而BX和DX的单位是64KB。

当初我看到这儿的时候,脑子中不禁弹出了两个问号:

1 为什么要分“前15MB”和“16MB以上”这两部分来展示4GB内存?

2 为什么寄存器结果是重复的?如寄存器AX和CX相等,BX和DX相等?

为了解决第1个问题,让我们实际测试下,让事实说话。测试方法是修改bochs配置文件bochsrc.disk中的内存容量参数megs,然后执行bios中断。测试结果见表

993f22ccf67b15db1a56c26f64ca61ff.png

表中“实际物理内存”和“检测到的内存大小”,它们之间总是差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服务。现在来回答这个问题。

如果检测到的内存容量大于等于16MB,bios 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 1,CX的用途为Configured 1,AX和CX为一组,BX和DX类同。

这句英文大概意思是:不清楚"Extended" 和 "Configured"之间的区别,但它们似乎是相同的,bios就是这样说的。咱们这里暂时就不深究了,毕竟咱们只是想拿到内存容量,以后等咱们有精力了再深入学习吧。

此中断的调用步骤:

1将AX寄存器写入0xE801。

2执行中断调用int 0x15。

3在CF位为0的情况下,“返回后输出”中对应的寄存器便会有对应的结果.

【再续】

功能06H 功能描述:设置闹钟 入口参数:AH=06H CH=BCD码格式的小时 CL=BCD码格式的分钟 DH=BCD码格式的秒 出口参数:CF=0——操作功,否则,闹钟已设置或时钟已停止 (8)、功能07H 功能描述:闹钟复位 入口参数:AH=07H 出口参数:无 (9)、功能0AH 功能描述:读取天数计数,仅在PS/2有效,在此从略 (10)、功能0BH 功能描述:设置天数计数,仅在PS/2有效,在此从略 (11)、功能80H 功能描述:设置声音源信息 入口参数:AH=80H AL=声音源 =00H——8253可编程计时器,通道2 =01H——盒式磁带输入 =02H——I/O通道上的"Audio In" =03H——声音产生芯片 出口参数:无 8、直接系统服务(Direct System Service) INT 00H —“0”作除数 INT 01H —单步中断 INT 02H —非屏蔽中断(NMI) INT 03H —断点中断 INT 04H —算术溢出错误 INT 05H —打印屏幕和BOUND越界 INT 06H —非法指令错误 INT 07H —处理器扩展无效 INT 08H —时钟中断 INT 09H —键盘输入 INT 0BH —通信口(COM2:) INT 0CH —通信口(COM1:) INT 0EH —磁盘驱动器输入/输出 INT 11H —读取设备配置 INT 12H —读取常规内存大小(返回值AX为内存容量,以K为单位) INT 18H —ROM BASIC INT 19H —重启动系统 INT 1BH —CTRL+BREAK处理程序 INT 1CH —用户时钟服务 INT 1DH —指向显示器参数表指针 INT 1EH —指向磁盘驱动器参数表指针 INT 1FH —指向图形字符模式表指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值