1. 程式人生 > >《一個作業系統的實現》讀書筆記--第三章--中斷機制

《一個作業系統的實現》讀書筆記--第三章--中斷機制

1、中斷產生的原因
2、如何將中斷向量與中斷服務程式關聯起來
3、外部中斷

一、中斷

中斷產生的原因有兩種:一是外部中斷,就是由硬體產生的中斷;另一種是由指令int n產生的中斷。

二、如何將中斷向量與中斷服務程式關聯起來

1、真實模式下:


這個過程很簡單,就是通過int n中的n,去中斷向量表中獲取該中斷的中斷服務程式的CS和IP,然後載入CS和IP,跳轉到中斷服務程式。
其中(n*4)(n*4+1)中儲存著中斷服務程式入口地址的偏移量IP
(n*4+2)(n*4+3)中儲存著中斷服務程式入口地址的段地址CS

2、保護模式下:


在保護模式下,不存在中斷向量表,而是使用中斷描述符表--IDT(Interrupt Descriptor Table)。
中斷描述符表,類似於GDT、LDT,實際上就是一個描述符表。
IDT中的描述符可以是下面三種之一:中斷門描述符、陷阱門描述符、任務門描述符
IDT的作用是將每一箇中斷向量和一個描述符對應起來,而描述符中儲存的是中斷服務程式的基地址和偏移量。

三、外部中斷

外部中斷的情況有些複雜,因為需要建立硬體中斷與向量號之間的對應關係。外部中斷分為不可遮蔽中斷(NMI)和可遮蔽中斷兩種,分別由CPU的兩根引腳NMI和INTR來接受。


8259A是可程式設計中斷控制器,對它的設定並不複雜,是通過向相應的埠地址寫入特定的ICW(Initialization Command Word)來實現的。主8259A對應的埠地址是20h和21h,從8259A對應的埠地址是A0h和A1h。ICW共有4個,每一個都是具有特定格式的位元組。8259A初始化過程為:
(1)往埠20h(主片)或A0h(從片)寫入ICW1
(2)往埠21h(主片)或A1h(從片)寫入ICW2


(3)往埠21h(主片)或A1h(從片)寫入ICW3
(4)往埠21h(主片)或A1h(從片)寫入ICW4

下面結合pmtest9.asm 中的Init8259A的函式,來講述初始化8259A的過程。

; Init8259A ---------------------------------------------------------------------------------------------
Init8259A:
	mov	al, 011h
	out	020h, al	; 主8259, ICW1.
	call	io_delay

	out	0A0h, al	; 從8259, ICW1.
	call	io_delay

	mov	al, 020h	; IRQ0 對應中斷向量 0x20
	out	021h, al	; 主8259, ICW2.
	call	io_delay

	mov	al, 028h	; IRQ8 對應中斷向量 0x28
	out	0A1h, al	; 從8259, ICW2.
	call	io_delay

	mov	al, 004h	; IR2 對應從8259
	out	021h, al	; 主8259, ICW3.
	call	io_delay

	mov	al, 002h	; 對應主8259的 IR2
	out	0A1h, al	; 從8259, ICW3.
	call	io_delay

	mov	al, 001h
	out	021h, al	; 主8259, ICW4.
	call	io_delay

	out	0A1h, al	; 從8259, ICW4.
	call	io_delay

	mov	al, 11111110b	; 僅僅開啟定時器中斷
	;mov	al, 11111111b	; 遮蔽主8259所有中斷
	out	021h, al	; 主8259, OCW1.
	call	io_delay

	mov	al, 11111111b	; 遮蔽從8259所有中斷
	out	0A1h, al	; 從8259, OCW1.
	call	io_delay

	ret
; Init8259A ---------------------------------------------------------------------------------------------

0001 0001 主8259A, ICW1
需要ICW4,級聯8259,8位元組中斷向量,edge triggered模式,PC系統

0001 0001 從8259A, ICW1
需要ICW4,級聯8259,8位元組中斷向量,edge triggered模式,PC系統

0010 0000 主8259A,ICW2
80x86系統,IR0對應中斷向量Ox20

0010 1000 從8259A,ICW2
80x86系統,IR8對應中斷向量Ox28

0000 0100 主8259A,ICW3
IR0,IR1,IR3,IR4,IR5,IR6,IR7,無從片;IR2有級聯從片

0000 0010 從8259A,ICW3
級聯於主8259的IR2

0000 0001 主8259A,ICW4
0000 0001 從8259A,ICW4

1111 1111 主8259,OCW1
遮蔽主8259所有中斷

1111 1111 從8259,OCW1
遮蔽從8259所有中斷