6.2 创建GDT表(2)

news/2024/10/31 15:58:45/

首先是 创建 include 文件夹,

创建了三个文件夹, cpu , include , cpu (include 下)

然后是 修改 cmakelist

接下来 是 创建 cpu.h, 关于 x86 cpu 相关的东西。

#ifndef CPU_H
#define CPU_H#include "comm/types.h"#pragma pack(1)/*** GDT描述符*/
// 这是gdt 表的模板
typedef struct _segment_desc_t {uint16_t limit15_0;uint16_t base15_0;uint8_t base23_16;uint16_t attr;   //注意这里面是有 16:19 的 limit 的值的。uint8_t base31_24;
}segment_desc_t;#pragma pack()// 这是c 文件中的两个函数
void cpu_init (void);
void segment_desc_set(int selector, uint32_t base, uint32_t limit, uint16_t attr);#endif

然后是创建 cpu.c


#include "cpu/cpu.h"
#include "os_cfg.h"//这里创建了一个GDT 的数组
static segment_desc_t gdt_table[GDT_TABLE_SIZE];/*** 设置段描述符*/
// selector 是选择子, base : 低地址, limit:界限, attr : 属性
// 这是一个 对每个 gdt 进行初始化的函数
void segment_desc_set(int selector, uint32_t base, uint32_t limit, uint16_t attr) {segment_desc_t * desc = gdt_table + selector  / sizeof(segment_desc_t);  // 这里 可以不除以  sizeof(segment_desc_t) 的,dgt表是 4个字节,4个字节的往前走的。desc->limit15_0 = limit & 0xffff;desc->base15_0 = base & 0xffff;desc->base23_16 = (base >> 16) & 0xff;desc->attr = attr | (((limit >> 16) & 0xf) << 8);  // 这里 在attr里面设置了 limit 的值。desc->base31_24 = (base >> 24) & 0xff;
}/*** 初始化GDT*/
//对每个表 进行循环的初始化。
void init_gdt(void) {// 全部清空for (int i = 0; i < GDT_TABLE_SIZE; i++) {segment_desc_set(i * sizeof(segment_desc_t), 0, 0, 0);  // 这里是在清空每个表。}
}/*** CPU初始化*/
void cpu_init (void) {init_gdt();
}

然后是创建 os_cfg.h , 放的是操作系统配置有关的宏定义 。


#ifndef OS_OS_CFG_H
#define OS_OS_CFG_H#define GDT_TABLE_SIZE      	256		// GDT表项数量#endif //OS_OS_CFG_H

gdt 表的个数 是有限制的,具体多少限制 不清楚。

然后是将 实现的函数 加到 cpu.h 中,这里已经加过了。

然后是在  init.c 文件中 对 gpt 表进行初始化。

经过编译+ 测试是可以的。


http://www.ppmy.cn/news/1543378.html

相关文章

【深入理解SpringCloud微服务】Sentinel实战与原理剖析

【深入理解SpringCloud微服务】Sentinel实战与原理剖析 Sentinel功能Sentinel三种用法硬编码注解拦截器什么时候使用注解方式&#xff0c;什么时候使用拦截器方式&#xff1f; Sentinel原理 Sentinel功能 Sentinel和Hystrix一样&#xff0c;也是一个微服务容错保护框架&#x…

多语言语音转写系统:实时记录,跨场景应用的高效助手

一、系统介绍 该系统通过优化的音频特征提取算法与自定义语言模型&#xff0c;提供高精度的转写服务&#xff0c;并能够实现多语言支持和本地化部署。作为一款开源工具&#xff0c;用户可在思通数科AI多模态能力平台上免费体验或下载集成&#xff0c;获得一键式转写解决方案。…

100种算法【Python版】第24篇——Bellman-Ford算法

本文目录 1 算法原理2 路径计算的实现步骤3 python代码4 算法应用1 算法原理 Bellman-Ford算法由美国计算机科学家理查德贝尔曼(Richard Bellman)和洛伊德福特(Lloyd Ford)于1958年提出。最初设计用于解决图论中的单源最短路径问题,尤其适用于含有负权边的图。该算法的提…

Vue项目中动态路由与权限控制:router.beforeEach的使用及无token重定向登录页

在现代前端项目中&#xff0c;权限控制是一个非常重要的环节。Vue Router作为Vue官方的路由管理器&#xff0c;为我们提供了强大的路由管理功能。在本文中&#xff0c;我们将探讨如何在Vue项目中使用router.beforeEach钩子函数来实现动态路由权限控制&#xff0c;并在用户未登录…

【网络原理】——图解HTTPS如何加密(通俗简单易懂)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;HTTP为什么不安全 二&#xff1a;HTTPS加密过程 1&#xff1a;密码学中的概念 &…

【缓存与加速技术实践】Redis 高可用

文章目录 Redis 高可用1. 持久化2. 主从复制3. 哨兵&#xff08;Sentinel&#xff09;4. Cluster集群持久化持久化的方式RDB 持久化触发条件执行流程启动时加载 AOF 持久化开启 AOF执行流程启动时加载 RDB 和 AOF 的优缺点 redis性能管理查看 Redis 内存使用内存碎片率内存使用…

C# .NET最小API?

在.NET 5/6中&#xff0c;你可以使用最小API来创建高性能的HTTP API。最小API提供了一种更轻量级的构建API的方式&#xff0c;它允许你直接在Program.cs文件中定义路由和处理程序&#xff0c;而不需要使用传统的MVC控制器。 什么是最小API&#xff1f; 最小API是一个用于构建HT…

【测试平台】Ewomail 邮件服务器搭建

一、邮件服务器背景介绍 背景介绍 使用的是开源的Ewomail邮件服务器&#xff0c;方便QA同学在进行业务测试时&#xff0c;通过测试平台自动注册邮件新账号&#xff0c; 减少手工注册的操作。前端页面调用的底层注册邮箱就是我们即将搭建的邮件服务器。 服务访问关系 前端 -&…