global.h 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #ifndef __KERNEL_GLOBAL_H
  2. #define __KERNEL_GLOBAL_H
  3. #include "../lib/stdint.h"
  4. // ---------------------------------------------- GDT 描述符属性 ----------------------------------------------
  5. #define DESC_G_4K 1
  6. #define DESC_D_32 1
  7. #define DESC_L 0 // 64 位代码标记,此处标记为 0 便可
  8. #define DESC_AVL 0 // cpu 不用此位,暂设置为 0
  9. #define DESC_P 1
  10. #define DESC_DPL_0 0
  11. #define DESC_DPL_1 1
  12. #define DESC_DPL_2 2
  13. #define DESC_DPL_3 3
  14. /*********************************************************
  15. * 代码段和数据段属于存储段,tss 和各种门描述符属于系统段
  16. * s 为 1 时表示存储段,为 0 时表示系统段
  17. *********************************************************/
  18. #define DESC_S_CODE 1 // 存储段
  19. #define DESC_S_DATA DESC_S_CODE // 存储段
  20. #define DESC_S_SYS 0 // 系统段
  21. #define DESC_TYPE_CODE 0x8 // 代码段(x=1,c=0,r=0,a=0) 可执行、非依从、不可读、已访问位 a 清 0
  22. #define DESC_TYPE_DATA 0x2 // 数据段(x=0,e=0,w=1,a=0) 不可执行、向上扩展、可写、已访问位 a 清 0
  23. #define DESC_TYPE_TSS 0x9 // 任务状态段 B 位为 0, 不忙
  24. #define RPL0 0
  25. #define RPL1 1
  26. #define RPL2 2
  27. #define RPL3 3
  28. #define TI_GDT 0x00
  29. #define TI_LDT 0x01
  30. #define PG_P 1
  31. #define SELECTOR_K_CODE ((1 << 3) + (TI_GDT << 2) + RPL0)
  32. #define SELECTOR_K_DATA ((2 << 3) + (TI_GDT << 2) + RPL0)
  33. #define SELECTOR_K_STACK SELECTOR_K_DATA
  34. #define SELECTOR_K_GS ((3 << 3) + (TI_GDT << 2) + RPL0)
  35. /* 第 3 个段描述符是显存,第 4 个是 tss */
  36. #define SELECTOR_TSS ((4 << 3) + (TI_GDT << 2) + RPL0) // GDT 中第 4 个
  37. #define SELECTOR_U_CODE ((5 << 3) + (TI_GDT << 2) + RPL3)
  38. #define SELECTOR_U_DATA ((6 << 3) + (TI_GDT << 2) + RPL3)
  39. #define SELECTOR_U_STACK SELECTOR_U_DATA
  40. #define GDT_ATTR_HIGH ((DESC_G_4K << 7) + (DESC_D_32 << 6) + (DESC_L << 5) + (DESC_AVL << 4))
  41. #define GDT_CODE_ATTR_LOW_DPL3 ((DESC_P << 7) + (DESC_DPL_3 << 5) + (DESC_S_CODE << 4) + DESC_TYPE_CODE)
  42. #define GDT_DATA_ATTR_LOW_DPL3 ((DESC_P << 7) + (DESC_DPL_3 << 5) + (DESC_S_DATA << 4) + DESC_TYPE_DATA)
  43. /*---------------------- TSS 描述符属性 -----------------------------------------*/
  44. #define TSS_DESC_D 0
  45. #define TSS_ATTR_HIGH ((DESC_G_4K << 7) + (TSS_DESC_D << 6) + (DESC_L << 5) + (DESC_AVL << 4) + 0x0)
  46. #define TSS_ATTR_LOW ((DESC_P << 7) + (DESC_DPL_0 << 5) + (DESC_S_SYS << 4) + DESC_TYPE_TSS)
  47. //! 上面已经定义 #define SELECTOR_TSS ((4 << 3) + (TI_GDT << 2) + RPL0)
  48. /*---------------------- IDT 描述符属性 -----------------------------------------*/
  49. #define IDT_DESC_P 1
  50. #define IDT_DESC_DPL0 0
  51. #define IDT_DESC_DPL3 3
  52. #define IDT_DESC_32_TYPE 0xE // 32 位的门
  53. #define IDT_DESC_16_TYPE 0x6 // 16 位的门,不用,定义它只为和 32 位门区分
  54. #define IDT_DESC_ATTR_DPL0 ((IDT_DESC_P << 7) + (IDT_DESC_DPL0 << 5) + IDT_DESC_32_TYPE)
  55. #define IDT_DESC_ATTR_DPL3 ((IDT_DESC_P << 7) + (IDT_DESC_DPL3 << 5) + IDT_DESC_32_TYPE)
  56. /* 定义 GDT 中描述符的结构 */
  57. // ! 段描述符格式
  58. // ! 31~24 23 22 21 20 19~16 15 14~13 12 11~8 7~0
  59. // ! ----------------------------------------------------------
  60. // ! |Base | G | D | L |AVL| Limit | P | DPL | S | TYPE | Base |
  61. // ! ----------------------------------------------------------
  62. // ! 31~16 15~0
  63. // ! ----------------------------------------------------------
  64. // ! | Base | Limit |
  65. // ! ----------------------------------------------------------
  66. typedef struct gdt_desc
  67. {
  68. uint16_t limit_low_word; // 低 16 位
  69. uint16_t base_low_word;
  70. uint8_t base_middle_byte;
  71. uint8_t attr_low_byte;
  72. uint8_t limit_high_attr_high;
  73. uint8_t base_high_byte;
  74. } GdtDesc;
  75. #endif // __KERNEL_GLOBAL_H