?? page.s
字號(hào):
;/* passed; * 該文件包括頁(yè)異常中斷處理程序(中斷14),主要分兩種情況處理。
; * 一是由于缺頁(yè)引起的頁(yè)異常中斷,通過(guò)調(diào)用do_no_page(error_code, address)來(lái)處理;
; * 二是由頁(yè)寫保護(hù)引起的頁(yè)異常,此時(shí)調(diào)用頁(yè)寫保護(hù)處理函數(shù)do_wp_page(error_code, address)
; * 進(jìn)行處理。其中的出錯(cuò)碼(error_code)是由CPU 自動(dòng)產(chǎn)生并壓入堆棧的,出現(xiàn)異常時(shí)訪問(wèn)的
; * 線性地址是從控制寄存器CR2 中取得的。CR2 是專門用來(lái)存放頁(yè)出錯(cuò)時(shí)的線性地址。; */.586p
.model flat
;/*; * page.s 程序包含底層頁(yè)異常處理代碼。實(shí)際的工作在memory.c 中完成。; */extrn _do_no_page:proc,_do_wp_page:procpublic _page_fault
.code
_page_fault: xchg ss:[esp],eax ;// 取出錯(cuò)碼到eax。 push ecx push edx push ds push es push fs mov edx,10h ;// 置內(nèi)核數(shù)據(jù)段選擇符。 mov ds,dx mov es,dx mov fs,dx mov edx,cr2 ;// 取引起頁(yè)面異常的線性地址 push edx ;// 將該線性地址和出錯(cuò)碼壓入堆棧,作為調(diào)用函數(shù)的參數(shù)。 push eax test eax,1 ;// 測(cè)試標(biāo)志P,如果不是缺頁(yè)引起的異常則跳轉(zhuǎn)。 jne l1 call _do_no_page ;// 調(diào)用缺頁(yè)處理函數(shù)(mm/memory.c,365 行)。 jmp l2 l1: call _do_wp_page ;// 調(diào)用寫保護(hù)處理函數(shù)(mm/memory.c,247 行)。l2: add esp,8 ;// 丟棄壓入棧的兩個(gè)參數(shù)。 pop fs pop es pop ds pop edx pop ecx pop eax iretdend
;/*
; * 當(dāng)處理器在轉(zhuǎn)換線性地址到物理地址的過(guò)程中檢測(cè)到以下兩種條件時(shí),
; * 就會(huì)發(fā)生頁(yè)異常中斷,中斷14。
; * o 當(dāng)CPU 發(fā)現(xiàn)對(duì)應(yīng)頁(yè)目錄項(xiàng)或頁(yè)表項(xiàng)的存在位(Present)標(biāo)志為0。
; * o 當(dāng)前進(jìn)程沒(méi)有訪問(wèn)指定頁(yè)面的權(quán)限。
; * 對(duì)于頁(yè)異常處理中斷,CPU 提供了兩項(xiàng)信息用來(lái)診斷頁(yè)異常和從中恢復(fù)運(yùn)行。
; * (1) 放在堆棧上的出錯(cuò)碼。該出錯(cuò)碼指出了異常是由于頁(yè)不存在引起的還是違反了訪問(wèn)權(quán)限引起的;
; * 在發(fā)生異常時(shí)CPU 的當(dāng)前特權(quán)層;以及是讀操作還是寫操作。出錯(cuò)碼的格式是一個(gè)32 位的長(zhǎng)
; * 字。但只用了最后的3 個(gè)比特位。分別說(shuō)明導(dǎo)致異常發(fā)生時(shí)的原因:
; * 位2(U/S) - 0 表示在超級(jí)用戶模式下執(zhí)行,1 表示在用戶模式下執(zhí)行;
; * 位1(W/R) - 0 表示讀操作,1 表示寫操作;
; * 位0(P) - 0 表示頁(yè)不存在,1 表示頁(yè)級(jí)保護(hù)。
; * (2) CR2(控制寄存器2)。CPU 將造成異常的用于訪問(wèn)的線性地址存放在CR2 中。異常處理程序可以
; * 使用這個(gè)地址來(lái)定位相應(yīng)的頁(yè)目錄和頁(yè)表項(xiàng)。如果在頁(yè)異常處理程序執(zhí)行期間允許發(fā)生另一
; * 個(gè)頁(yè)異常,那么處理程序應(yīng)該將CR2 壓入堆棧中。
; */
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -