【PM复习】进入保护模式再改进

本文详细解析了段描述符的结构及其各个字段的意义,包括P、DPL、S、TYPE等属性,并介绍了如何通过宏定义设置这些属性。同时,文中还提供了具体的代码示例,展示了如何在实际编程中应用这些描述符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     我们看到,填充描述符时关于属性的部分的地方晦涩了点,就有必要添加一些宏来表示一些属性,下面是从书中抄下来的宏定义和一些注释,作者已经把这些工作做了,我就不用重复劳动了,呵呵。把所有的宏定义放到pm.inc头文件中,以下是代码:

Code:
  1. ; 描述符图示   
  2.   
  3. ; 图示一   
  4. ;   
  5. ;  ------ ┏━━┳━━┓高地址   
  6. ;         ┃ 7  ┃ 段 ┃   
  7. ;         ┣━━┫    ┃   
  8. ;                  基   
  9. ;  字节 7 ┆    ┆    ┆   
  10. ;                  址   
  11. ;         ┣━━┫ ② ┃   
  12. ;         ┃ 0  ┃    ┃   
  13. ;  ------ ┣━━╋━━┫   
  14. ;         ┃ 7  ┃ G  ┃   
  15. ;         ┣━━╉──┨   
  16. ;         ┃ 6  ┃ D  ┃   
  17. ;         ┣━━╉──┨   
  18. ;         ┃ 5  ┃ 0  ┃   
  19. ;         ┣━━╉──┨   
  20. ;         ┃ 4  ┃ AVL┃   
  21. ;  字节 6 ┣━━╉──┨   
  22. ;         ┃ 3  ┃    ┃   
  23. ;         ┣━━┫ 段 ┃   
  24. ;         ┃ 2  ┃ 界 ┃   
  25. ;         ┣━━┫ 限 ┃   
  26. ;         ┃ 1  ┃    ┃   
  27. ;         ┣━━┫ ② ┃   
  28. ;         ┃ 0  ┃    ┃   
  29. ;  ------ ┣━━╋━━┫   
  30. ;         ┃ 7  ┃ P  ┃   
  31. ;         ┣━━╉──┨   
  32. ;         ┃ 6  ┃    ┃   
  33. ;         ┣━━┫ DPL┃   
  34. ;         ┃ 5  ┃    ┃   
  35. ;         ┣━━╉──┨   
  36. ;         ┃ 4  ┃ S  ┃   
  37. ;  字节 5 ┣━━╉──┨   
  38. ;         ┃ 3  ┃    ┃   
  39. ;         ┣━━┫ T  ┃   
  40. ;         ┃ 2  ┃ Y  ┃   
  41. ;         ┣━━┫ P  ┃   
  42. ;         ┃ 1  ┃ E  ┃   
  43. ;         ┣━━┫    ┃   
  44. ;         ┃ 0  ┃    ┃   
  45. ;  ------ ┣━━╋━━┫   
  46. ;         ┃ 23 ┃    ┃   
  47. ;         ┣━━┫    ┃   
  48. ;         ┃ 22 ┃    ┃   
  49. ;         ┣━━┫ 段 ┃   
  50. ;   
  51. ;   字节  ┆    ┆ 基 ┆   
  52. ; 2, 3, 4   
  53. ;         ┣━━┫ 址 ┃   
  54. ;         ┃ 1  ┃ ① ┃   
  55. ;         ┣━━┫    ┃   
  56. ;         ┃ 0  ┃    ┃   
  57. ;  ------ ┣━━╋━━┫   
  58. ;         ┃ 15 ┃    ┃   
  59. ;         ┣━━┫    ┃   
  60. ;         ┃ 14 ┃    ┃   
  61. ;         ┣━━┫ 段 ┃   
  62. ;   
  63. ; 字节 0,1┆    ┆ 界 ┆   
  64. ;   
  65. ;         ┣━━┫ 限 ┃   
  66. ;         ┃ 1  ┃ ① ┃   
  67. ;         ┣━━┫    ┃   
  68. ;         ┃ 0  ┃    ┃   
  69. ;  ------ ┗━━┻━━┛低地址   
  70. ;   
  71.   
  72.   
  73. ; 图示二   
  74.   
  75. ; 高地址………………………………………………………………………低地址   
  76.   
  77. ; |   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0    |   
  78. ; |7654321076543210765432107654321076543210765432107654321076543210|    <- 共 8 字节   
  79. ; |--------========--------========--------========--------========|   
  80. ; ┏━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┓   
  81. ; ┃31..24┃   (见下图)   ┃     段基址(23..0)    ┃ 段界限(15..0)┃   
  82. ; ┃      ┃              ┃                      ┃              ┃   
  83. ; ┃ 基址2┃③│②│    ①┃基址1b│   基址1a     ┃    段界限1   ┃   
  84. ; ┣━━━╋━━━┳━━━╋━━━━━━━━━━━╋━━━━━━━┫   
  85. ; ┃   %6 ┃  %5  ┃  %4  ┃  %3  ┃     %2       ┃       %1     ┃   
  86. ; ┗━━━┻━━━┻━━━┻━━━┻━━━━━━━┻━━━━━━━┛   
  87. ;         │                /_________   
  88. ;         │                          /__________________   
  89. ;         │                                             /________________________________________________   
  90. ;         │                                                                                              /   
  91. ;         ┏━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┓   
  92. ;         ┃ 7  ┃ 6  ┃ 5  ┃ 4  ┃ 3  ┃ 2  ┃ 1  ┃ 0  ┃ 7  ┃ 6  ┃ 5  ┃ 4  ┃ 3  ┃ 2  ┃ 1  ┃ 0  ┃   
  93. ;         ┣━━╋━━╋━━╋━━╋━━┻━━┻━━┻━━╋━━╋━━┻━━╋━━╋━━┻━━┻━━┻━━┫   
  94. ;         ┃ G  ┃ D  ┃ 0  ┃ AVL┃   段界限 2 (19..16)  ┃  P ┃   DPL    ┃ S  ┃       TYPE           ┃   
  95. ;         ┣━━┻━━┻━━┻━━╋━━━━━━━━━━━╋━━┻━━━━━┻━━┻━━━━━━━━━━━┫   
  96. ;         ┃      ③: 属性 2      ┃    ②: 段界限 2      ┃                   ①: 属性1                  ┃   
  97. ;         ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━┛   
  98. ;       高地址                                                                                          低地址   
  99. ;   
  100. ;   
  101.   
  102. ; 说明:   
  103. ;   
  104. ; (1) P:    存在(Present)位。   
  105. ;       P=1 表示描述符对地址转换是有效的,或者说该描述符所描述的段存在,即在内存中;   
  106. ;       P=0 表示描述符对地址转换无效,即该段不存在。使用该描述符进行内存访问时会引起异常。   
  107. ;   
  108. ; (2) DPL:  表示描述符特权级(Descriptor Privilege level),共2位。它规定了所描述段的特权级,用于特权检查,以决定对该段能否访问。    
  109. ;   
  110. ; (3) S:   说明描述符的类型。   
  111. ;       对于存储段描述符而言,S=1,以区别与系统段描述符和门描述符(S=0)。    
  112. ;   
  113. ; (4) TYPE: 说明存储段描述符所描述的存储段的具体属性。   
  114. ;   
  115. ;           
  116. ;   数据段类型   类型值     说明   
  117. ;           ----------------------------------   
  118. ;           0       只读    
  119. ;           1       只读、已访问    
  120. ;           2       读/写    
  121. ;           3       读/写、已访问    
  122. ;           4       只读、向下扩展    
  123. ;           5       只读、向下扩展、已访问    
  124. ;           6       读/写、向下扩展    
  125. ;           7       读/写、向下扩展、已访问    
  126. ;   
  127. ;          
  128. ;           类型值     说明   
  129. ;   代码段类型   ----------------------------------   
  130. ;           8       只执行    
  131. ;           9       只执行、已访问    
  132. ;           A       执行/读    
  133. ;           B       执行/读、已访问    
  134. ;           C       只执行、一致码段    
  135. ;           D       只执行、一致码段、已访问    
  136. ;           E       执行/读、一致码段    
  137. ;           F       执行/读、一致码段、已访问    
  138. ;   
  139. ;          
  140. ;   系统段类型   类型编码    说明   
  141. ;           ----------------------------------   
  142. ;           0       <未定义>   
  143. ;           1       可用286TSS   
  144. ;           2       LDT   
  145. ;           3       忙的286TSS   
  146. ;           4       286调用门   
  147. ;           5       任务门   
  148. ;           6       286中断门   
  149. ;           7       286陷阱门   
  150. ;           8       未定义   
  151. ;           9       可用386TSS   
  152. ;           A       <未定义>   
  153. ;           B       忙的386TSS   
  154. ;           C       386调用门   
  155. ;           D       <未定义>   
  156. ;           E       386中断门   
  157. ;           F       386陷阱门   
  158. ;   
  159. ; (5) G:    段界限粒度(Granularity)位。   
  160. ;       G=0 表示界限粒度为字节;   
  161. ;       G=1 表示界限粒度为4K 字节。   
  162. ;           注意,界限粒度只对段界限有效,对段基地址无效,段基地址总是以字节为单位。    
  163. ;   
  164. ; (6) D:    D位是一个很特殊的位,在描述可执行段、向下扩展数据段或由SS寄存器寻址的段(通常是堆栈段)的三种描述符中的意义各不相同。    
  165. ;           ⑴ 在描述可执行段的描述符中,D位决定了指令使用的地址及操作数所默认的大小。   
  166. ;       ① D=1表示默认情况下指令使用32位地址及32位或8位操作数,这样的代码段也称为32位代码段;   
  167. ;       ② D=0 表示默认情况下,使用16位地址及16位或8位操作数,这样的代码段也称为16位代码段,它与80286兼容。可以使用地址大小前缀和操作数大小前缀分别改变默认的地址或操作数的大小。    
  168. ;           ⑵ 在向下扩展数据段的描述符中,D位决定段的上部边界。   
  169. ;       ① D=1表示段的上部界限为4G;   
  170. ;       ② D=0表示段的上部界限为64K,这是为了与80286兼容。    
  171. ;           ⑶ 在描述由SS寄存器寻址的段描述符中,D位决定隐式的堆栈访问指令(如PUSH和POP指令)使用何种堆栈指针寄存器。   
  172. ;       ① D=1表示使用32位堆栈指针寄存器ESP;   
  173. ;       ② D=0表示使用16位堆栈指针寄存器SP,这与80286兼容。    
  174. ;   
  175. ; (7) AVL:  软件可利用位。80386对该位的使用未左规定,Intel公司也保证今后开发生产的处理器只要与80386兼容,就不会对该位的使用做任何定义或规定。    
  176. ;   
  177.   
  178.   
  179. ;----------------------------------------------------------------------------   
  180. ; 在下列类型值命名中:   
  181. ;       DA_  : Descriptor Attribute   
  182. ;       D    : 数据段   
  183. ;       C    : 代码段   
  184. ;       S    : 系统段   
  185. ;       R    : 只读   
  186. ;       RW   : 读写   
  187. ;       A    : 已访问   
  188. ;       其它 : 可按照字面意思理解   
  189. ;----------------------------------------------------------------------------   
  190.   
  191. ; 描述符类型   
  192. DA_32       EQU 4000h   ; 32 位段   
  193.   
  194. DA_DPL0     EQU   00h   ; DPL = 0   
  195. DA_DPL1     EQU   20h   ; DPL = 1   
  196. DA_DPL2     EQU   40h   ; DPL = 2   
  197. DA_DPL3     EQU   60h   ; DPL = 3   
  198.   
  199. ; 存储段描述符类型   
  200. DA_DR       EQU 90h ; 存在的只读数据段类型值   
  201. DA_DRW      EQU 92h ; 存在的可读写数据段属性值   
  202. DA_DRWA     EQU 93h ; 存在的已访问可读写数据段类型值   
  203. DA_C        EQU 98h ; 存在的只执行代码段属性值   
  204. DA_CR       EQU 9Ah ; 存在的可执行可读代码段属性值   
  205. DA_CCO      EQU 9Ch ; 存在的只执行一致代码段属性值   
  206. DA_CCOR     EQU 9Eh ; 存在的可执行可读一致代码段属性值   
  207.   
  208. ; 系统段描述符类型   
  209. DA_LDT      EQU   82h   ; 局部描述符表段类型值   
  210. DA_TaskGate EQU   85h   ; 任务门类型值   
  211. DA_386TSS   EQU   89h   ; 可用 386 任务状态段类型值   
  212. DA_386CGate EQU   8Ch   ; 386 调用门类型值   
  213. DA_386IGate EQU   8Eh   ; 386 中断门类型值   
  214. DA_386TGate EQU   8Fh   ; 386 陷阱门类型值   
  215.   
  216.   
  217. ; 选择子图示:   
  218. ;         ┏━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┓   
  219. ;         ┃ 15 ┃ 14 ┃ 13 ┃ 12 ┃ 11 ┃ 10 ┃ 9  ┃ 8  ┃ 7  ┃ 6  ┃ 5  ┃ 4  ┃ 3  ┃ 2  ┃ 1  ┃ 0  ┃   
  220. ;         ┣━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━╋━━╋━━┻━━┫   
  221. ;         ┃                                 描述符索引                                 ┃ TI ┃   RPL    ┃   
  222. ;         ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━┻━━━━━┛   
  223. ;   
  224. ; RPL(Requested Privilege Level): 请求特权级,用于特权检查。   
  225. ;   
  226. ; TI(Table Indicator): 引用描述符表指示位   
  227. ;   TI=0 指示从全局描述符表GDT中读取描述符;   
  228. ;   TI=1 指示从局部描述符表LDT中读取描述符。   
  229. ;   
  230.   
  231. ;----------------------------------------------------------------------------   
  232. ; 选择子类型值说明   
  233. ; 其中:   
  234. ;       SA_  : Selector Attribute   
  235.   
  236. SA_RPL0     EQU 0   ; ┓   
  237. SA_RPL1     EQU 1   ; ┣ RPL   
  238. SA_RPL2     EQU 2   ; ┃   
  239. SA_RPL3     EQU 3   ; ┛   
  240.   
  241. SA_TIG      EQU 0   ; ┓TI   
  242. SA_TIL      EQU 4   ; ┛   
  243. ;----------------------------------------------------------------------------   
  244.   
  245. ;宏   
  246.   
  247. ;%1 Base      
  248. ;%2 Limit      
  249. ;%3 Attr      
  250. %macro  Descriptor 3      
  251.     dw %2 & 0ffffh      
  252.     dw %1 & 0ffffh      
  253.     db (%1 >> 16) & 0ffh      
  254.     db %3 & 0ffh      
  255.     db ((%3 >> 8) & 0ffh) | ((%2 >> 16) & 0fh)      
  256.     db (%1 >> 24) & 0ffh      
  257. %endmacro     
  258.   
  259. ;%1 Descriptor's Offset      
  260. ;%2 Segment's Offset      
  261. %macro  Fill_Descriptor 2      
  262.     xor eax,eax      
  263.     mov ax,cs      
  264.     shl eax,4      
  265.     add eax,%2      
  266.     mov word [%1 + 2],ax      
  267.     shr eax,16      
  268.     mov byte [%1 + 4],al      
  269.     mov byte [%1 + 7],ah      
  270. %endmacro    

     下面就是使用了头文件的代码:

