書上說得很明白,無需贅言。
簡單的一一對應的對映的**如下:
code:
%include "pm.inc"
org 0100h
jmp label_begin
[section .gdt]
label_desc_dummy:
descriptor 0,0,0
label_desc_code32:
descriptor 0,code32_len - 1,da_c + da_32
label_desc_code16:
descriptor 0,code16_len - 1,da_c
label_desc_video:
descriptor 0b8000h,0ffffh,da_drw
label_desc_normal:
descriptor 0,0ffffh,da_drw
label_desc_dir_base:
descriptor 200000h,4095,da_drw
label_desc_tbl_base:
descriptor 201000h,1023,da_drw + da_limit4k
gdt_len equ $ - label_desc_dummy
gdt_ptr:
dw gdt_len - 1
dd 0
selector_code32 equ label_desc_code32 - label_desc_dummy
selector_code16 equ label_desc_code16 - label_desc_dummy
selector_video equ label_desc_video - label_desc_dummy
selector_normal equ label_desc_normal - label_desc_dummy
selector_dir_base equ label_desc_dir_base - label_desc_dummy
selector_tbl_base equ label_desc_tbl_base - label_desc_dummy
[section .s16]
[bits 16]
label_begin:
mov ax,cs
mov ds,ax
mov es,ax
mov [label_go_back_to_real + 3],ax
fill_descriptor label_desc_code32,label_code32
fill_descriptor label_desc_code16,label_begin
xor eax,eax
mov ax,ds
shl eax,4
add eax,label_desc_dummy
mov dword [gdt_ptr + 2],eax
lgdt [gdt_ptr]
cli
in al,92h
or al,00000010b
out 92h,al
mov eax,cr0
or al,1
mov cr0,eax
jmp selector_code32:0
_label_prepare_go_back_to_real:
label_prepare_go_back_to_real equ _label_prepare_go_back_to_real - $$
mov ax,selector_normal
mov ds,ax
mov es,ax
mov gs,ax
mov fs,ax
mov eax,cr0
and al,11111110b
mov cr0,eax
label_go_back_to_real:
jmp 0:label_already_real
label_already_real:
in al,92h
and al,11111101b
out 92h,al
sti
mov ax,4c00h
int 21h
code16_len equ $ -$$
[section .s32]
[bits 32]
label_code32:
mov ax,selector_dir_base
mov es,ax
xor edi,edi
cld
mov ecx,1024
mov eax,201000h + 7h
.1:
stosd
add eax,4096
loop .1
mov ax,selector_tbl_base
mov es,ax
xor edi,edi
mov ecx,1024 * 1024
mov eax,7h
.2:
stosd
add eax,4096
loop .2
mov eax,200000h
mov cr3,eax
mov eax,cr0
or eax,80000000h
mov cr0,eax
mov ax,selector_video
mov gs,ax
mov ah,0ch
mov al,'x'
mov [gs:80 * 10],ax
jmp selector_code16:label_prepare_go_back_to_real
code32_len equ $ - $$
結果如下:
頁式儲存管理
作業系統原理 頁式儲存管理 記憶體分割槽儲存管理的乙個特點是連續性,每個程式都分有一片連續的記憶體區域。這種連續性導致碎片問題,包括 固定分割槽中的內碎片和可變分割槽中的外碎片。為了解決這些問題,人們又提出了 頁式儲存管理方案 它的基本出發點 是打破儲存分配的連續性,使乙個程式的邏輯位址空間可以分布...
頁式儲存管理
基本原理 1 等分記憶體 頁式儲存管理將記憶體空間劃分成等長的若干區域,每個區域的大小一般取2的整數冪,稱為乙個物理頁面有時稱為塊。記憶體的所有物理頁面從0開始編號,稱作物理頁號。2 邏輯位址 系統將程式的邏輯空間按照同樣大小也劃分成若干頁面,稱為邏輯頁面也稱為頁。程式的各個邏輯頁面從0開始依次編號...
段頁式儲存管理
段頁式儲存管理技術的基本思想 段頁式儲存管理技術試圖結合分段儲存管理在邏輯上的優點以及分頁儲存管理在物理上的優點,它是採用分段方法來分配和管理使用者的作業位址空間,採用分頁的方法來分配和管理主存 的儲存空間。即把作業分段,段內再分成也,主存分配以頁為單位。在段頁式儲存管理系統中,作業的位址空間被劃分...