5-2 检测内存容量

1 使用的是bios 中断, 每次进行检测都会返回一块 内容。并且标志上,这块内存是否可用。

接下来是代码:

首先是构建 一个文件夹, 两个文件。

types.h 的内容。


#ifndef TYPES_H
#define TYPES_H// 基本整数类型,下面的写法和视频中的不同,加了一些宏处理
// 主要是因为将要使用newlib库,newlib有同样使用typedef定义uint8_t类型
// 为了避免冲突,加上_UINT8_T_DECLARED的配置//这里定义的是一些数据类型
#ifndef _UINT8_T_DECLARED
#define _UINT8_T_DECLARED
typedef unsigned char uint8_t;
#endif#ifndef _UINT16_T_DECLARED
#define _UINT16_T_DECLARED
typedef unsigned short uint16_t;
#endif#ifndef _UINT32_T_DECLARED
#define _UINT32_T_DECLARED
typedef unsigned long uint32_t;
#endif#endif

boot_info.h 的内容

#ifndef BOOT_INFO_H
#define BOOT_INFO_H#include "types.h"#define BOOT_RAM_REGION_MAX			10		// RAM区最大数量//检测内存时用到的结构体
typedef struct _boot_info_t {// RAM区信息struct {uint32_t start;uint32_t size;}ram_region_cfg[BOOT_RAM_REGION_MAX];int ram_region_count;
}boot_info_t;#endif // BOOT_INFO_H

然后是对于 头文件的包含。 loader.h

#include "comm/types.h"
#include "comm/boot_info.h"

loader_16.c 中包含头文件,并且定义结构体。

#include "loader.h"static boot_info_t boot_info;			// 启动参数信息

接下来是对 顶层 cmake 的修改。

这里不用修改, 已经添加了 顶层source 目录。

2 一些基本的知识。

网上的截图:

命令的格式是这样的。

举例子。

就了解到这种程度就可以了。

3 什么是 ES:DI

什么是DI 寄存器呢? 在熟悉一遍。

------------------------------------------------------------------------------------------------------------------------------------

接下来是 代码部分。

这里我遇到了一个问题, 就是 头文件一直报错。

报错位置是 typedef unsigned int  uint32_t  部分。

我觉得 跟 cmake 有关。

最后的解决方案是 ,自己写了个头文件, 但是 课程的头文件依然保留着, 只是 里面没有内容。

boot_info.h  设置一个结构体用于存放探测到的 内存容量。

#ifndef BOOT_INFO_H
#define BOOT_INFO_H#include "types.h"#define BOOT_RAM_REGION_MAX			10		// RAM区最大数量//检测内存时用到的结构体
typedef struct _boot_info_t {// RAM区信息struct {uint32_t start;uint32_t size;}ram_region_cfg[BOOT_RAM_REGION_MAX];int ram_region_count;
}boot_info_t;#endif // BOOT_INFO_H

types.h 是 一些宏定义。

#ifndef TYPES_H
#define TYPES_Htypedef unsigned char     uint8_t;
typedef unsigned short    uint16_t;
typedef unsigned long     uint32_t;#endif

loader.h 什么也不写, 就是这个头文件出问题的。

myloader.h 是自己写的头文件。 这个结构体是 int15 中断需要的。

#ifndef __MYHEADER_H
#define __MYHEADER_H#include "comm/boot_info.h"
#include "comm/types.h"typedef struct SMAP_entry {uint32_t BaseL; // base address uint64_tuint32_t BaseH;uint32_t LengthL; // length uint64_tuint32_t LengthH;uint32_t Type; // entry Typeuint32_t ACPI; // extended
}__attribute__((packed)) SMAP_entry_t;#endif

探测函数 再 loarder_16.c 中。

static void  detect_memory(void) {uint32_t contID = 0;SMAP_entry_t smap_entry;int signature, bytes;show_msg("try to detect memory:\r\n");// 初次:EDX=0x534D4150,EAX=0xE820,ECX=24,INT 0x15, EBX=0(初次)// 后续:EAX=0xE820,ECX=24,// 结束判断:EBX=0boot_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.\r\n");return;}// todo: 20字节if (bytes > 20 && (entry->ACPI & 0x0001) == 0){continue;}// 保存RAM信息,只取32位,空间有限无需考虑更大容量的情况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("detect ok.\r\n");
}

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

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