Code:
  1. %include "pm.inc"  
  2.   
  3. org 0100h       
  4. jmp LABEL_BEGIN       
  5.       
  6. [section .gdt]       
  7. LABEL_DESC_DUMMY:       
  8.     Descriptor  0,0,0     
  9. LABEL_DESC_CODE32:    
  10.     Descriptor  0,0ffffh,DA_C | DA_32     
  11. LABEL_DESC_VIDEO:       
  12.     Descriptor  0b8000h,0ffffh,DA_DRW   
  13.            
  14. GDT_Len equ $ - LABEL_DESC_DUMMY       
  15. GDT_Ptr:       
  16.     dw  GDT_Len - 1       
  17.     dd  0       
  18.       
  19. Selector_Code32 equ LABEL_DESC_CODE32 - LABEL_DESC_DUMMY       
  20. Selector_Video  equ LABEL_DESC_VIDEO - LABEL_DESC_DUMMY       
  21.       
  22. [section .s16]       
  23. [bits 16]       
  24. LABEL_BEGIN:       
  25.     mov ax,cs       
  26.     mov ds,ax       
  27.     mov es,ax       
  28.            
  29.     Fill_Descriptor LABEL_DESC_CODE32,LABEL_CODE32   
  30.            
  31.     xor eax,eax       
  32.     mov ax,ds       
  33.     shl eax,4       
  34.     add eax,LABEL_DESC_DUMMY       
  35.     mov dword [GDT_Ptr + 2],eax       
  36.            
  37.     lgdt    [GDT_Ptr]       
  38.            
  39.     cli       
  40.            
  41.     in  al,92h       
  42.     or  al,00000010b       
  43.     out 92h,al       
  44.            
  45.     mov eax,cr0       
  46.     or  al,1       
  47.     mov cr0,eax       
  48.            
  49.     jmp Selector_Code32:0       
  50.       
  51. [section .s32]       
  52. [bits 32]       
  53. LABEL_CODE32:       
  54.     mov ax,Selector_Video       
  55.     mov gs,ax       
  56.     mov ah,0ch       
  57.     mov al,'x'      
  58.     mov [gs:80 * 10],ax       
  59.     jmp $       

     结果跟上一节一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值