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 表进行初始化。

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

相关推荐
有毒的教程6 小时前
Ubuntu 虚拟机磁盘空间不足完整解决教程
linux·运维·ubuntu
workflower7 小时前
用硬件换时间”与“用算法降成本”之间的博弈
人工智能·算法·安全·集成测试·无人机·ai编程
小樱花的樱花7 小时前
C++ new和delete用法详解
linux·开发语言·c++
APIshop8 小时前
Java获取京东商品详情接口(item_get)实战指南
java·linux·数据库
Cx330❀8 小时前
一文吃透Linux System V共享内存:原理+实操+避坑指南
大数据·linux·运维·服务器·人工智能
薛定谔的悦8 小时前
储能系统(EMS)核心架构解析:充放电控制、防逆流、防过载与 PID 调节
linux·运维·架构
3GPP仿真实验室9 小时前
【MATLAB源码】CSI-RS:测量链路
linux·网络·matlab
阿 才9 小时前
WSL2 + TFTP + 网络启动(Linux开发板与WSL2建立网络连接)
linux·运维·网络
重生之我是Java开发战士9 小时前
【动态规划】简单多状态dp问题:按摩师,打家劫舍,删除并获得点数,粉刷房子,买卖股票的最佳时机
算法·动态规划·哈希算法