手写操作系统--完善内核加载器之内存检测

news2024/12/23 22:51:55

这一篇我们来完善内核加载器的功能,我们知道内存是很重要的区域,我们需要对内存有个大致的描述,哪些可用,那些不可用,内存有多大。因此在内核加载器中我们需要对内存进行检测。内存检测的方法翻译文档如下:

到目前为止,检测PC内存的最佳方式是使用INT 0x15,EAX = 0xE820命令。这个功能在2002年以后构建的所有PC上都可用,在那之前的大多数现有PC上也可用。它是唯一能够检测4G以上内存区域的BIOS功能,被设计为终极内存检测功能。

实际上,这个功能返回一个未排序的列表,可能包含未使用的条目,并且(在罕见/不稳定的情况下)可能返回重叠的区域。每个列表条目存储在ES:DI指定的内存中,并且DI不会自动递增。条目的格式是两个uint64_t和一个uint32_t(在20字节版本中),加上24字节的ACPI 3.0版本中的一个额外的uint32_t。最好始终将列表条目存储为24字节的数量-这样可以保持uint64_t的对齐(至少保持uint64_t的对齐)。在每次调用之前,确保将最后一个uint64_t设置为1,以使你的映射与ACPI兼容。

第一个uint64_t = 基地址

第二个uint64_t = "区域"的长度(如果该值为0,则忽略该条目)

接下来的uint32_t = 区域的 "类型"

类型1:可用(正常)RAM 类型

2:保留-不可用

类型3:ACPI可回收内存

类型4:ACPI NVS内存

类型5:包含错误内存的区域 接下来的uint32_t = ACPI 3.0扩展属性位字段(如果返回的是24字节而不是20字节)

扩展属性的第0位指示是否应该忽略整个条目(如果该位被清除)。这将是一个巨大的兼容性问题,因为大多数当前的操作系统不会读取这个位,并且不会忽略该条目。 扩展属性的第1位指示该条目是否是非易失性的(如果该位被设置)或不是。标准规定,“报告为非易失性的内存可能需要进行表征,以确定其作为传统RAM的适用性。” 扩展属性的其余30位目前未定义。 基本用法: 对于第一次调用该函数,将ES:DI指向列表的目标缓冲区。清除EBX。将EDX设置为魔术数字0x534D4150。将EAX设置为0xE820(注意EAX的高16位应设置为0)。将ECX设置为24。进行INT 0x15。

如果第一次调用函数成功,EAX将设置为0x534D4150,并且Carry标志将被清除。EBX将被设置为某个非零值,必须保留以供下一次调用函数时使用。CL将包含实际存储在ES:DI处的字节数(可能为20)。

对于后续的函数调用:通过增加DI来逐个处理列表条目的大小,将EAX重置为0xE820,并将ECX重置为24。当达到列表末尾时,EBX可能重置为0。如果使用EBX = 0再次调用函数,列表将重新开始。如果EBX没有重置为0,在尝试访问最后一个有效条目之后,函数将返回设置了Carry标志。

注意: 在获取列表之后,可能希望对列表进行排序,合并相邻的相同类型范围,将任何重叠的区域更改为最严格的类型,并将任何无法识别的 "类型 "值更改为类型2。 ACPI可回收内存(类型3)区域可以像正常的 "可用RAM"区域一样使用(并与之合并),只要你在那里存储ACPI表后已经完成使用(即可 "回收")。 类型2、类型4、类型5(保留、ACPI非易失性、错误)标记了在分配物理内存时应避免的区域。 将未列出的区域视为类型2-保留。 你的代码必须能够处理不以任何 "页面边界 "开始或结束的区域。 Bochs中调用INT 15h,EAX = E820的典型输出:

 基本知识有了,下面我们用int 0x15来实现下内存检测。

代码完善后在内存检测开始前下了断点,效果图是这样的,首先看到内存中内核加载器的内容,在内核加载器下面是清一色的0

 紧接着执行完内存检测,我们看到原本清一色的内存区域有了数字。

 我们输出一下看看是什么:

此时我们添加了一个show功能展示,首先是成功进行了内存检测

 我们看寄存器:

 首先eax表示基地址=0,ebx表示界限=9f000,edx=1表示类型,1表示可用的。

接下来是基地址从9f000开始 界限=1000 类型为2 表示 保留不可用

接下来是从e8000开始 界限=18000 类型依然为2 保留不可用

 

