微軟早期的dos系統,存在乙個嚴重的問題是,如果應用程式執行出現問題,它會導致整個系統完全奔潰掉,我們當前的系統核心也存在這一的問題,例如開啟api_call.asm,其內容如下:
[section .s32]
bits 32
call main
retf
api_putchar:
mov edx, 1
mov al, [esp + 4]
int 02dh
ret
call main 時cpu控制權會提交給應用程式,執行應用程式的**,應用程式執行完畢後,返回到call main語句的下一條指令繼續執行,call main 的下一條語句是retf, 它的作用是從堆疊上得到核心**的全域性描述符,把該描述符在描述符表中的下標賦值給暫存器cs, 同時把核心要執行語句的位址從堆疊上取得,並賦值給暫存器ip, 這樣cpu的控制器會重新交還給核心,假設我們對上面**做乙個修改如下:
[section .s32]
bits 32
call main
pop eax ;故意讓返回位址出錯造成異常保護中斷
retf
....
我們在執行retf語句時,把儲存在堆疊上的核心要執行的語句位址彈出,這樣要返回的核心位址就會遭遇破壞,當執行retf語句後,ip指標會執行記憶體的任意乙個無法確定的地方,於是cpu在接下來的執行中就會遇到錯誤,上面**修改後執行起來,情況如下:
由於ip指標指向了無效位址,致使cpu執行了無效指令進而導致系統的整體奔潰,接下來我們看看如何處理讓系統從這種嚴重錯誤中恢復回來,這樣就可以防止應用程式執行惡意**而對系統造成傷害。
當cpu在執行指令出現錯誤時,例如遇到了無效指令,那麼cpu會出發0dh號中斷,讓該中斷來處理當前所出現的異常局面,如果該中斷無法處理,那麼cpu就會停止執行,於是就出現了上面的情況。為了讓系統能從錯誤中恢復,我們需要實現0dh號中斷,在中斷中,我們直接結束掉當前正在執行的應用程式,直接把cpu的控制全交還給核心。
我們現在kernel.asm中註冊0dh號中斷,**修改如下:
label_idt:
%rep
13gate selectorcode32, spurioushandler,0, da_386igate
%endrep
.0dh:
gate selectorcode32, exceptionhandler,0, da_386igate
%rep
18gate selectorcode32, spurioushandler,0, da_386igate
%endrep
上面**在中斷描述符表中註冊了乙個0dh號中斷,當中斷傳送時,cpu會呼叫exceptionhandler函式。我們看看該函式的實現,同樣也是在kernel.asm中:
_exceptionhandler:
exceptionhandler equ _exceptionhandler - $$
cli;把記憶體段切換到核心
mov ax, selectorvram
mov ds, ax
mov es, ax
mov ax, selectorstack ;切換到核心堆疊段
mov ss, ax
mov ecx, [0xfe4];獲取核心堆疊指標
add ecx, -8
mov [ecx+4], ss ;儲存中斷時的堆疊段
mov [ecx], esp ;儲存中斷時堆疊指標
mov esp, ecx ;切換核心指標
call inthandlerforexception
.kill:
;通過把cpu交給核心的方式直接殺掉應用程式
mov esp, [0xfe4]
stipopad
ret
中斷執行時,先把核心專有記憶體段的描述符賦值給暫存器ds,es,這樣**執行時可以直接讀寫核心的資料,同時把核心的堆疊描述符賦值給暫存器ss,這樣**執行時使用的堆疊就是核心的專有堆疊。然後把錯誤發生時的應用程式使用的堆疊段描述符和堆疊指標存入核心堆疊,接著呼叫函式inthandlerforexception進行錯誤處理,該函式實現在核心的c語言部分,也就是在write_vga_desktop.c中,我們看看此函式的實現:
void inthandlerforexception(int *esp)
cli
pushad
...mov [0xfe4], esp
...
void cmd_hlt()
這樣,當應用程式執行出現嚴重錯誤時,cpu觸發0dh號異常處理中斷,在該中斷中,**會把cpu控制權直接交還給核心,著就相當於把出現異常的應用程式毀屍滅跡,核心就好像什麼事都沒發生過一樣,繼續按照老樣子執行,上面**修改後,執行錯誤的應用程式後,情況如下:
由此可見,當錯誤發生時0dh號中斷確實被呼叫了,兩行字串被顯示到控制台,然後核心可以正常繼續執行而不會像前面的例子一樣,整個系統會奔潰掉。
java開發系統核心 自動化程序切換
我們已經通過時鐘中斷完成了兩個程序間的相互切換。但當前實現有很大的缺陷,例如我們只能在兩個指定的程序間切換,如果要想增添新的程序,那麼,沒增加乙個程序,按照當前模式,我們只能再增加相應 這顯然是不可接受的。因此,這節,我們希望完成程序的切換機制,使得有新程序時,我們無需改動 程序的管理機制會自動把新...
java開發系統核心 鍵盤和視窗關閉API
在上節,我們成功的執行起了視窗程式,但是生成的視窗無法關閉,本節我們要在核心提供乙個關閉視窗的api,還要提供乙個鍵盤訊息獲取的api,這樣應用程式就可以等待乙個某個按鍵,當使用者按下按鍵後,就可以呼叫視窗關閉api將視窗從桌面上消除。視窗關閉api的設定如下 edx 14 ebx 視窗控制代碼 然...
Java核心中的核心 多型
一句話概括多型 也叫動態繫結 在執行期間,判斷其引用的實際型別,根據其實際的型別,呼叫對應的方法。多型可以幫助我們的程式的顆擴充套件性達到極致。多型的三個必要條件 1 要有繼承。2 子類要重寫父類的方法。3 父類的引用指向子類的物件。根據以下的 來理解 class animal 在animal類裡面...