【PM复习】页式存储

来源:互联网 发布:淘宝教育视频全屏 编辑:程序博客网 时间:2024/06/04 18:31

     书上说得很明白,无需赘言。

     简单的一一对应的映射的代码如下:

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,Code32_Len - 1,DA_C + DA_32     
  11. LABEL_DESC_CODE16:   
  12.     Descriptor  0,Code16_Len - 1,DA_C   
  13. LABEL_DESC_VIDEO:       
  14.     Descriptor  0b8000h,0ffffh,DA_DRW   
  15. LABEL_DESC_NORMAL:   
  16.     Descriptor  0,0ffffh,DA_DRW   
  17. LABEL_DESC_DIR_BASE:   
  18.     Descriptor  200000h,4095,DA_DRW   
  19. LABEL_DESC_TBL_BASE:   
  20.     Descriptor  201000h,1023,DA_DRW + DA_LIMIT4K   
  21.            
  22. GDT_Len equ $ - LABEL_DESC_DUMMY       
  23. GDT_Ptr:       
  24.     dw  GDT_Len - 1       
  25.     dd  0       
  26.       
  27. Selector_Code32 equ LABEL_DESC_CODE32 - LABEL_DESC_DUMMY       
  28. Selector_Code16 equ LABEL_DESC_CODE16 - LABEL_DESC_DUMMY   
  29. Selector_Video  equ LABEL_DESC_VIDEO - LABEL_DESC_DUMMY       
  30. Selector_Normal equ LABEL_DESC_NORMAL - LABEL_DESC_DUMMY   
  31. Selector_Dir_Base   equ LABEL_DESC_DIR_BASE - LABEL_DESC_DUMMY   
  32. Selector_Tbl_Base   equ LABEL_DESC_TBL_BASE - LABEL_DESC_DUMMY   
  33.       
  34. [section .s16]       
  35. [bits 16]       
  36. LABEL_BEGIN:       
  37.     mov ax,cs       
  38.   mov ds,ax       
  39.   mov es,ax       
  40.      
  41.   mov   [LABEL_GO_BACK_TO_REAL + 3],ax   
  42.            
  43.   Fill_Descriptor   LABEL_DESC_CODE32,LABEL_CODE32   
  44.   Fill_Descriptor   LABEL_DESC_CODE16,LABEL_BEGIN   
  45.            
  46.   xor eax,eax       
  47.   mov ax,ds       
  48.   shl eax,4       
  49.   add eax,LABEL_DESC_DUMMY       
  50.   mov dword [GDT_Ptr + 2],eax       
  51.            
  52.   lgdt    [GDT_Ptr]       
  53.            
  54.   cli       
  55.            
  56.   in  al,92h       
  57.   or  al,00000010b       
  58.   out 92h,al       
  59.            
  60.   mov eax,cr0       
  61.   or  al,1       
  62.   mov cr0,eax       
  63.            
  64.   jmp Selector_Code32:0       
  65.        
  66. _LABEL_PREPARE_GO_BACK_TO_REAL:   
  67. LABEL_PREPARE_GO_BACK_TO_REAL equ   _LABEL_PREPARE_GO_BACK_TO_REAL - $$   
  68.     mov ax,Selector_Normal   
  69.     mov ds,ax   
  70.     mov es,ax   
  71.     mov gs,ax   
  72.     mov fs,ax   
  73.        
  74.     mov eax,cr0   
  75.     and al,11111110b   
  76.     mov cr0,eax   
  77.        
  78. LABEL_GO_BACK_TO_REAL:   
  79.     jmp 0:LABEL_ALREADY_REAL   
  80.        
  81. LABEL_ALREADY_REAL:   
  82.     in  al,92h   
  83.     and al,11111101b   
  84.     out 92h,al   
  85.        
  86.     sti   
  87.        
  88.     mov ax,4c00h   
  89.     int 21h   
  90.        
  91. Code16_Len  equ $ -$$   
  92.       
  93. [section .s32]       
  94. [bits 32]       
  95. LABEL_CODE32:       
  96.     mov ax,Selector_Dir_Base   
  97.     mov es,ax   
  98.     xor edi,edi   
  99.     cld    
  100.     mov ecx,1024   
  101.     mov eax,201000h + 7h   
  102.        
  103. .1:   
  104.     stosd   
  105.     add eax,4096   
  106.     loop .1     
  107.        
  108.     mov ax,Selector_Tbl_Base   
  109.     mov es,ax   
  110.     xor edi,edi   
  111.     mov ecx,1024 * 1024   
  112.     mov eax,7h   
  113.        
  114. .2:   
  115.     stosd   
  116.     add eax,4096   
  117.     loop .2   
  118.        
  119.     mov eax,200000h   
  120.     mov cr3,eax   
  121.        
  122.     mov eax,cr0   
  123.     or  eax,80000000h   
  124.     mov cr0,eax   
  125.   
  126.   mov ax,Selector_Video       
  127.   mov gs,ax       
  128.   mov ah,0ch       
  129.   mov al,'x'      
  130.   mov [gs:80 * 10],ax       
  131.        
  132.   jmp   Selector_Code16:LABEL_PREPARE_GO_BACK_TO_REAL    
  133.   
  134. Code32_Len  equ $ - $$  

     结果如下: