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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

  2. 一步步编写操作系统 34 内核利用bios中断获取物理内存大小

    接上文,另一个获取内存容量的方法是bios 0x15中断的子功能0xE801. 此方法虽然简单,但功能也不强大,最大只能识别4G内存,不过这对咱们32位地址总线足够了.稍微有点不便的是,此方法检测到的 ...

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

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

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

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

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

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

  6. C和指针之动态内存分配之(编写calloc函数,函数内部使用malloc函数来获取内存)

    1.问题 编写calloc函数,函数内部使用malloc函数来获取内存               2.代码实现 #include <stdio.h> #include <stdli ...

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

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

  8. 一步步编写操作系统21 x86虚拟机bochs 跟踪bios

    为了让大家更好的理解bios是怎样被执行的,也就是计算机中第一个软件是怎样开始的,咱们还是先看下图3-17.在图的上面第5行,显示的是下一条待执行的指令,这是程序计数器(PC)中的值,在x86上的程序 ...

  9. 一步步编写操作系统 09 写个mbr

    有点不好意思了,说了好久,才说到实质性的东西,好了,赶紧给客官上菜. 代码2-1(c2/a/boot/mbr.S)1 ;主引导程序2 ;-------------------------------- ...

最新文章

  1. Python 安装selenium
  2. 盛大 牛人 blog
  3. ArcEngine编辑功能的实现(二)
  4. ABAP中的Table Control编程
  5. 干翻Java_Java第三次作业第一题
  6. 实现销售榜单下载功能
  7. CYYMysql 源码解读 3
  8. [USACO13FEB]Tractor【二分 + BFS】
  9. ValueError: Shapes () and (1, 1) are incompatible
  10. spss之数据处理(离散化)
  11. Linux【环境部署 02】yum源镜像下载+挂载镜像+本地yum源配置+局域网yum源服务搭建+局域网yum源使用(一篇学会离线yum源配置)
  12. 【008】基于vue.js的仿网易云web端(含源码答辩PPT、接口文档、运行教程)
  13. CSDN使用MD编辑器写博客如何让图片居中(调整图片位置大小)MD编辑器学习笔记
  14. android console服务,如何使能和关闭android设备上的console功能
  15. 闪讯 padavan 配置
  16. 使用DW设置网页背景图
  17. ZCMU-1919 kirito's 星爆气流斩(多重背包+二进制优化)
  18. Linux-DRBD
  19. Qt利用深度优先搜索实现迷宫寻宝
  20. sqlMap embedded=iSinta.Beiwo.Infrastructure.Mappers.Member.MemberAddress.xml, iSinta.Beiwo.Inf

热门文章

  1. 【转】Yelp是如何实现每天运行数百万个测试的
  2. JavaScript原生对象及扩展
  3. VS Code 使用小技巧
  4. IT英语2-编程词汇编程英语词汇
  5. SQL嵌套语句执行顺序
  6. 磁盘 I/O 性能监控指标和调优方法
  7. POJ 2299 - Ultra-QuickSort BIT
  8. java监听器原理_java监听器原理
  9. python条件表达式三门课至少有一门及格_Python/ MySQL练习题(一)
  10. java快速排序直观演示代码,排序算法总结(含动图演示和Java代码实现)