第6章 豐富中斷處理程式

2021-05-25 18:48:07 字數 3095 閱讀 1493

前面的中斷處理程式

過於簡單了,只有一句iretd,而且這個時鐘中斷處理程式也只能發生一次,因為沒有通知8259a本次中斷處理程式已結束。就算處理程式能反覆執行,我們也不能看到結果,所以還要在中斷處理程式中新增一點顯示資訊來使我們知道中斷程式在執行,下面就來修改:

hw_int_00:

;push    0;

;call    irq_handler

;add        esp,4

;hlt

mov al,20h

out 20h,al

inc byte [gs:0]

iretd

最好每前進一步就make一下,以便發現錯誤能及早發現,下面是結果:

可以看到左上角的字元按照ascii碼的順序在跳動,這時顯示的是感嘆號。

由於在以後的時鐘中斷處理程式中我們想處理更多的問題,如程序排程等。那就免不了要使用暫存器了,那麼在使用之前就必須把當前的暫存器的值儲存到當前程序的pcb中,所以在中斷程式剛剛開始的地方需要把各暫存器的值儲存在當前的pcb中,由於tss中的esp0欄位剛好指向當前程序pcb的暫存器組的最高位置,所以使用

就可以直接進行壓棧操作了,在中斷處理程式將要結束時就把pcb中的值再pop出去,下面修改一下**:

hw_int_00:

;push    0;

;call    irq_handler

;add        esp,4

;hlt

pushad

push    ds

push    es

push    fs

push    gs

mov al,20h

out 20h,al

inc byte [gs:0]

pop    gs

pop    fs

pop es

pop    ds

popad

iretd

如果是修改tss中esp0的問題,如果我們有多個程序,需要在時鐘中斷處理程式中切換時,我們需要在中斷處理程式中把esp0切到想要切換的那個程序的pcb的暫存器組的最高位置。現在的程式中只有乙個程序在執行,所以這樣做暫時是做無用功,那以後我們還是要實現多程序的,所以先這樣做吧,免得以後忘記了,下面是修改:

hw_int_00:

;push    0;

;call    irq_handler

;add        esp,4

;hlt

pushad

push    ds

push    es

push    fs

push    gs

mov    al,20h

out 20h,al

inc byte [gs:0]

lea  eax,[esp + 68]

mov  dword [tss + 4],eax

pop    gs

pop    fs

pop    es

pop    ds

popad

iretd

還有乙個重要的問題,就是在時鐘中斷處理程式中免不了要使用堆疊,而經過一番push之後esp指向的是當前程序pcb的暫存器組的最低位置,如果此時在中斷處理程式中呼叫乙個函式的話,就會殃及到上乙個程序的pcb,造成混亂。所以我們必須把堆疊切換到核心堆疊,而在中斷處理程式將返回時把esp0又重新切換到當前程序的pcb的暫存器組的最高位置處,還得把ds,es切換回在gdt下的描述符,下面就來修改:

hw_int_00:

;push    0;

;call    irq_handler

;add     esp,4

;hlt

pushad

push    ds

push    es

push    fs

push    gs

mov    dx,ss

mov    ds,dx

mov    es,dx

mov    esp,top_of_stack

mov al,20h

out 20h,al

inc byte [gs:0]

mov    esp,[p_resume_pcb]

lea eax,[esp + 68]

mov    dword [tss + 4],eax

pop    gs

pop    fs

pop    es

pop    ds

popad

iretd

這樣,我們的時鐘中斷處理程式稍微完善了一點,可以在中斷程式中做我們想做的事情,如可以自由的呼叫一些函式而無需擔心堆疊引起的問題,下面我們想在中斷的過程中列印一些字元,下面來修改一下:

extern disp_color_str

...[section .data]

int_msg:    db '*',0

...hw_int_00:

;push    0;

;call    irq_handler

;add        esp,4

;hlt

pushad

push    ds

push    es

push    fs

push    gs

mov    dx,ss

mov    ds,dx

mov    es,dx

mov    esp,top_of_stack

mov    al,20h

out 20h,al

inc byte [gs:0]

mov    eax,0dh

push    eax

push    int_msg

add    esp,8

mov    esp,[p_resume_pcb]

lea eax,[esp + 68]

mov    dword [tss + 4],eax

pop    gs

pop    fs

pop    es

pop    ds

popad

iretd

在bochs下的執行結果如下:

可見,兩個虛擬機器的速度有明顯的差距啊。。

第6章 中斷和中斷處理程式 學習筆記

1 硬體傳送乙個中斷碼給cpu,該中斷碼被稱為中斷請求線 2 中斷服務例程 isr 他是裝置驅動程式的一部分,裝置驅動程式是用於管理裝置的核心 isr是被核心呼叫來響應中斷的,它執行於中斷上下文 3 中斷上下文 如網絡卡接收到資料告訴核心包到了,網絡卡在等核心的回答 同時網絡卡還有優化吞吐量等工作要...

第4章 外部匯流排 第5章 中斷處理

第4章.外部匯流排 外部匯流排提供外部裝置定址並且可以對51mx裝置進行 讀取,資料讀寫操作。外部匯流排使用相同的經典的80c51多路外部匯流排 並允許增加輸出位址為23位。4.1 多路外部匯流排 51mx外部匯流排支援8位資料傳輸並且支援23位位址口線。需要通過設定mxcon暫存器的eam位來配置...

第6章 MSI和MSI X中斷機制

在 pci匯流排中,所有需要提交中斷請求的裝置,必須能夠通過 intx 引腳提交中斷請求,而 msi機制是乙個可選機制。而在 pcie 匯流排中,pcie 裝置必須支援 msi或者 msi x 中斷請求機制,而可以不支援 intx 中斷訊息。在 pcie 匯流排中,msi和 msi x 中斷機制使用...