#ifndef ONIX_GLOBAL_H #define ONIX_GLOBAL_H #include <onix/types.h> // 我们只使用128个, 当然全局描述符最大可以有 2**13 8192个 #define GDT_SIZE 128 #define CODE_SELECT 1 << 3 // 选择子 #define DATA_SELECT 2 << 3 // 选择子 // 全局描述符 typedef struct descriptor_t /* 共 8 个字节 */ { unsigned short limit_low; // 段界限 0 ~ 15 位 unsigned int base_low : 24; // 基地址 0 ~ 23 位 16M unsigned char type : 4; // 段类型 unsigned char segment : 1; // 1 表示代码段或数据段,0 表示系统段 unsigned char DPL : 2; // Descriptor Privilege Level 描述符特权等级 0 ~ 3 unsigned char present : 1; // 存在位,1 在内存中,0 在磁盘上 unsigned char limit_high : 4; // 段界限 16 ~ 19; unsigned char available : 1; // 该安排的都安排了,送给操作系统吧 unsigned char long_mode : 1; // 64 位扩展标志 unsigned char big : 1; // 32 位 还是 16 位; unsigned char granularity : 1; // 粒度 4KB 或 1B unsigned char base_high; // 基地址 24 ~ 31 位 } _packed descriptor_t; // 段选择子 typedef struct selector_t { u8 RPL : 2; // Request Privilege Level u8 TI : 1; // Table Indicator u16 index : 13; } selector_t; // 全局描述符表指针 typedef struct pointer_t { u16 limit; u32 base; } _packed pointer_t; void gdt_init(); #endif