6.2 创建GDT表(2)

首先是 创建 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 表进行初始化。

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

相关推荐
进击的荆棘几秒前
Linux系统——库的原理与制作之ELF文件的形成与加载的过程(下)
linux·动静态库
@atweiwei2 分钟前
训练 AI 大模型系列之 LoRA:不动模型本体,靠一条低秩旁路改专长(附完整手算算例)
人工智能·算法·ai·语言模型·rag
CrazyMo_9 分钟前
鸿蒙高级——内存专用之linux-reserve-memory 方案简介
linux·运维·服务器
yi01120 分钟前
DAY27: LeetCode 110. 平衡二叉树 | 在递归中判断是否平衡
人工智能·笔记·python·算法·leetcode·二叉树·递归
灯澜忆梦28 分钟前
【Linux】#5 | 文件与目录基础操作命令
java·linux·运维
96245636 分钟前
餐饮 SaaS 优惠券系统架构演进(七)营销定价引擎设计:活动、会员价、优惠券、买赠如何在同一 PriceQuote 中可解释地组合
java·运维·算法
wuminyu1 小时前
stackChunkOop内部结构与GC屏障的配合工作原理剖析
java·linux·c语言·jvm·c++
青衫客361 小时前
从网卡到 Socket:再探 Linux 网络协议栈与 iptables 数据包处理流程
linux·网络·网络协议
xuxigifxfh1 小时前
牛客:HJ21 简单密码
java·开发语言·算法
承渊政道1 小时前
Linux网络学习【TCP Socket编程实战:connect的断线重连与客户端访问Linux验证】
linux·网络·学习·ubuntu·tcp·socket编程