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));