一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存
咱们先介绍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寄存器,是典型的“值-结果”型参数,即调用方提供了两个变量做为被调用函数的参数,一个变量是缓冲区指针,另一个变量是缓冲区大小。被调用函数在缓冲区中写入数据后,将实际所写入的字节数记录到缓冲区大小变量中。
根据上表中的说明,此中断的调用步骤是:
- 填写好“调用前输入”中列出的寄存器。
- 执行中断调用int 0x15。
- 在CF位为0的情况下,“返回后输出”中对应的寄存器便会有对应的结果。
本内容摘自《操作系统真象还原》,请大家支持正版,多谢。
一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存相关推荐
- 一步步编写操作系统 32 linux内核获取内存容量的方法
操作系统是计算机硬件的管家,它不仅要知道自己的安装了哪些硬件,还得给出有效得当的管理措施,按照预定的一套管理策略使硬件资源得到合理的运用.但管理策略只是逻辑上的东西,是操作系统自圆其说的一套管理资源的 ...
- 一步步编写操作系统 34 内核利用bios中断获取物理内存大小
接上文,另一个获取内存容量的方法是bios 0x15中断的子功能0xE801. 此方法虽然简单,但功能也不强大,最大只能识别4G内存,不过这对咱们32位地址总线足够了.稍微有点不便的是,此方法检测到的 ...
- 一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74
一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法.咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量.如今我们要写一个打印函数了, ...
- 一步步编写操作系统 69 汇编语言和c语言共同协作 70
由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...
- 一步步编写操作系统 62 函数调用约定
由于我们要将c语言和汇编语言结合编程啦,所以一定会存在汇编代码和c代码相互调用的问题,有些事情还是要提前交待给大家的,本节就是要给大家说下函数调用规约中的那些事儿. 函数调用约定是什么? 调用约定,c ...
- C和指针之动态内存分配之(编写calloc函数,函数内部使用malloc函数来获取内存)
1.问题 编写calloc函数,函数内部使用malloc函数来获取内存 2.代码实现 #include <stdio.h> #include <stdli ...
- 一步步编写操作系统 08 bios跳转到神奇的内存地址0x7c00
为什么是0x7c00 计算机执行到这份上,bios也即将完成自己的历史使命了,完成之后,它又将睡去.想到这里,心中不免一丝忧伤,甚至有些许挽留它的想法.可是,这就是它的命,它生来被设计成这样,在它短暂 ...
- 一步步编写操作系统21 x86虚拟机bochs 跟踪bios
为了让大家更好的理解bios是怎样被执行的,也就是计算机中第一个软件是怎样开始的,咱们还是先看下图3-17.在图的上面第5行,显示的是下一条待执行的指令,这是程序计数器(PC)中的值,在x86上的程序 ...
- 一步步编写操作系统 09 写个mbr
有点不好意思了,说了好久,才说到实质性的东西,好了,赶紧给客官上菜. 代码2-1(c2/a/boot/mbr.S)1 ;主引导程序2 ;-------------------------------- ...
最新文章
- Python 安装selenium
- 盛大 牛人 blog
- ArcEngine编辑功能的实现(二)
- ABAP中的Table Control编程
- 干翻Java_Java第三次作业第一题
- 实现销售榜单下载功能
- CYYMysql 源码解读 3
- [USACO13FEB]Tractor【二分 + BFS】
- ValueError: Shapes () and (1, 1) are incompatible
- spss之数据处理(离散化)
- Linux【环境部署 02】yum源镜像下载+挂载镜像+本地yum源配置+局域网yum源服务搭建+局域网yum源使用(一篇学会离线yum源配置)
- 【008】基于vue.js的仿网易云web端(含源码答辩PPT、接口文档、运行教程)
- CSDN使用MD编辑器写博客如何让图片居中(调整图片位置大小)MD编辑器学习笔记
- android console服务,如何使能和关闭android设备上的console功能
- 闪讯 padavan 配置
- 使用DW设置网页背景图
- ZCMU-1919 kirito's 星爆气流斩(多重背包+二进制优化)
- Linux-DRBD
- Qt利用深度优先搜索实现迷宫寻宝
- sqlMap embedded=iSinta.Beiwo.Infrastructure.Mappers.Member.MemberAddress.xml, iSinta.Beiwo.Inf