第12章 存储器保护

存储器保护,存储器保护可能禁止程序的非法内存访问,比如向代码段写入数据,访问段界之外的内存位置.一旦发现这些非法操作,在程序失去控制之前引发异常中断.可以提高软件的可靠性.

利用存储器的保证,可以实现虚拟内存管理,当访问一个不在内存中的段时,会引发异常中断,操作系统就可以利用这一点来从磁盘中进行段的换入换出,从而实现在较小的内存空间运行尽可能多的程序.

可用多个段描述符指向同一个段,在保护模式下,代码段是不可写的,再用一个数据段指向它,就可以修改了.(安装一个新的描述符,可读可写的数据段.)

像这样,当两个以上的描述符都指向同一个段的时,把另外的描述符称为别名.别名技术并非仅用于读写代码段,如果两个程序想共享同一个内存区域,可以分别为每个程序都创建一个描述符.

在对段寄存器进行修改的时候,处理器要检查其代入值的合法性.(确认选择子是正确的,并且该选择子选择的描述符也是正确的[比如,若描述符的类别是只执行代码段,则不允许加载到除CS之外的其它寄存器中.])

描述符的类别必须是有效值,比如0000就是一个无效的例子.
第12章 存储器保护_第1张图片
如果描述符的P=0,引发异常中断11.(一般来说,应当定义一个中断处理程序,把该描述符所对应的段从硬盘等外部存储中调入内存,把p=1,中断返回时,处理器将再次尝试该操作.)

代码段在任何时候都是不可写的.只有可以写的数据段才能加入到ss,cs寄存器只允许加载代码段描述符.

栈不允许访问最低端的偏移地址,至于高端地址则没有限制.

代码段是用来执行的,无论如何也不能写入,想写入用别名.

xchg是交换指令,用于交换两个操作数的内容,但不允许两个操作数同时为地址.

         ;代码清单12-1
         ;文件名:c12_mbr.asm
         ;文件说明:硬盘主引导扇区代码 
         ;创建日期:2011-10-27 22:52

         ;设置堆栈段和栈指针 
         mov eax,cs      
         mov ss,eax
         mov sp,0x7c00
      
         ;计算GDT所在的逻辑段地址
         mov eax,[cs:pgdt+0x7c00+0x02]      ;GDT的32位线性基地址 
         xor edx,edx
         mov ebx,16
         div ebx                            ;分解成16位逻辑地址 

         mov ds,eax                         ;令DS指向该段以进行操作
         mov ebx,edx                        ;段内起始偏移地址 

         ;创建0#描述符,它是空描述符,这是处理器的要求
         mov dword [ebx+0x00],0x00000000
         mov dword [ebx+0x04],0x00000000  

         ;创建1#描述符,这是一个数据段,对应0~4GB的线性地址空间
         mov dword [ebx+0x08],0x0000ffff    ;基地址为0,段界限为0xfffff
         mov dword [ebx+0x0c],0x00cf9200    ;粒度为4KB,存储器段描述符 

         ;创建保护模式下初始代码段描述符
         mov dword [ebx+0x10],0x7c0001ff    ;基地址为0x00007c00,512字节 
         mov dword [ebx+0x14],0x00409800    ;粒度为1个字节,代码段描述符 

         ;创建以上代码段的别名描述符
         mov dword [ebx+0x18],0x7c0001ff    ;基地址为0x00007c00,512字节
         mov dword [ebx+0x1c],0x00409200    ;粒度为1个字节,数据段描述符

         mov dword [ebx+0x20],0x7c00fffe
         mov dword [ebx+0x24],0x00cf9600
         
         ;初始化描述符表寄存器GDTR
         mov word [cs: pgdt+0x7c00],39      ;描述符表的界限   
 
         lgdt [cs: pgdt+0x7c00]
      
         in al,0x92                         ;南桥芯片内的端口 
         or al,0000_0010B
         out 0x92,al                        ;打开A20

         cli                                ;中断机制尚未工作

         mov eax,cr0
         or eax,1
         mov cr0,eax                        ;设置PE位
      
         ;以下进入保护模式... ...
         jmp dword 0x0010:flush             ;16位的描述符选择子:32位偏移
                                             
         [bits 32]                          
  flush:                                     
         mov eax,0x0018                      
         mov ds,eax
      
         mov eax,0x0008                     ;加载数据段(0..4GB)选择子
         mov es,eax
         mov fs,eax
         mov gs,eax
      
         mov eax,0x0020                     ;0000 0000 0010 0000
         mov ss,eax
         xor esp,esp                        ;ESP <- 0
      
         mov dword [es:0x0b8000],0x072e0750 ;字符'P'、'.'及其显示属性
         mov dword [es:0x0b8004],0x072e074d ;字符'M'、'.'及其显示属性
         mov dword [es:0x0b8008],0x07200720 ;两个空白字符及其显示属性
         mov dword [es:0x0b800c],0x076b076f ;字符'o'、'k'及其显示属性

         ;开始冒泡排序 
         mov ecx,pgdt-string-1              ;遍历次数=串长度-1 
  @@1:
         push ecx                           ;32位模式下的loop使用ecx 
         xor bx,bx                          ;32位模式下,偏移量可以是16位,也可以 
  @@2:                                      ;是后面的32位 
         mov ax,[string+bx] 
         cmp ah,al                          ;ah中存放的是源字的高字节 
         jge @@3 
         xchg al,ah 
         mov [string+bx],ax 
  @@3:
         inc bx 
         loop @@2 
         pop ecx 
         loop @@1
      
         mov ecx,pgdt-string
         xor ebx,ebx                        ;偏移地址是32位的情况 
  @@4:                                      ;32位的偏移具有更大的灵活性
         mov ah,0x07
         mov al,[string+ebx]
         mov [es:0xb80a0+ebx*2],ax          ;演示0~4GB寻址。
         inc ebx
         loop @@4
      
         hlt 

;-------------------------------------------------------------------------------
     string           db 's0ke4or92xap3fv8giuzjcy5l1m7hd6bnqtw.'
;-------------------------------------------------------------------------------

;-------------------------------------------------------------------------------                             
     times 510-($-$$) db 0
                      db 0x55,0xaa

你可能感兴趣的:(操作系统)