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.rhkb.cn/news/418014.html

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

相关文章

2024国赛数学建模ABC题思路模型

完整的思路模型请查看文末名片 完整的思路模型请查看文末名片 完整的思路模型请查看文末名片

rust 命令行工具rsup管理前端npm依赖

学习了一年的 rust 了&#xff0c;但是不知道用来做些什么&#xff0c;也没能赋能到工作中&#xff0c;现在前端基建都已经开始全面进入 rust 领域了&#xff0c;rust 的前端生态是越来越好。但是自己奈何水平不够&#xff0c;想贡献点什么&#xff0c;无从下手。 遂想自己捣鼓…

23种设计模式之责任链模式

文章目录 23种设计模式之责任链模式主要角色和结构工作原理简单实现 - 学生成绩打印优点责任链 - 缺点责任链 - 应用场景责任链模式在Spring中的使用 23种设计模式之责任链模式 责任链设计模式是一种行为型设计模式&#xff0c;它允许多个对象依次处理一个请求&#xff0c;直到…

基于SpringBoot的外卖点餐系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootJSP 工具&#xff1a;IDEA/Eclipse、Navicat、Maven、Tomcat 系统展示 首页 用户管理界…

本地使用Docker部署Nexus Maven私有仓库工具结合内网穿透实现远程管理

文章目录 前言1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus 前言 本文主要介绍在Linux中使用Docker来一键部署Nexus Maven私有仓库工具并结合Cpolar内网穿透实现远程访问Nex…

CosyVoice:开源强大的 AI 语音合成工具

在当今科技飞速发展的时代&#xff0c;AI 语音合成技术正逐渐改变着我们的生活。今天&#xff0c;就为大家介绍一款卓越的语音合成工具——CosyVoice。 一、安装步骤 克隆和安装&#xff1a; 克隆仓库&#xff1a;git clone --recursive https://github.com/FunAudioLLM/Cos…

LabVIEW步进电机控制方式

在LabVIEW中控制步进电机可以通过多种方式实现。每种方法都有其独特的优缺点&#xff0c;适用于不同的应用场合。下面详细介绍几种常见的步进电机控制方式&#xff0c;并进行比较。 1. 开环控制&#xff08;Open-Loop Control&#xff09; 特点 通过定期发出脉冲信号来控制步进…

SpringBoot整合Minio及阿里云OSS(配置文件无缝切换)

SpringBoot整合Minio及阿里云OSS 文章目录 SpringBoot整合Minio及阿里云OSS1.Minio安装测试1.Docker安装启动容器 2.创建bucket3.上传文件修改权限 2.SpringBoot整合Minio及阿里云OSS1.公共部分抽取2.Minio配置整合1.添加pom依赖2.添加配置文件3.操作接口实现 3.阿里云OSS配置整…

家政上门小程序系统设计解析

一、系统概述 上门家政系统是一种基于互联网技术的综合性服务平台&#xff0c;该系统利用大数据分析和人工智能算法&#xff0c;实现家政服务资源的有效整合与优化配置&#xff0c;进而达到用户与家政服务提供者之间的精准匹配。编辑&#xff1a;qawsed2466 二、系统功能模块 …

RabbitMQ简介

RabbitMQ简介 MQ 百度百科-MQ MQ&#xff1a;Message Queue 消息队列 # 何为消息队列&#xff1f; 消息&#xff1a;字符串&#xff0c;数字&#xff0c;对象&#xff0c;文件...... 业务中需要用到的数据都可以称为消息 队列&#xff1a;先进先出的数据结构常用来解耦&…

【Python知识宝库】迭代器与生成器:高效处理大数据集

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、迭代器&#xff1a;逐个访问数据的艺术1. 迭代器的定义2. 自定义迭代器3. 迭代器的优势 二、生成器&#xff…

分布式风电电池储能系统

风能作为一种清洁的可再生能源,越来越受到世界各国的*视。但风能随机波动的特点,造成风电出力的频繁波动,使电网的调频、调峰压力加大,成为长期困扰风电并网的主要难题。 我国的弃风限电*次出现于2010年,此后弃风从零星现象快速扩散,2012年的情况*为严*,弃风率达17%。之后随着…

VueSax-解决Vue3报错问题,并支持typescript

以下为坑点 根据官方提示&#xff0c;本人在vue3typescript的项目中添加了vuesax的组件依赖 根据正常的导入依赖思路编写代码&#xff0c;发现typescript一直报 查询vuesax的目录文件发现存在ts文件&#xff0c;于是乎觉得是自己的问题&#xff0c;就查阅gpt与网上资料&#x…

【学习笔记】SSL证书安全机制之证书撤销

前言&#xff1a;以往提到过&#xff0c;钓鱼网站会仿冒我们&#xff0c;如果我们的私钥泄露了&#xff0c;如果被不法分子得到了私钥&#xff0c;他们就能假装是我们网站。那现在&#xff0c;我们要做的是生成新私钥并申请新证书。问题来了&#xff0c;旧的证书亦然存在且有效…

sql-labs51-55通关攻略

第51关 一.查询数据库 1and updatexml(1,concat(0x7e,(select database()),0x7e),1)-- 二.查表 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase() ),0x7e),1) -- 三.查列 and updatexml(1,concat…

如何利用mHand Pro动捕数据手套连接虚拟与现实?

数据手套作为虚拟现实中的一种交互动捕设备&#xff0c;能够模拟真人手部的动作和感知反馈&#xff0c;实现人机交互的效果。随着虚拟现实技术的不断发展&#xff0c;数据手套也在不断地改进和升级。 mHand Pro是一款由拥有多年经验的惯性动作捕捉技术团队广州虚拟动力研发的数…

Java并发编程实战 04 | 使用WaitNotify时要注意什么?

在 Java 中&#xff0c;wait()、notify() 和 notifyAll() 方法在多线程编程中主要用于线程间的协作和同步。理解这些方法的使用特点对于编写稳定的多线程程序至关重要。我们将从以下三个问题入手深入探讨它们的使用&#xff1a; 为什么必须在 synchronized 代码块中使用 wait(…

gazebo可能打不开的问题

如果经常遇到gazebo只能断网才能运行的时候&#xff0c;主要就是因为无法联网访问gazebo的在线模型库&#xff0c;此时我们一般无法在联网的情况下打开gazebo。 这个时候就直接将下载好的模型先放到~/.gazebo/models/文件夹下面即可&#xff1a; https://github.com/osrf/gazeb…

大语言模型(LLM)如何更好地继续预训练(Continue PreTraining)

预训练&#xff08;Pretraining&#xff09;是一个非常消耗资源的工作&#xff0c;尤其在 LLM 时代。随着LLama2的开源&#xff0c;越来越多人都开始尝试在这个强大的英文基座模型上进行中文增强。但&#xff0c;我们如何才能保证模型在既学到「中文知识」的情况下&#xff0c;…

简单的EasyCaptcha图片验证码学习

简单的EasyCaptcha图片验证码学习 1. 需求 图片验证码是一种常见的验证形式&#xff0c;它通过生成一串随机数字或符号&#xff0c;并加入一些干扰像素&#xff0c;最终生成用于验证的图片。这种验证码的设计旨在增加破解难度&#xff0c;主要通过加大干扰强度来提高安全性。…