#ifndef __KERNEL_GLOBAL_H #define __KERNEL_GLOBAL_H #include "../lib/stdint.h" // ---------------------------------------------- GDT 描述符属性 ---------------------------------------------- #define DESC_G_4K 1 #define DESC_D_32 1 #define DESC_L 0 // 64 位代码标记,此处标记为 0 便可 #define DESC_AVL 0 // cpu 不用此位,暂设置为 0 #define DESC_P 1 #define DESC_DPL_0 0 #define DESC_DPL_1 1 #define DESC_DPL_2 2 #define DESC_DPL_3 3 /********************************************************* * 代码段和数据段属于存储段,tss 和各种门描述符属于系统段 * s 为 1 时表示存储段,为 0 时表示系统段 *********************************************************/ #define DESC_S_CODE 1 // 存储段 #define DESC_S_DATA DESC_S_CODE // 存储段 #define DESC_S_SYS 0 // 系统段 #define DESC_TYPE_CODE 0x8 // 代码段(x=1,c=0,r=0,a=0) 可执行、非依从、不可读、已访问位 a 清 0 #define DESC_TYPE_DATA 0x2 // 数据段(x=0,e=0,w=1,a=0) 不可执行、向上扩展、可写、已访问位 a 清 0 #define DESC_TYPE_TSS 0x9 // 任务状态段 B 位为 0, 不忙 #define RPL0 0 #define RPL1 1 #define RPL2 2 #define RPL3 3 #define TI_GDT 0x00 #define TI_LDT 0x01 #define PG_P 1 #define SELECTOR_K_CODE ((1 << 3) + (TI_GDT << 2) + RPL0) #define SELECTOR_K_DATA ((2 << 3) + (TI_GDT << 2) + RPL0) #define SELECTOR_K_STACK SELECTOR_K_DATA #define SELECTOR_K_GS ((3 << 3) + (TI_GDT << 2) + RPL0) /* 第 3 个段描述符是显存,第 4 个是 tss */ #define SELECTOR_TSS ((4 << 3) + (TI_GDT << 2) + RPL0) // GDT 中第 4 个 #define SELECTOR_U_CODE ((5 << 3) + (TI_GDT << 2) + RPL3) #define SELECTOR_U_DATA ((6 << 3) + (TI_GDT << 2) + RPL3) #define SELECTOR_U_STACK SELECTOR_U_DATA #define GDT_ATTR_HIGH ((DESC_G_4K << 7) + (DESC_D_32 << 6) + (DESC_L << 5) + (DESC_AVL << 4)) #define GDT_CODE_ATTR_LOW_DPL3 ((DESC_P << 7) + (DESC_DPL_3 << 5) + (DESC_S_CODE << 4) + DESC_TYPE_CODE) #define GDT_DATA_ATTR_LOW_DPL3 ((DESC_P << 7) + (DESC_DPL_3 << 5) + (DESC_S_DATA << 4) + DESC_TYPE_DATA) /*---------------------- TSS 描述符属性 -----------------------------------------*/ #define TSS_DESC_D 0 #define TSS_ATTR_HIGH ((DESC_G_4K << 7) + (TSS_DESC_D << 6) + (DESC_L << 5) + (DESC_AVL << 4) + 0x0) #define TSS_ATTR_LOW ((DESC_P << 7) + (DESC_DPL_0 << 5) + (DESC_S_SYS << 4) + DESC_TYPE_TSS) //! 上面已经定义 #define SELECTOR_TSS ((4 << 3) + (TI_GDT << 2) + RPL0) /*---------------------- IDT 描述符属性 -----------------------------------------*/ #define IDT_DESC_P 1 #define IDT_DESC_DPL0 0 #define IDT_DESC_DPL3 3 #define IDT_DESC_32_TYPE 0xE // 32 位的门 #define IDT_DESC_16_TYPE 0x6 // 16 位的门,不用,定义它只为和 32 位门区分 #define IDT_DESC_ATTR_DPL0 ((IDT_DESC_P << 7) + (IDT_DESC_DPL0 << 5) + IDT_DESC_32_TYPE) #define IDT_DESC_ATTR_DPL3 ((IDT_DESC_P << 7) + (IDT_DESC_DPL3 << 5) + IDT_DESC_32_TYPE) /*---------------------- EFLAGES 属性 -----------------------------------------*/ #define EFLAGES_MBS (1 << 1) // 些项必须设置 #define EFLAGES_IF_1 (1 << 9) // if 为 1, 开中断 #define EFLAGES_IF_0 0 // if 为 0, 关中断 #define EFLAGES_IOPL_0 (0 << 12) // IOPL0 #define EFLAGES_IOPL_3 (3 << 12) // IOPL3 用于测试用户程序在非系统调用来进行 IO #define EFLAGES_NT (0 << 14) // NTP #define EFLAGES_RF (1 << 16) // 工作状态位,0 表示在内核模式下运行 #define EFLAGES_VM (1 << 17) // 虚拟 8086 模式位,0 表示在 32 位模式下运行 #define EFLAGES_AC (1 << 18) // 累加器状态位,0 表示在 32 位模式下运行 #define EFLAGES_VIF (1 << 19) // 中断标志位 /*---------------------- 定义 GDT 中描述符的结构 -----------------------------------------*/ // ! 段描述符格式 // ! 31~24 23 22 21 20 19~16 15 14~13 12 11~8 7~0 // ! ---------------------------------------------------------- // ! |Base | G | D | L |AVL| Limit | P | DPL | S | TYPE | Base | // ! ---------------------------------------------------------- // ! 31~16 15~0 // ! ---------------------------------------------------------- // ! | Base | Limit | // ! ---------------------------------------------------------- typedef struct gdt_desc { uint16_t limit_low_word; // 低 16 位 uint16_t base_low_word; uint8_t base_middle_byte; uint8_t attr_low_byte; uint8_t limit_high_attr_high; uint8_t base_high_byte; } GdtDesc; #endif // __KERNEL_GLOBAL_H