天天看點

英特爾CPU中斷實驗

計算機的相當多的功能都是建立在其支援中斷機制的基礎上的。

本篇文章從細節入手分析下cpu進行中斷的過程。

部分常見中斷

  • 0号中斷:除法錯誤中斷
  • 1号中斷:單步調試中斷
  • 2号中斷:非屏蔽中斷
  • 3号中斷:斷點中斷
  • 4号中斷:溢出中斷

CPU中斷原理

  1. 标緻寄存器

    TF

    位,當CPU檢測到

    TF

    位為1時,會在執行完下一條指令的時候觸發1号中斷。
  2. int3

    指令,機器碼0xCC,cpu執行本條指令後會觸發3号中斷。
  3. into

    指令,機器碼0xCE,cpu執行完本條指令後檢測标志寄存器

    OF

    位,若為1則觸發4号中斷,否則什麼也不做。
  4. 計算機的可屏蔽外中斷中斷控制器是兩個8259A晶片,采用級聯方式,共提供15個外中斷。

    BIOS引導程式中對兩個控制晶片進行初始化,主片提供的中斷号為

    08~0FH

    ,從片中斷号為

    70H~77H

    。從片連接配接到主片中斷号為

    0AH

    引腳上。

    這些中斷為可屏蔽外中斷,所謂可屏蔽是指受CPU标志寄存器

    IF

    位控制,

    IF

    位置位CPU才響應這些中斷,若

    IF

    位清零,則CPU不響應這些中斷的請求,是以程式可以通過改變

    IF

    位來打開或屏蔽這些中斷請求。所用指令為

    sti

    cli

  5. 2号中斷為非屏蔽外中斷,不受CPU狀态影響,CPU收到請求後必須響應。
  6. 外中斷隻有這些,2号不可屏蔽中斷通過一個引腳NMI同CPU連接配接,8259A主片INT引腳通過一個引腳INTR同CPU連接配接,沒有其他外中斷類型了。
  7. 除外中斷外其他中斷為内中斷,即全部來自于CPU内部,也全部都不受标志寄存器屏蔽。

CPU響應中斷過程

  1. 取中斷類型碼也就是中斷号。
  2. 标志寄存器入棧
  3. 标志寄存器

    TF

    IF

    位清零
  4. CS

    IP

    寄存器相繼入棧。
  5. 根據中斷類型碼查找中斷向量表,然後遠轉移到中斷例程執行代碼。

還有一個注意事項就是,CPU在每讀入一條指令後,

IP

寄存器會自動累加讀入指令的長度,進而指向下一條指令,然後才執行本條指令。是先改變

IP

再執行指令。

下面的彙程式設計式示範了CPU響應中斷的過程。

;檔案名:mymbr.asm
;建立日期:2015/02/08
;編譯指令:nasm -f bin mymbr.asm -o mymbr
;
;程式功能:
;	作為主引導扇區(MBR)加載,
;	開機後螢幕左上角顯示字元‘A’,直到按下鍵盤按鍵,顯示字元‘3’,
;	每按下一次按鍵顯示字元‘1’并改變顯示顔色。

[bits 16]					;16位模式編譯
cli						;關閉外中斷
mov ax, 0B800H 			;ds段指向顯存
mov ds, ax						
mov byte [0], 'A' 			;在螢幕左上角顯示字母‘A’

xor ax, ax					;es段指向記憶體位址0
mov es, ax						
mov word [es:3*4], int3_start+07C00H		 ;安裝斷點(3号)中斷入口位址
mov word [es:3*4+2], 0						

mov word [es:1*4], int1_start+07C00H		;安裝單步(1号)中斷入口位址
mov word [es:1*4+2], 0						

mov al, 1111_1111B			;中斷控制器8259從片屏蔽所有外中斷
out 0A1H, al						
and al, 1111_1101B			;中斷控制器8259主片屏蔽除鍵盤中斷(9号)外所有外中斷
out 021H, al						

sti						;打開外中斷
hlt						;進入停機狀态,可以被鍵盤中斷(9号)喚醒
hlt

int3						;觸發斷點中斷(3号)

jmp $					;本條指令無限循環自身

;3号中斷中斷例程
;作用:
;	在螢幕左上角顯示字元‘3’
;	停機等待直到被外中斷喚醒
;	傳回後将标緻寄存器TF位置位
int3_start:					
sti						;打開外中斷	
mov byte [0], '3'				;螢幕左上角顯示字元‘3’
mov bp, sp
or word [bp+4], 0100H		;修改堆棧中标志寄存器TF位為1,使中斷傳回後TF位置位
hlt						;停機等待直到被外中斷喚醒
hlt						
iret						;傳回

;1号中斷中斷例程
;作用:
;	在螢幕左上角顯示字元‘1’,并改變顯示顔色
;	停機等待直到被外中斷喚醒
int1_start:
sti						;打開外中斷
mov byte [0], '1'				;螢幕左上角顯示字元‘1’
inc byte [1]				;改變螢幕左上角顯示顔色
hlt						;停機等待直到被外中斷喚醒
hlt						
iret						;傳回

times 510-($-$$) db 0			;填0補齊,使程式長度正好512位元組
db 55h, 0AAH				;mbr引導區校驗字元