首页 > 系统相关 >02-2 【编写loader工程内容】检测内存容量

02-2 【编写loader工程内容】检测内存容量

时间:2024-07-24 18:29:04浏览次数:16  
标签:02 info region boot loader 内存 entry uint32 内存容量



方法:利用BIOS中断来检测内存容量,具体是BIOS INT 0x15(或INT 15H)


具体使用方法:

参考文档链接:https://wiki.osdev.org/Detecting_Memory_(x86)



实操



(1)首先定义一个结构体



因为内存是分成好多块的,有一些是已经被硬件占用了:

因此检测内存返回的结构体应该是个结构体数组


boot_info.h

#ifndef BOOT_INFO_H
#define BOOT_INFO_H

#include "types.h"  //是一个包含基础数据类型的头文件

#define BOOT_RAM_REGION_MAX 10

    typedef struct _boot_info_t{
        
        struct{
            uint32_t start;  //起始地址
            uint32_t size; //内存块大小

        }ran_region_cfg[BOOT_RAM_REGION_MAX]; //"cfg" 是 "configuration" 的缩写,表示配置或配置信息
        
        int ram_region_count;//用于保存这个数组里面有多少个内存块是可使用的内存块


    }boot_info_t;

#endif

types.h

#ifndef TYPES_H
#define TYPES_H

typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t; //uint32_t定义为一种数据类型,表示32位整型

#endif


再把这两个头文件都加到loader.h里头



(2)编写检测内存容量功能的函数

  • 在loader.h里定义一个结构体,用于接收内存块的信息
//定义一个结构体,用于接收内存信息
typedef struct SMAP_entry{
    uint32_t BaseL;
    uint32_t BaseH;
    uint32_t LengthL;
    uint32_t LengthH;
    uint32_t Type; //值为1时,表示该内存块是可用的有效的
    uint32_t ACPI;  

}__attribute__((packed)) SMAP_entry_t;


  • 在loader_16.c里面编写检测内存的函数
static void detect_memory(){

    uint32_t contID=0;
    uint32_t signature,bytes;
    SMAP_entry_t smap_entry;
    show_msg("try to detect memory:\n\r");
    boot_info.ram_region_count=0;
    for(int i=0;i<BOOT_RAM_REGION_MAX;i++){

        SMAP_entry_t *entry=&smap_entry;
        __asm__ __volatile__(
            "int $0x15"
            : "=a"(signature),"=c"(bytes),"=b"(contID)
            : "a"(0xE820),"b"(contID),"c"(24),"d"(0x534D4150),"D"(entry)
        );
           
            if (signature != 0x534D4150){
                show_msg("Failed\n\r");
                return;
            }

            if(bytes>20 &&(entry->ACPI & 0X0001)==0){
                continue;
            }
            if (entry->Type ==1){
               boot_info.ram_region_cfg[boot_info.ram_region_count].start=entry->BaseL;
               boot_info.ram_region_cfg[boot_info.ram_region_count].size=entry->LengthL;
               boot_info.ram_region_count++;
            }

            if(contID==0){
                break;
            }                 
    }
    show_msg("ok.\n\r");
}



(3)调试运行

结果:

一共有两块可供OS使用的内存块:





标签:02,info,region,boot,loader,内存,entry,uint32,内存容量
From: https://www.cnblogs.com/kakafa/p/18321462

相关文章

  • 打卡信奥刷题(417)用Scratch图形化工具信奥P10416[普及组/提高] [蓝桥杯 2023 国 A] XYZ
    [蓝桥杯2023国A]XYZ题目描述给定一个区间[L,R][L,R]......
  • 2024年全国职业院校(中职组)技能大赛(ZZ052大数据应用与服务)持续更新中!
    2024年职业院校中职组ZZ052大数据应用与服务赛项赛题第01套【子任务一:基础环境准备】##模块一:平台搭建与运维(一)任务一:大数据平台搭建本模块需要使用root用户完成相关配置;所有组件均在/root/software目录下。1.子任务一:基础环境准备master、slave1、slave2......
  • [题解]P9755 [CSP-S 2023] 种树
    P9755[CSP-S2023]种树迟来的补题本题是让最小化所有树长到指定高度日期的最大值,于是想到二分答案。那么,对于一个给定的期限\(x\),如何判断是否能在这个日期内完成任务呢?首先我们发现前\(n\)天每天都要种树,那么假设我们已经知道了每个地块最晚哪个日期种树,能保证在期限\(x\)......
  • 20240724【省选】模拟
    挂了四分,掉了一名,不过这也说明我的实力就只有这点,根本不够,果然以后还是直接【数据删除】得了。T1其实就是个树剖,每个点维护左右子树的最大深度以及左右子树内的最大答案,然后就…………没了?淦,也是实现问题,应该想到的。然后就是修改边权是改成\(w-a_p\),\(a_i\)是记录下来的\(i......
  • DASCTF 2023 & 0X401七月暑期挑战赛【PWN】(VIPhouse篇)
    DASCTF2023&0X401七月暑期挑战赛【PWN】(VIPhouse篇)题目保护情况没有开pie保护,延迟绑定机制64位ida逆向给了一些功能函数1.loginin输入密码的时候会溢出,同时判断输入的name,和passwd同时有两个标志位,如果是admin,多一个标志位2.canary功能前提是admin才能进行输出ca......
  • 学习pcie—20240724
    因为前一段时间看了xdma的IP核手册,发现只看xdma看不太懂,不清楚pcie的传输的流程,不了解报文格式,所以看看pcie手册,主要关注发送接收时序首先是pcieIP核与xdmaIP核的区别:IntegratedBlockforPCIExpress:7SeriesIntegratedBlockforPCIExpress是最基础的PCIeIP,实现的是......
  • 如何使用 instaloader 下载特定数量的照片(而不是整个帖子)
    我正在使用名为instaloader的Instagramapi。我正在尝试从数组中的每个配置文件下载25张图片。我尝试使用get_postsforpostinprofile.get_posts():#downloadpostsL.download_post(post,target=data_path/p_name)但这会下载图片以及所有评论和元......
  • VS2022 安装.NET4.5目标包
    转载自https://www.cnblogs.com/Stay627/p/15549958.html[VS2022安装.NET4.5目标包]众所周知VS2022将不再支持.NET4.5,即使在VisualStudioInstaller中也找不到.NET4.5的选项在不改变项目结构的情况下,要么选择继续使用VS2019,当然博主已经卸掉了,那么还有什么方法呢?我们可以......
  • PySide 的 QUiLoader 不显示小部件
    我在Designer中开发了一个有点复杂的UI,并使用QUiLoader将其加载到PySide6中。它在开发过程中有效,但当我认为我已经完成时,它不再显示任何内容。脚本启动并运行,只是不再显示任何窗口。我在Windows11、Python3.12/PySide6.7.2和3.11上使用PySide运行此脚本。......
  • [atcoder utpc2023_p] Priority Queue 3
    PriorityQueue3题意:有一个小根堆和\(1\)~\(n\)个数,以及一个操作序列,+表示\(push\),-表示\(pop\),\(pop\)有\(m\)次,问你有多少种插入顺序使得最后的pop集合与给出的的数字集合\(Y\)相同。首先有个浅显的发现:对于不在\(Y\)集合中的数,可选范围形如一个阶梯,换句话......