【PM复习】特权级(4)

     OK,上一节跳转进了RING3,那么就可以利用调用门跳转到RING0了。还有一个问题,就是从特权级低的代码段跳转到特权级高的代码段,堆栈的地址必须从一个叫TSS(任务状态段)的段中取得,段基址保存在TR中,这个段其实也可看成一个数据结构,如图:

     由于我们想跳转到RING0中,那么填充SS0,ESP0就好了,代码如下:

Code:
  1. [section .tss]   
  2. align 32   
  3. [bits 32]   
  4. LABEL_TSS:   
  5.     dd  0   
  6.     dd  Stack_Len   
  7.     dd  Selector_Stack32   
  8.     dd  0   
  9.     dd  0   
  10.     dd  0   
  11.     dd  0   
  12.     dd  0   
  13.     dd  0   
  14.     dd  0   
  15.     dd  0   
  16.     dd  0   
  17.     dd  0   
  18.     dd  0   
  19.     dd  0   
  20.     dd  0   
  21.     dd  0   
  22.     dd  0   
  23.     dd  0   
  24.     dd  0   
  25.     dd  0   
  26.     dd  0   
  27.     dd  0   
  28.     dd  0   
  29.     dd  0   
  30.     dw  0   
  31.     dw  $ - LABEL_TSS + 2   
  32.     db  0ffh   
  33.        
  34. TSS_Len equ $ - LABEL_TSS  

     接着在GDT中添加一个描述符和选择子来描述TSS,填充TSS的基地址也是必要的:

Code:
  1. LABEL_DESC_TSS:   
  2.     Descriptor  0,TSS_Len - 1,DA_386TSS  
  3. ...
  4. Selector_TSS equ LABEL_DESC_TSS - LABEL_DESC_DUMMY
Code:
  1. Fill_Descriptor LABEL_DESC_TSS,LABEL_TSS  

     然后加载TR:

Code:
  1. call    Read_Test   
  2. call    Disp_Return   
  3. call    Write_Test   
  4. call    Read_Test   
  5.   
  6. mov ax,Selector_TSS   
  7. ltr ax   
  8.   
  9. push    Selector_Ring3_Stack32   
  10. push    Ring3_Stack32_Len   
  11. push    Selector_Ring3_Code32   
  12. push    0   
  13. retf  

     OK,下面可以添加门描述符了,门描述符跟数据段或代码段描述符有点不同,结构如图所示:

     由此图来添加一个Gate宏:

Code:
  1. ;%1 Selector   
  2. ;%2 Offset   
  3. ;%3 Para Count   
  4. ;%4 Attr   
  5. %macro Gate 4   
  6.     dw %2 & 0ffffh   
  7.     dw %1 & 0ffffh   
  8.     db %3 & 00011111b   
  9.     db %4 & 0ffh   
  10.     dw (%2 >> 16) & 0ffffh   
  11. %endmacro  

     接着在GDT中添加一个描述符定义一个调用门,选择子也是必要的,由于是在RING3中使用调用门,所以描述符的DPL和选择子的RPL都要设置为3:

Code:
  1. LABEL_DESC_CALL_GATE:   
  2.     Gate    Selector_Code32,LABEL_CALL_GATE_DEST,0,DA_386CGate + DA_DPL3  
  3. ...
  4. Selector_Call_Gate equ LABEL_DESC_CALL_GATE - LABEL_DESC_DUMMY + SA_RPL3

     标号LABEL_CALL_GATE_DEST,放在加载ldtr之前:

Code:
  1.   push  Selector_Ring3_Stack32   
  2.   push  Ring3_Stack32_Len   
  3.   push  Selector_Ring3_Code32   
  4.   push  0   
  5.   retf   
  6.      
  7. _LABEL_CALL_GATE_DEST:   
  8. LABEL_CALL_GATE_DEST    equ _LABEL_CALL_GATE_DEST - $$   
  9.   mov   ax,Selector_LDT   
  10.   lldt  ax  

     然后在RING3代码段中使用调用门,取代原来的死循环:

