(
)操作系统必须知道系统物理内存的数量,才能够有效的使用和管理这些物理内存。所以在booting阶段,我们必须通过某种手段来检测和获取物理内存的总量。
获取物理内存容量的方法主要分为两大类:一类是通过BIOS软中断方式获取,另一类是通过读取北桥芯片内存控制器相关寄存器获取。
第一类方法的优点是历史悠久,自80286以来,绝大多数IBM PC兼容机都提供这一功能,现在的Windows和linux也是通过这一类方法在启动阶段获取物理内存容量,另外由于这种方法是通过对内存的遍历来获取内存容量的,因此一些内存检测工具也是通过这类方法对内存进行检测。但是,这类方法在检测大容量内存时,若只需要物理内存总容量信息,则效率低于第二类方法。
第二类方法与第一类方法本质的区别在于这种方法使用硬件方法实现物理内存容量的获取,因此速度较快。但是这种方法仅能获取物理内存容量,不包括对内存的检测。
第一类方法包括三种具体做法,这三种做法都是基于BIOS INT15h中断(在PC和XT机上是BIOS磁带I/O功能调用。在AT机上是AT扩充服务功能调用),它们的名称依此为88h,E801h,E820h。其中,88h方法是在Intel80286出现的那天起就存在的,后续的PC及其兼容机为了保持向下兼容,都继续保留了这种方法。因此,这种方法在所有的IBMPC及其兼容机上都存在。但事实上,这种方法存在一个重要的缺陷,由于这种方法是在16bit时代就存在的,所以,它通过16bit寄存器来保存内存容量作为返回值。但16bit所能够表示的最大值是64KB。由于这种方法的返回值是以KB为单位,所以它能够表示的系统最大物理内存容量为64 MB。而对于今天的PC机来说,64MB已经是很低的内存配置了,大多数PC机的实际物理内存配置都大于64 MB。另外,需要注意的是,由于这种方法出现于Intel80286时代,而80286的24bit地址总线能够访问的最大地址为16MB,所以,尽管这种方法使用16bit寄存器能够表示的最大内存数量为64MB,但标准的BIOS只允许通过这种方法获取最大16MB的物理内存数量。
为了能够获取大于64MB的内存,就必须通过另外两种方法的一种。但并非每一台PC机都实现了这两种方法或这两种方法之一。对于绝大多数现代PC机来说,至少提供了这两种方法的一种;而对于过去的PC机,又很少有超过64MB的配置。从这个意义上来说,这已经足够了。
1.Int 15/AX=E820h是用来获取系统中的内存映地址描述符的,操作系统常用来获取内存大小。
PS:内存(Memory)可以是我们平时所说的在主板上的内存条,我们称作Base Memory,也可以是毗边Base Memory 的并作为普通内存扩展的内存。
相关的数据结构:
地址范围描述符结构
Offset |