我看的《自己動手寫作業系統》,請問最后面的jmp short .3是干什么用的,.3不就是下一條指令嗎,為什么要jmp?
; 啟動分頁機制 --------------------------------------------------------------
SetupPaging:
; 根據記憶體大小計算應初始化多少PDE以及多少頁表
xor edx, edx
mov eax, [dwMemSize]
mov ebx, 400000h ; 400000h = 4M = 4096 * 1024, 一個頁表對應的記憶體大小
div ebx
mov ecx, eax ; 此時 ecx 為頁表的個數,也即 PDE 應該的個數
test edx, edx
jz .no_remainder
inc ecx ; 如果余數不為 0 就需增加一個頁表
.no_remainder:
mov [PageTableNumber], ecx ; 暫存頁表個數
; 為簡化處理, 所有線性地址對應相等的物理地址. 并且不考慮記憶體空洞.
; 首先初始化頁目錄
mov ax, SelectorFlatRW
mov es, ax
mov edi, PageDirBase0 ; 此段首地址為 PageDirBase0
xor eax, eax
mov eax, PageTblBase0 | PG_P | PG_USU | PG_RWW
.1:
stosd
add eax, 4096 ; 為了簡化, 所有頁表在記憶體中是連續的.
loop .1
; 再初始化所有頁表
mov eax, [PageTableNumber] ; 頁表個數
mov ebx, 1024 ; 每個頁表 1024 個 PTE
mul ebx
mov ecx, eax ; PTE個數 = 頁表個數 * 1024
mov edi, PageTblBase0 ; 此段首地址為 PageTblBase0
xor eax, eax
mov eax, PG_P | PG_USU | PG_RWW
.2:
stosd
add eax, 4096 ; 每一頁指向 4K 的空間
loop .2
mov eax, PageDirBase0
mov cr3, eax
mov eax, cr0
or eax, 80000000h
mov cr0, eax
jmp short .3
.3:
nop
ret
; 分頁機制啟動完畢 -----------------------------------------------------
uj5u.com熱心網友回復:
CPU遇到JMP這種轉移指令時會清空其指令流水線,如果直接執行下一條指令,則該指令可能是在mov cr0, eax指令之前就進入了CPU的流水線,完成了取指令和譯碼的程序,如果指令中涉及記憶體地址,由于此時還沒有啟用分頁,所以地址都是線性地址,而執行mov cr0, eax之后開啟了分頁機制,這時的記憶體地址應該使用虛擬地址,所以需要用一個JMP指令將原來已進入流水線的指令清空轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/44532.html
標籤:內核源代碼研究區