Code:
  1. ;   jmp $   
  2.     call Selector_Call_Gate:0  

     OK,全部代码如下:

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,GDT_Code32_Len - 1,DA_C + DA_32     
  11. LABEL_DESC_CODE16:   
  12.     Descriptor  0,GDT_Code16_Len - 1,DA_C   
  13. LABEL_DESC_VIDEO:       
  14.     Descriptor  0b8000h,0ffffh,DA_DRW + DA_DPL3   
  15. LABEL_DESC_DATA:   
  16.     Descriptor  0,Data_Len - 1,DA_DRW   
  17. LABEL_DESC_TEST:   
  18.     Descriptor  50000h,0ffffh,DA_DRW   
  19. LABEL_DESC_STACK32:    
  20.     Descriptor  0,Stack_Len - 1,DA_DRW + DA_32   
  21. LABEL_DESC_RING3_STACK32:   
  22.     Descriptor  0,Ring3_Stack32_Len - 1,DA_DRW + DA_32 + DA_DPL3   
  23. LABEL_DESC_RING3_CODE32:   
  24.     Descriptor  0,Ring3_Code32_Len - 1,DA_C + DA_32 + DA_DPL3   
  25. LABEL_DESC_NORMAL:   
  26.     Descriptor  0,0ffffh,DA_DRW   
  27. LABEL_DESC_LDT:   
  28.     Descriptor  0,LDT_Len - 1,DA_LDT   
  29. LABEL_DESC_TSS:   
  30.     Descriptor  0,TSS_Len - 1,DA_386TSS   
  31. LABEL_DESC_CALL_GATE:   
  32.     Gate    Selector_Code32,LABEL_CALL_GATE_DEST,0,DA_386CGate + DA_DPL3   
  33.            
  34. GDT_Len equ $ - LABEL_DESC_DUMMY       
  35. GDT_Ptr:       
  36.     dw  GDT_Len - 1       
  37.     dd  0       
  38.       
  39. Selector_Code32 equ LABEL_DESC_CODE32 - LABEL_DESC_DUMMY       
  40. Selector_Code16 equ LABEL_DESC_CODE16 - LABEL_DESC_DUMMY   
  41. Selector_Video  equ LABEL_DESC_VIDEO - LABEL_DESC_DUMMY + SA_RPL3    
  42. Selector_Data       equ LABEL_DESC_DATA - LABEL_DESC_DUMMY     
  43. Selector_Test       equ LABEL_DESC_TEST - LABEL_DESC_DUMMY   
  44. Selector_Stack32 equ    LABEL_DESC_STACK32 - LABEL_DESC_DUMMY   
  45. Selector_Normal equ LABEL_DESC_NORMAL - LABEL_DESC_DUMMY   
  46. Selector_LDT        equ LABEL_DESC_LDT - LABEL_DESC_DUMMY   
  47. Selector_Ring3_Stack32  equ LABEL_DESC_RING3_STACK32 - LABEL_DESC_DUMMY + SA_RPL3   
  48. Selector_Ring3_Code32       equ LABEL_DESC_RING3_CODE32 -   LABEL_DESC_DUMMY + SA_RPL3   
  49. Selector_TSS    equ LABEL_DESC_TSS - LABEL_DESC_DUMMY   
  50. Selector_Call_Gate  equ LABEL_DESC_CALL_GATE - LABEL_DESC_DUMMY + SA_RPL3   
  51.   
  52. [section .ldt]   
  53. LABEL_LDT:   
  54.     Descriptor  0,0,0   
  55. LABEL_LDT_DESC_CODE32:   
  56.     Descriptor  0,LDT_Code32_Len - 1,DA_C + DA_32   
  57.   
  58. Selector_LDT_Code32 equ LABEL_LDT_DESC_CODE32 - LABEL_LDT + SA_TIL   
  59. LDT_Len equ $ - $$   
  60.   
  61.   
  62. [section .stack32]   
  63. [bits 32]   
  64. LABEL_STACK32:   
  65.     times 512 db 0   
  66. Stack_Len   equ $ - $$   
  67.   
  68. [section .ring3_stack32]   
  69. [bits 32]   
  70. LABEL_RING3_STACK32:   
  71.     times 512   db 0   
  72. Ring3_Stack32_Len   equ $ - $$   
  73.   
  74. [section .data]   
  75. LABEL_DATA:   
  76. _d_Disp_Pos dd  160 * 5   
  77. d_Disp_Pos  equ _d_Disp_Pos - $$   
  78. _w_SP_Value_In_Real_Mode    dw  0   
  79. w_SP_Value_In_Real_Mode equ _w_SP_Value_In_Real_Mode - $$   
  80.   
  81. Data_Len    equ $ - $$   
  82.   
  83. [section .tss]   
  84. align 32   
  85. [bits 32]   
  86. LABEL_TSS:   
  87.     dd  0   
  88.     dd  Stack_Len   
  89.     dd  Selector_Stack32   
  90.     dd  0   
  91.     dd  0   
  92.     dd  0   
  93.     dd  0   
  94.     dd  0   
  95.     dd  0   
  96.     dd  0   
  97.     dd  0   
  98.     dd  0   
  99.     dd  0   
  100.     dd  0   
  101.     dd  0   
  102.     dd  0   
  103.     dd  0   
  104.     dd  0   
  105.     dd  0   
  106.     dd  0   
  107.     dd  0   
  108.     dd  0   
  109.     dd  0   
  110.     dd  0   
  111.     dd  0   
  112.     dw  0   
  113.     dw  $ - LABEL_TSS + 2   
  114.     db  0ffh   
  115.        
  116. TSS_Len equ $ - LABEL_TSS   
  117.       
  118. [section .s16]       
  119. [bits 16]       
  120. LABEL_BEGIN:       
  121.     mov ax,cs       
  122.   mov ds,ax       
  123.   mov es,ax       
  124.   mov   ax,ss   
  125.   mov   sp,0100h   
  126.      
  127.   mov   [LABEL_GO_BACK_TO_REAL + 3],ax   
  128.            
  129.   Fill_Descriptor   LABEL_DESC_CODE32,LABEL_CODE32   
  130.   Fill_Descriptor   LABEL_DESC_CODE16,LABEL_BEGIN   
  131.   Fill_Descriptor   LABEL_DESC_DATA,LABEL_DATA   
  132.   Fill_Descriptor   LABEL_DESC_STACK32,LABEL_STACK32   
  133.   Fill_Descriptor   LABEL_DESC_LDT,LABEL_LDT   
  134.   Fill_Descriptor   LABEL_LDT_DESC_CODE32,LABEL_LDT_CODE32   
  135.   Fill_Descriptor   LABEL_DESC_RING3_STACK32,LABEL_RING3_STACK32   
  136.   Fill_Descriptor   LABEL_DESC_RING3_CODE32,LABEL_RING3_CODE32   
  137.   Fill_Descriptor   LABEL_DESC_TSS,LABEL_TSS   
  138.            
  139.   xor eax,eax       
  140.   mov ax,ds       
  141.   shl eax,4       
  142.   add eax,LABEL_DESC_DUMMY       
  143.   mov dword [GDT_Ptr + 2],eax       
  144.            
  145.   lgdt  [GDT_Ptr]       
  146.      
  147.   mov   [w_SP_Value_In_Real_Mode],sp   
  148.            
  149.   cli       
  150.            
  151.   in  al,92h       
  152.   or  al,00000010b       
  153.   out 92h,al       
  154.            
  155.   mov eax,cr0       
  156.   or  al,1       
  157.   mov cr0,eax       
  158.            
  159.   jmp dword Selector_Code32:0       
  160.        
  161. _LABEL_PREPARE_GO_BACK_TO_REAL:   
  162. LABEL_PREPARE_GO_BACK_TO_REAL equ   _LABEL_PREPARE_GO_BACK_TO_REAL - $$   
  163.     mov ax,Selector_Normal   
  164.     mov ds,ax   
  165.     mov es,ax   
  166.     mov ss,ax   
  167.     mov sp,[w_SP_Value_In_Real_Mode]   
  168.     mov gs,ax   
  169.     mov fs,ax   
  170.        
  171.     mov eax,cr0   
  172.     and al,11111110b   
  173.     mov cr0,eax   
  174.        
  175. LABEL_GO_BACK_TO_REAL:   
  176.     jmp 0:LABEL_ALREADY_REAL   
  177.        
  178. LABEL_ALREADY_REAL:   
  179.     in  al,92h   
  180.     and al,11111101b   
  181.     out 92h,al   
  182.        
  183.     sti   
  184.        
  185.     mov ax,4c00h   
  186.     int 21h   
  187.        
  188. GDT_Code16_Len  equ $ - $$   
  189.       
  190. [section .s32]   
  191. [bits 32]   
  192. LABEL_LDT_CODE32:   
  193.     mov ax,Selector_Video       
  194.   mov gs,ax       
  195.   mov ah,0ch       
  196.   mov al,'x'      
  197.   mov [gs:160 * 14],ax     
  198.      
  199.   jmp   Selector_Code16:LABEL_PREPARE_GO_BACK_TO_REAL    
  200.      
  201. LDT_Code32_Len  equ $ - $$   
  202.   
  203. [section .r3s32]   
  204. [bits 32]   
  205. LABEL_RING3_CODE32:   
  206.     mov ax,Selector_Video       
  207.   mov gs,ax       
  208.   mov ah,0ch       
  209.   mov al,'3'      
  210.   mov [gs:160 * 10],ax   
  211.      
  212.     call Selector_Call_Gate:0   
  213.     
  214.  Ring3_Code32_Len   equ $ - $$   
  215.      
  216. [section .s32]       
  217. [bits 32]       
  218. LABEL_CODE32:       
  219.   ;mov ax,Selector_Video       
  220.   ;mov gs,ax       
  221.   ;mov ah,0ch       
  222.   ;mov al,'x'      
  223.   ;mov [gs:80 * 10],ax       
  224.      
  225.   mov   ax,Selector_Stack32   
  226.   mov   ss,ax   
  227.   mov   esp,Stack_Len   
  228.      
  229.   mov   ax,Selector_Data   
  230.   mov   ds,ax   
  231.   mov   ax,Selector_Video   
  232.   mov   gs,ax   
  233.   mov   ax,Selector_Test   
  234.   mov   fs,ax   
  235.      
  236.   call  Read_Test   
  237.   call  Disp_Return   
  238.   call  Write_Test   
  239.   call  Read_Test   
  240.      
  241.   mov ax,Selector_TSS   
  242.   ltr   ax   
  243.      
  244.   push  Selector_Ring3_Stack32   
  245.   push  Ring3_Stack32_Len   
  246.   push  Selector_Ring3_Code32   
  247.   push  0   
  248.   retf   
  249.   
  250. _LABEL_CALL_GATE_DEST:   
  251. LABEL_CALL_GATE_DEST    equ _LABEL_CALL_GATE_DEST - LABEL_CODE32   
  252. ;   jmp $   
  253.   mov   ax,Selector_LDT   
  254.   lldt  ax   
  255.     jmp Selector_LDT_Code32:0     
  256. Read_Test:   
  257.     push    ebp   
  258.     mov ebp,esp   
  259.     push    ecx   
  260.     push    esi   
  261.        
  262.     mov ecx,8   
  263.     xor esi,esi   
  264.   
  265. .loop:   
  266.     mov al,[fs:esi]   
  267.     call    Disp_Al   
  268.     inc esi   
  269.     loop    .loop   
  270.        
  271.     pop esi   
  272.     pop ecx   
  273.     pop ebp   
  274.     ret   
  275.        
  276. Write_Test:   
  277.     push    ebp   
  278.     mov ebp,esp   
  279.     push    eax   
  280.     push    ecx   
  281.     push    esi   
  282.        
  283.     xor eax,eax   
  284.     mov eax,'A'  
  285.     xor esi,esi   
  286.     mov ecx,8   
  287.   
  288. .loop:   
  289.     mov [fs:esi],al   
  290.     inc esi   
  291.     inc eax   
  292.     loop .loop   
  293.        
  294.     pop esi   
  295.     pop ecx   
  296.     pop eax   
  297.     pop ebp   
  298.     ret   
  299.   
  300. Disp_Al:   
  301.     push    ebp   
  302.     mov ebp,esp   
  303.        
  304.     push    esi   
  305.     push    ecx   
  306.     push    eax   
  307.     mov ecx,2   
  308.     shr al,4   
  309.        
  310. .loop:   
  311.     and al,0fh   
  312.     cmp al,9   
  313.     jb  .1   
  314.     add al,7   
  315.        
  316. .1:   
  317.     add al,30h   
  318.     mov esi,[d_Disp_Pos]   
  319.     mov byte [gs:esi],al   
  320.     mov byte [gs:esi + 1],0ch   
  321.     add dword [d_Disp_Pos],2   
  322.        
  323.     dec ecx   
  324.     cmp ecx,0   
  325.     je  .2   
  326.     pop eax   
  327.     jmp .loop   
  328.        
  329. .2:   
  330.     pop ecx   
  331.     pop esi   
  332.     pop ebp   
  333.     ret   
  334.        
  335. Disp_Return:   
  336.     push    ebp   
  337.     mov ebp,esp   
  338.     push    eax   
  339.     push    ebx   
  340.        
  341.     mov eax,[d_Disp_Pos]   
  342.     mov bl,160   
  343.     div bl   
  344.     and eax,0ffh   
  345.     inc ax   
  346.     mov bl,160   
  347.     mul bl   
  348.     mov [d_Disp_Pos],eax   
  349.        
  350.     pop ebx   
  351.     pop eax   
  352.     pop ebp   
  353.     ret   
  354.   
  355. GDT_Code32_Len  equ $ - $$  

     运行结果如图所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值