实模式下不能访问1M以上的内存,而且实模式不能提供内存保护。
启示开启实模式只要3个步骤
1.设置gdt全局描述符表
2.设置a20开始访问1M以上内存的必须步骤
3.设置cr0的pe为1,这个表明已经进入了保护模式中。
; ;protect.ASM ; ; ; SECTION ALIGN=16 VSTART=0x7E00 MOV AX , [cs:SS_BASE] MOV SS , AX XOR SP , SP MOV AX , [cs:DS_BASE] MOV DS , AX MOV BX , 0x7C00 ;创建#1描述符,保护模式下的代码段描述符 mov dword [bx],0x0 mov dword [bx+0x04],0x0 ;创建#1描述符,保护模式下的代码段描述符 mov dword [bx+0x08],0x7e0001ff mov dword [bx+0x0c],0x00409800 ;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区) mov dword [bx+0x10],0x8000ffff mov dword [bx+0x14],0x0040920b ;创建#3描述符,保护模式下的堆栈段描述符 mov dword [bx+0x18],0x00007a00 mov dword [bx+0x1c],0x00409600 ;创建#4描述符,保护模式下的代码段描述符 mov dword [bx+0x20],0x7e0001ff mov dword [bx+0x24],0x00F09800 ;创建#5描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区) mov dword [bx+0x28],0x8000ffff mov dword [bx+0x2C],0x00F0920b ;创建#6描述符,保护模式下的堆栈段描述符 mov dword [bx+0x30],0x00007a00 mov dword [bx+0x34],0x00F09600 mov bx , GDT_SIZE mov word [bx] , 47 mov dword [bx+2], 0x7C00 lgdt [bx] in al , 0x92 or al , 0000_0010B out 0x92,al cli mov eax , cr0 or eax , 0x01 mov cr0 ,eax jmp dword 0x0008:(PROTECT_BEGIN-0x7E00) DS_BASE DW 0x0000 SS_BASE DW 0x2000 [bits 32] ZERO_SECTOR DD 0x0,0x0 CS_SECTOR DD 0x0,0x0 DS_SECTOR DD 0x0,0x0 SS_SECTOR DD 0x0,0x0 CS_DPL3_SECTOR DD 0x0,0x0 DS_DPL3_SECTOR DD 0x0,0x0 GDT_SIZE DW 0x00 DGT_BASE DD 0x00000000 PROTECT_BEGIN: mov ax , 16 mov ds , ax mov byte [0] , 'P' mov byte [1] , 0x07 mov byte [2] , 'r' mov byte [3] , 0x07 mov byte [4] , 'o' mov byte [5] , 0x07 mov byte [6] , 't' mov byte [7] , 0x07 mov byte [8] , 'e' mov byte [9] , 0x07 mov byte [10] , 'c' mov byte [11] , 0x07 mov byte [12] , 't' mov byte [13] , 0x07 jmp $ times 512 - ($-$$) db 0 |