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/"…

Vue2 与 Vue3 的区别有哪些

Vue 2 和 Vue 3 在许多方面都有显著的区别&#xff0c;包括性能、API 设计、功能特性等。以下是它们主要的区别&#xff1a; 1. 响应式系统 Vue 2: 基于 Object.defineProperty: Vue 2 使用 Object.defineProperty 来实现响应式数据。这种方法在处理对象属性时有一定的局限性…

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

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

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

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

GitHub Copilot Issue in Visual Studio Code “Status Ready (disabled)“

I’m facing an issue with GitHub Copilot in Visual Studio Code, where it’s not suggesting any code. Even though it says “enabled globally” in the extensions tab settings, the icon in the status bar has a diagonal line through it. When I click on the ico…

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.…

【openwrt-21.02】T750 openwrt-21.02 pptp拨号失败问题分析及解决方案

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …

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

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

Qt-桌面服务和托盘

t应用程序在用户的桌面环境中表现良好&#xff0c;但某些集成需要额外的&#xff0c;有时是特定于平台的技术。 Qt中的各种类旨在帮助开发人员将应用程序集成到用户的桌面环境中。这些类使开发人员能够在使用跨平台API的同时利用原生服务。 QDesktopServices 访问常用桌面服务的…

Java环境搭建指南:从新手到专家的全方位教程!

Java是一种广泛使用的编程语言&#xff0c;具有跨平台的特性&#xff0c;这意味着只要一次编写&#xff0c;就可以在支持Java的任何系统上运行&#xff0c;无论是Windows、Mac OS还是Linux。要开始使用Java进行开发&#xff0c;首先需要搭建Java开发环境&#xff0c;这包括下载…

【项目二】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;每一个环节…

计算机网络11——数据库语法2

目录 1、变量 (1)局部变量 (2)会话变量 (3)系统变量 2、判断选择 (1)if选择语法 (2)case选择 3、循环 (1)while循环 (2)其他循环 4、存储过程 5、触发器 6、事务:transaction 事务的特性 使用 1、变量 (1)局部变量 函数里面定义的,变量名 …

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

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

uniapp微信小程序开发踩坑日记:Pinia持久化报错Cannot read property ‘localStorage‘ of undefined

插件默认使用 localStorage 实现持久化&#xff0c;小程序端不兼容&#xff0c;需要替换持久化 API import { defineStore } from pinia export const useCommonStore defineStore(pack-store, {state: (): State > ({wwInfo: {},globalData: {},timerLock: false, //是…

【LeetCode】05.最长回文子串

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