接上文,另一个获取内存容量的方法是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空间,您可以反推一下看看。

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

再次提醒,中断返回后,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服务。现在来回答这个问题。

如果检测到的内存容量大于等于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的情况下,“返回后输出”中对应的寄存器便会有对应的结果.

一步步编写操作系统 34 内核利用bios中断获取物理内存大小相关推荐

  1. 一步步编写操作系统 07 开机启动bios

    bios是如何苏醒的 bios其实一直睡在某个地方,直到被唤醒--前面热火朝天的说了bios的功能和内存布局,似乎还没说到正题上,bios是如何启动的呢.因为bios是计算机上第一个运行的软件,所以它 ...

  2. 一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

    一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法.咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量.如今我们要写一个打印函数了, ...

  3. 一步步编写操作系统 69 汇编语言和c语言共同协作 70

    由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...

  4. 一步步编写操作系统 62 函数调用约定

    由于我们要将c语言和汇编语言结合编程啦,所以一定会存在汇编代码和c代码相互调用的问题,有些事情还是要提前交待给大家的,本节就是要给大家说下函数调用规约中的那些事儿. 函数调用约定是什么? 调用约定,c ...

  5. 一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存

    咱们先介绍0xE820子功能,这是最灵活的内存获取方式. bios中断 0x15的子功能0xE820能够获取系统的内存布局,由于系统内存各部分的类型属性不同,bios就按照类型属性来划分这片系统内存, ...

  6. 一步步编写操作系统 32 linux内核获取内存容量的方法

    操作系统是计算机硬件的管家,它不仅要知道自己的安装了哪些硬件,还得给出有效得当的管理措施,按照预定的一套管理策略使硬件资源得到合理的运用.但管理策略只是逻辑上的东西,是操作系统自圆其说的一套管理资源的 ...

  7. 一步步编写操作系统 08 bios跳转到神奇的内存地址0x7c00

    为什么是0x7c00 计算机执行到这份上,bios也即将完成自己的历史使命了,完成之后,它又将睡去.想到这里,心中不免一丝忧伤,甚至有些许挽留它的想法.可是,这就是它的命,它生来被设计成这样,在它短暂 ...

  8. 一步步编写操作系统 66 浅析c库函数与系统调用1

    本来说好的接下来的工作是要去"丰满"我们的内核,可咱们这种一步一回头的学习方式还得继续啊.其实我了解大家急切写内核的心情,但本书<操作系统真象还原>(请大家支持正版)的 ...

  9. 一步步编写操作系统 53 任务状态段TSS介绍

    操作系统是利用PCB来维护所有任务的,包括进程和线程,但cpu提供的是TSS,linux系统可没用它,因为效率太低.但是还是要了解下TSS才清楚操作系统中某些操作的原因. 本节中所讲的特权级与它有着密 ...

最新文章

  1. 优化你的CPU来做深度学习
  2. AI对人类社会的真正威胁
  3. 看懂GE Predix ,就看懂了工业互联网
  4. 关于“我的边栏,我做主”——Windows Vista Gadgets大赛报名
  5. AJP认证信息爆破ajp_brute
  6. torch转caffe
  7. PMcaff O2O 产品峰会:行业最强干货,BAT总监级最佳实战 | 火热报名
  8. 聊聊分布式锁——Redis和Redisson的方式
  9. 修改系统UIAlertAction的按钮颜色
  10. [转载]从零开始学习jQuery (一) 开天辟地入门篇
  11. 【TensorFlow-windows】keras接口——BatchNorm和ResNet
  12. Java中TreeMap和TreeSet的底层实现
  13. 脚本自启动oracle,自动启动和关闭Oracle 脚本
  14. API 层实现语音录制
  15. Go并发编程里的数据竞争以及解决之道
  16. csgo手机上看demo_csgo看demo所有指令 怎么看demo所有指令呢?
  17. PotPlayer中开启SVP4补帧效果
  18. 联想重装系统去掉保护_解决联想硬盘保护系统忘记密码问题,重新安装Windows10系统...
  19. Unknown host 'dl.google.com'. You may need to adjust the proxy settings in Gradle.
  20. 利用python爬取教务系统中成绩

热门文章

  1. 用JavaScript语言判断一个三位数是否为水仙花数
  2. MyEclipse移动开发教程:迁移HTML5移动项目到PhoneGap(二)
  3. 工具资源 Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
  4. 应用市场中包名(package name)的唯一性
  5. 上周热点回顾(6.17-6.23)
  6. DecExpress 帮助网站
  7. [剑指offer]面试题第[49]题[Leetcode][第264题][JAVA][丑数][动态规划][堆]
  8. [剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]
  9. CodeForces 895 B. XK Segments 二分查找
  10. 分页的limit_20.MySQL中的LIMIT(分页)