相关文章

全球圆柱锂电池行业领军者!比克电池亮相2024深圳eVTOL展

2024深圳eVTOL产业发展大会暨低空经济展览会将于9月23-25日在深圳坪山燕子湖国际会展中心举办。展会将通过“两天论坛三天展览”的形式展开&#xff0c;专注未来城市空中交通新形态、民用有人驾驶、无人驾驶航空器、城市低空物流&#xff0c;并讨论eVTOL的整机研发、设计、制造…

拍卖新纪元:Spring Boot赋能在线拍卖解决方案

需求分析 1.1技术可行性&#xff1a;技术背景 在线拍卖系统是在Windows操作系统中进行开发运用的&#xff0c;而且目前PC机的各项性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的&#xff0c;也是当下广泛应用的技术之一。 系统的开发环境和配置…

Python+selenium web测试入门基础!

自动化测试框架 from selenium import webdriver 获取浏览器对象 我这里是edge浏览器&#xff0c;用的是edge的webdriver # webdriver获取浏览器对象  driver webdriver.Edge() 尝试打开网站并关闭​​​​​​​ # 准备一个网址  url "https://www.baidu.com/"…

包拯断案 | 数据库从库GTID在变化 为何没有数据写入@还故障一个真相

提问&#xff1a;作为DBA运维的你是否遇到过这些烦恼 1、数据库从库复制链路如何正确配置表过滤信息&#xff1f; 2、数据库从库的GTID在变化&#xff0c;实际却没有数据写入&#xff0c;究竟是什么原因&#xff1f; 心中有章&#xff0c;遇事不慌 作为DBA的你&#xff0c;…

如何构建短视频矩阵?云微客开启多账号协同作战

你有没有疑惑过&#xff0c;为什么有些账号每一次发布视频&#xff0c;都要艾特一下其他账号呢&#xff1f;那些被艾特的账号&#xff0c;你有点进去关注过吗&#xff1f;其实做过运营的都或多或少的接触过矩阵&#xff0c;短视频矩阵的玩法现在也逐步成为了趋势。企业通过多账…

pyautogui进行点击失效,pyautogui.click()失效

背景&#xff1a;在Pycharm里&#xff0c;使用pythonpyautogui调用 .exe程序文件时候&#xff0c;当程序界面出来之后&#xff0c;鼠标失去反应&#xff0c;用pyautogui进行点击。后面尝试使用图片相似也无法实行点击。 解决方法&#xff1a;运行Pycharm或者其他ide的时候选择…

黑马点评2——商户查询缓存(P37店铺类型查询业务添加缓存练习题答案)redis缓存、更新、穿透、雪崩、击穿、工具封装

文章目录 什么是缓存&#xff1f;添加Redis缓存店铺类型查询业务添加缓存练习题 缓存更新策略给查询商铺的缓存添加超时剔除和主动更新的策略 缓存穿透缓存空对象布隆过滤 缓存雪崩解决方案 缓存击穿解决方案基于互斥锁方式解决缓存击穿问题基于逻辑过期的方式解决缓存击穿问题…

极市开发平台yolov8训练无人机数据集样例数据流程

先进入vscode&#xff0c;进入src_repo文件夹。 第一步&#xff0c;克隆一个比较好的博主的库&#xff1a; GitHub - Incalos/YOLO-Datasets-And-Training-Methods: This project involves making custom datasets for the YOLO series and model training methods for YOLO.…

关于蓝屏查看日志分析原因

一、前提 虽然电脑经常蓝屏&#xff0c;或者发生了蓝屏现象&#xff0c;但是仍然可以进入系统&#xff0c;并且可以进行桌面操作。 二、查看蓝屏日志 1.按下win键&#xff0c;搜索计算机管理。 2.依次点击&#xff1a;系统工具->事件查看器->Windows日志->系统 3.在…

【项目二】C++高性能服务器开发——日志系统(日志器,日志级别,日志事件)

