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

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

相关推荐
feilieren14 分钟前
leetcode - 684. 冗余连接
java·开发语言·算法
余~1853816280024 分钟前
矩阵系统源码搭建,OEM贴牌技术
网络·人工智能·线性代数·算法·矩阵
团儿.29 分钟前
KVM磁盘配置:构建高效虚拟环境的基石
linux·运维·centos·kvm·kvm磁盘
Tianwen_Burning34 分钟前
Halcon相机外参自理解
算法
zhqh1001 小时前
在qemu-system上跑arm-Debian
linux·arm开发·debian
昨天今天明天好多天1 小时前
【Linux】Redis 部署
linux·redis·bootstrap
hanzhuhuaa1 小时前
Linux 查看 nginx 安装目录和配置文件路径
linux·nginx
dawn1912282 小时前
Java 中的正则表达式详解
java·开发语言·算法·正则表达式·1024程序员节
惊鸿一博2 小时前
linux_电脑一运行程序就死机怎么处理?
linux·运维·电脑
黑不拉几的小白兔2 小时前
PTA L1系列题解(C语言)(L1_097 -- L1_104)
数据结构·算法·1024程序员节