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

操作系统是计算机硬件的管家,它不仅要知道自己的安装了哪些硬件,还得给出有效得当的管理措施,按照预定的一套管理策略使硬件资源得到合理的运用。但管理策略只是逻辑上的东西,是操作系统自圆其说的一套管理资源的方法,管理再漂亮,没有硬件支撑也无能为力,真正干活的都是底层。

保护模式最“大”的特点就是寻址空间“大”,在进入保护模式之后,我们将接触到虚拟内存、内存管理等。但这些和内存有关的概念都是建立在物理内存之上,无论理论概念说的多高大上,最终也要在物理内存上落实行动。为了在后期做好内存管理工作,咱们先得知道自己有多少物理内存才行。

在linux中有多种方法获取内存容量,如果一种方法失败,就会试用其它方法。比如在linux 2.6内核中,是用detect_memory函数来获取内存容量的。其函数在本质上是通过调用bios中断0x15实现的,分别是bios 中断0x15的3个子功能,子功能号要存放到寄存器EAX或AX中,如下:

  • EAX=0xE820:遍历主机上全部内存。
  • AX=0xE801: 分别检测低15MB和16M~4GB之间的内存,最大支持4GB。
  • AH=0x88:最多检测出64MB内存,实际内存超过此容量也按照64MB返回。

bios中断是实模式下的方法,只能在进入保护模式前调用。咱们效仿linux“不弃不舍”的精神,在实模式下也用这三种方法检测完内存容量后再进入保护模式。如果一种方法获取失败,尝试另一种方法,若三种方法都失败了,由于无法获取内存信息,后续程序无法加载,只好将机器挂起,停止运行。

bios中断可以返回已安装的硬件信息,由于bios及其中断也只是一组软件,它要访问硬件也要依靠硬件提供的接口,所以,获取内存信息,其内部是通过连续调用硬件的API(Application Program Interface,应用程序接口)来获取内存信息的。另外,由于每次调用bios中断都是有一定的代价的(比如至少要将程序的上下文保护起来以便从中断返回时可以回到原点继续向下执行),所以尽量在一次中断中返回足量的信息,由用户程序自己挑出重点内容。下面介绍的中断便是这方面的典范。

bios 0x15中断提供了丰富的功能,具体要调用的功能,需要在寄存器ax中指定。其中0xE8xx系列的子功能较为强大,0x15中断的子功能0xE820和0xE801都可以用来获取内存,区别是0xE820返回的是内存布局,信息量相对多一些,操作也相对复杂。而0xE801直接返回的是内存容量,操作适中,不繁不简。上面还提到了子功能0x88也能获取内存容量,这是最简单的用法,不过操作越简单,功能也就越薄弱。话说linux中的dmesg命令就与0xE820相关,可见其功能是很大的,之后就按照功能强弱的顺序逐一介绍用法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值