最后一个是从1M开始也就是实模式结束到保护模式开始32M,类型为1 表示可用

因为我们设定的硬盘大小就是32M 

 最后内核加载器内存检测的代码如下:

[org 0x1000]

dw 0x55aa

mov si,loading
call print1
xchg bx,bx

detect_memory:
    xor ebx,ebx
    ;es:di 结构体缓存的位置
    mov ax,0
    mov es,ax
    mov edi,ards_buffer
    ;固定签名
    mov edx,0x534d4150

.next:
    ;子功能号
    mov eax,0xe820
    ;ards 结构体大小
    mov ecx,20

    int 0x15
    ;CF=1 表示发生错误
    jc error

    add di,cx
    ;结构体数量加一
    inc word [ards_count]

    cmp ebx,0
    jnz .next

    mov si,detecting
    call print1
    xchg bx,bx

    mov ecx,[ards_count]
    mov si,0
.show:
    mov eax, [ards_buffer+si]
    mov ebx, [ards_buffer+si+8]
    mov edx, [ards_buffer+si+16]
    add si, 20
    xchg bx,bx
    loop .show


jmp $

print1:
    mov ah, 0x0e
.next:
    mov al, [si]
    cmp al, 0
    jz .done
    int 0x10
    inc si
    jmp .next
.done:
    ret

loading:
    db "os loading success", 10, 13, 0; \n\r
detecting:
    db "Detecting Memory Success...",10,13,0

error:
    mov si, .msg
    call print1
    hlt; 让 CPU 停止
    jmp $
    .msg db "Loading Error!!!", 10, 13, 0

ards_count:
    dw 0
ards_buffer:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/723618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DAY39:贪心算法(八)无重叠区间+划分字母区间+合并区间

文章目录 435.无重叠区间思路完整版注意点 右区间排序 763.划分字母区间思路完整版如何确定区间分界线debug测试时间复杂度 总结 56.合并区间思路最开始的写法:直接在原数组上修改debug测试 修改版时间复杂度总结 435.无重叠区间 给定一个区间的集合 intervals &am…

“钓鱼”网站也有https?如何一招识破?

作为企业网站安全建设的基础设施, SSL证书可以对数据进行加密传输,保护数据在传输过程中不被监听、截取和篡改,因此部署了SSL证书的网站会比传统的http协议更加安全,也更受主流操作系统和浏览器的信任。 然而随着SSL证书的普及&a…

AI做PPT,五分钟搞定别人一天的量,最喜欢卷PPT了

用AI做PPT 主题生成大纲制作PPT 主题生成大纲 如何使用人工智能工具,如ChatGPT和mindshow,快速生成PPT。 gpt国内版 制作PPT,你可能只有一个主题,但没有明确的提纲或思路。 问gpt:计算机视觉的周工作汇报。我这周学…

MyBatis 与 Hibernate 有哪些不同?

ORM框架的选择与适用场景 MyBatis和Hibernate都是Java领域中流行的面向关系型数据库的ORM(对象关系映射)框架。它们的共同目标是简化开发人员操作数据库的工作,提供便捷的持久化操作。然而,两者在设计理念和适用场景上有所不同。…

Zabbix6.0 的部署

目录 一、概述 二、 zabbix 1.zabbix简介 2.zabbix监控原理 3. Zabbix 6.0 新特性 3.1Zabbix server高可用防止硬件故障或计划维护期的停机 3.2 Zabbix 6.0 LTS新增Kubernetes监控功能,可以在Kubernetes系统从多个维度采集指标 4. Zabbix 6.0 功能组件 4.1Z…

浏览器内核的介绍

文章目录 1、什么是浏览器内核2、常用浏览器内核3、浏览器内核分类3. 1、Trident3.2、Gecko3.3、Webkit3.4、Chromium3.5、Presto3.6、国内主流浏览器 4、五大主流浏览器(诞生顺序)4.1、IE(Internet Explorer)浏览器4.2、Opera浏览…

解决vue3中使用个别form表单校验失灵