知识点备忘录 其实也没啥 操作记录 在乌邦图上写的&#xff0c;先是模仿sylar创建了目录 进入sylar文件夹&#xff0c;有今天写的log.h头文件 其中log_test.cpp是为了测试log.h能否正常运行建的&#xff0c;只是个测试文件 log.h写了三个类&#xff0c;日志级别&#xff0…

PHP一站式解决方案高级房产系统小程序源码

一站式解决方案&#xff0c;高级房产系统让房产管理更轻松 &#x1f3e0;【开篇&#xff1a;告别繁琐&#xff0c;迎接高效房产管理新时代】&#x1f3e0; 你是否还在为房产管理的繁琐流程而头疼&#xff1f;从房源录入、客户咨询到合同签订、售后服务&#xff0c;每一个环节…

【2024数模国赛赛题思路公开】国赛C题第二套思路丨附可运行代码丨无偿自提

2024年国赛C题第二套解题思路 第一问&#xff1a;2024~2030年农作物的最优种植方案 【问题分析】 题目要求为某乡村在2024~2030年制定农作物的最优种植方案&#xff0c;目的是最大化收益&#xff0c;并需考虑两种销售情况&#xff1a; 1. 超过预期销售量的部分滞销&#xff0…

【LeetCode】05.最长回文子串

题目要求 解题思路 这一类型&#xff08;回文子串&#xff09;主要有两种解决方法&#xff0c;一种是动态规划&#xff0c;另一种是中心拓展算法。 动态规划&#xff1a; 本质问题就是在i-j区间是不是回文的。这样的话我们在 i 和 j 位置的值相等时&#xff0c;判断如下三种情…

SQL-多表查询

1、多表关系 一对多、多对一&#xff1a;在多的一方建立外键&#xff0c;指向一的一方。 多对多&#xff1a;至少两个外键&#xff0c;通过中间表维护。 一对一 2、多表查询概述 3、内连接 4、外连接 5、自连接 6、联合查询 7、子查询 8、多表查询案例 # 1、多表关系 #…

语音测试(一)ffmpeg视频转音频

视频转音频 下载ffmpeg工具进入bin目录cmd进入控制台输入命令 ffmpeg.exe -i ./视频.mp4 ./音频.wav命令说明 ffmpeg -i input.mp4 output.mkv FFmpeg 可能会尝试自动选择合适的编码器对视频和音频进行重新编码&#xff0c;以便适应 MKV 格式的要求ffmpeg -i input.mp4 -c c…

linux 内核代码学习(八)

总体目标&#xff1a;由于fedora10 linux发行版中自带的linux2.6.xx内核源码规模太庞大了&#xff0c;对于想通读内核源码的爱好者来说太困难了&#xff0c;因此选择了linux2.4.20内核来进行测试&#xff08;最终是希望能够实现linux1.0内核的源码完全编译和测试&#xff09;。…

Rust的数据类型

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust到底值不值得学&#xff0c;之一 -CSDN博客 Rust到底值不值得学&#xff0c;之二-CSDN博客 3.5 数据类型的定义和分类 在Rust…

亚马逊逆袭:我是怎么让店铺从平庸到高增长的

今年的亚马逊Prime会员大促即将到来&#xff0c;对于各位卖家来说&#xff0c;这不仅代表着提升店铺主推商品排名、加速商品销量增长的机会&#xff0c;还意味着为年末其他大促活动提前引流获客的大好时机&#xff0c;绝对不容错过&#xff01; 如果你的亚马逊店铺还是表现平平…

DNN学习平台(GoogleNet、SSD、FastRCNN、Yolov3)

DNN学习平台&#xff08;GoogleNet、SSD、FastRCNN、Yolov3&#xff09; 前言相关介绍1&#xff0c;登录界面&#xff1a;2&#xff0c;主界面&#xff1a;3&#xff0c;部分功能演示如下&#xff08;1&#xff09;识别网络图片&#xff08;2&#xff09;GoogleNet分类&#xf…

【基础】Three.js 自定义几何体和复制几何体

通过自定义顶点数据&#xff0c;可以创建任意的几何体。像threejs的长方体BoxGeometry、球体SphereGeometry等几何体都是基于BufferGeometry类构建的&#xff0c;它表示一个没有任何形状的空几何体。 1. 自定义点模型 通过javascript 类型化数组 Float32Array创建一组xyz坐标…