5.6 切换进程保护模式(3)

1 实现 A20地址线的打开。

//打开A20 地址线
    uint8_t v = inb(0x92);
    outb(0x92, v | 0x2);

2 配置 gdt 表

//gdt 表,二维数组
uint16_t gdt_table[][4] = {
    {0, 0, 0, 0},
    {0xFFFF, 0x0000, 0x9A00, 0x00CF},	
    {0xFFFF, 0x0000, 0x9200, 0x00CF},
};

然后是配置 一个内联函数

//设置gdt 表的内联函数
static inline void lgdt(uint32_t start, uint32_t size) {
	struct {
		uint16_t limit;
		uint16_t start15_0;   
		uint16_t start31_16;  
	} gdt;

	gdt.start31_16 = start >> 16;
	gdt.start15_0 = start & 0xFFFF;
	gdt.limit = size - 1;
// 注意, 这里的 gdt 应该是 已经取了 数组地址处的值 , 而不应该是 地址了,因为如果是地址的化 ,  类似 这种操作  gdt.start31_16 = start >> 16; 解释不通。
	__asm__ __volatile__("lgdt %[g]"::[g]"m"(gdt));
}

然后是 应用这个函数

    // 加载GDT。由于中断已经关掉,IDT不需要加载
    lgdt((uint32_t)gdt_table, sizeof(gdt_table));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值