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

本文详细介绍了BIOS中断0x15的0xE820子功能,该功能用于获取系统的内存布局信息。通过地址范围描述符ARDS,系统按内存类型返回信息,每个ARDS结构包含20字节,描述内存区域的属性和范围。调用中断时需要设置特定的参数,并在返回后检查结果。此过程对于理解32位环境下的内存管理至关重要。
摘要由CSDN通过智能技术生成
fa4c2201e5dfa9ce48d9eb9e4b39a1bc.png

咱们先介绍0xE820子功能,这是最灵活的内存获取方式。

bios中断 0x15的子功能0xE820能够获取系统的内存布局,由于系统内存各部分的类型属性不同,bios就按照类型属性来划分这片系统内存,所以这种查询则呈迭代式,每次bios只返回一种类型的内存信息,直到将所有内存类型返回完毕。子功能0xE820的强大之处是返回的内存信息较丰富,包括多个属性字段,所以需要一种格式结构来组织这些数据。内存信息的内容是用地址范围描述符来描述的,用于存储这种描述符的结构称之为地址范围描述符ARDS,Address Range Descriptor Structure。见格式见表

58ddfd5cd452c1c3dfd9c5c3a7afd4fe.png

此结构中的字段大小都是4字节,共5个字段,所以此结构大小为20字节。每次int 0x15之后,bios就返回这样一个结构的数据。注意,ARDS结构中是用64位宽度的属性来描述这段内存基地址(起始地址)及其长度,所以表中的基地址和长度都分为低32位和高32位两部分。

其中的Type字段是用来描述这段内存的类型,这里所谓的类型是说明这段内存的用途,是可以被操作系统使用,还是保留起来不能用。Type字段的具体意义见表

06ce39c74a1562982138090814162b08.png

为什么bios会按类型来返回内存信息呢?原因是这段内存可能是:

  • 系统的ROM。
  • ROM用到了这部分内存。
  • 设备内存映射到了这部分内存。
  • 由于某种原因,这段内存不适合标准设备使用。

由于我们是在32位环境下工作,所以在ARDS结构属性中,我们只用到低32位属性。BaseAddrLow+LengthLow是一片内存区域上限,单位是字节。正常情况下,不会出现较大的内存区域不可用的情况,除非安装的物理内存极其的小。这意味着,在所有返回的ARDS结构里,此值最大的内存块一定是操作系统可使用的部分,即主板上配置的物理内存容量。

bios中断只是一段函数例程,调用它就要为其提供参数,现在介绍下bios中断0x15的0xe820子功能需要哪些参数。

先介绍下此中断例程的调用方法。下表是使用此中断的方法,分输入和输出两部分。

0330202d0968c95d4d539d9beaca18e5.png

表中的ECX寄存器和ES:DI寄存器,是典型的“值-结果”型参数,即调用方提供了两个变量做为被调用函数的参数,一个变量是缓冲区指针,另一个变量是缓冲区大小。被调用函数在缓冲区中写入数据后,将实际所写入的字节数记录到缓冲区大小变量中。

根据上表中的说明,此中断的调用步骤是:

  1. 填写好“调用前输入”中列出的寄存器。
  2. 执行中断调用int 0x15。
  3. 在CF位为0的情况下,“返回后输出”中对应的寄存器便会有对应的结果。

本内容摘自《操作系统真象还原》,请大家支持正版,多谢。

bd113fcff8553e99e95f52c0d51232ef.png

【再续】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值