当我点击校验时 其他都有触发校验 唯独radio没有触发,绑定都没有问题 看一下代码 const data reactive({form: {},rules: {serverStatus: [{ required: true, message: "服务状态不能为空", trigger: change }],tenantName: [{ required: true, messag…

hypef 五、请求及响应

文档地址 Hyperf https://hyperf.wiki/2.0/#/zh-cn/response 一、请求 1.1 安装 composer require hyperf/http-message 框架自带不用手动安装。 1.2 请求对象 在 onRequest 生命周期内可获得Hyperf\HttpServer\Request对象。 可以通过以来注入和路由对应参数获取。 de…

我的创作纪念日 --- 简单记录

理想并不是一种空虚的东西,也并不玄奇;它既非幻想,更非野心,而是一种追求善美的意识。 机缘 大家好,今天是我成为创作者的第256天,也是我在CSDN上发布的第81篇文章。在这里,我想和大家简单记…

C#(五十五)之线程死锁

死锁是指多个线程共享资源是&#xff0c;都占用同意部分资源&#xff0c;而且都在等待对方师范另一部分资源&#xff0c;从而导致程序停滞不前的情况 示例&#xff1a; /// <summary>/// 定义一个刀/// </summary>public static object knife new object();/// …

git install报错问题

报错如下&#xff1a; fatal: unable to connect to githurb.com: 运行如下命令即可&#xff1a; git config --global url.https://github.com/.insteadOf git://github.com/ git config --global url."https://".insteadOf git://接着再删除node_moudels包&…

Spring Boot 操作 Redis 的各种实现

一、Jedis,Redisson,Lettuce三者的区别 共同点&#xff1a;都提供了基于Redis操作的Java API&#xff0c;只是封装程度&#xff0c;具体实现稍有不同。 不同点&#xff1a; 1.1、Jedis 是Redis的Java实现的客户端。支持基本的数据类型如&#xff1a;String、Hash、List、Se…

卡尔曼滤波实例分析(二)

1 问题 假设一物体以一初速度 v 0 v_0 v0​位于一高度为 y 0 y_0 y0​处正处于匀速下降状态&#xff0c;此时该物体启动制动装置&#xff0c;以一个加速度为 a a a的作用力反向运动 &#xff08;1&#xff09;建模 速度&#xff1a; V V 0 − a ∗ t V V_0 - a*t VV0​−a∗…

API6中JS UI实现富文本组件居右显示

【关键字】 RichText、富文本组件、API6、JS UI、居右显示 【关键代码如下】 index.hml <div class"container"><text>文本行高</text><text>文本行高</text><text>文本行高</text><text>文本行高</text>&…

SciencePub学术 | 计算机与生物信息类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 计算机与生物信息类重点SCIE&EI征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 计算机与生物信息类重点SCIE&EI 【期刊简介】IF&#xff1a;7.5-8.0&#xff0c;JCR1区&#xff0c;中科院1区TOP&…

vscode设置自己用的注释格式

ctrlshiftP 打开设置 输入snippets&#xff0c;选择配置用户代码片段[Snippets: Configure User Snippets]输入JavaScript&#xff0c;选择JavaScript.json 把这段代码替换进去 "Print to jsNoteTitle": {"prefix": "jsNoteTitle","body&q…

阿里云国际站:阿里云还值得我们期待吗?

阿里云还值得我们期待吗&#xff1f;   "阿里云&#xff0c;还可以继续期待吗&#xff1f;"这是一个近期在各大行业论坛和科技洪流之中频繁引发热议的问题。然而&#xff0c;深究其实质&#xff0c;答案不言自明——无须怀疑&#xff0c;阿里云绝对值得我们赋予期待…

MTK日志路径——aosp\device\mediatek\common\mtklog

这里写目录标题 device\mediatek\common\mtklog1.mtklog-config-basic-eng.prop2.mtklog-config-basic-user.prop3.mtklog-config-bsp-eng.prop4.mtklog-config-bsp-user.prop device\mediatek\common\mtklog 在安卓源码中&#xff0c;device\mediatek\common\mtklog目录包含了…

解决node+mysql不能保存emoji表情包的问题

效果图 1.前端 2.数据库 实现 Emoji表情是4个字节&#xff0c;而mysql的utf8编码最多3个字节&#xff0c;所以数据插不进去&#xff0c;而utfmb64是支持四个字节的。所以需要将mysql编码从utf8转换成utf8mb4&#xff0c;从【数据库、表、相应字段】都需要修改为utf8mb4&…

Flask+Vue+小程序电商生态系统

完整资料进入【数字空间】查看——baidu搜索"writebug" 本项目为FlaskVue小程序全栈开源电商生态系统。本项目使用的技术有&#xff1a;前端&#xff1a;VueIviewWxxcx&#xff1b;后端&#xff1a;FlaskMysql&#xff1b;部署&#xff1a;NginxGunicorn。该项目包含…