2012-01-22 23 views
4

我很難理解中斷如何工作。使用outb和inb進行低級I/O訪問

下面的代碼初始化可編程中斷控制器

#define PIC0_CTRL 0x20 /* Master PIC control register address. */ 
    #define PIC0_DATA 0x21 /* Master PIC data register address. */ 

    /* Mask all interrupts*/ 
    outb (PIC0_DATA, 0xff); 

    /* Initialize master. */ 
    outb (PIC0_CTRL, 0x11); /* ICW1: single mode, edge triggered, expect ICW4. */ 
    outb (PIC0_DATA, 0x20); /* ICW2: line IR0...7 -> irq 0x20...0x27. */ 
    outb (PIC0_DATA, 0x04); /* ICW3: slave PIC on line IR2. */ 
    outb (PIC0_DATA, 0x01); /* ICW4: 8086 mode, normal EOI, non-buffered. */ 

    /* Unmask all interrupts. */ 
    outb (PIC0_DATA, 0x00); 

能有人向我解釋它是如何工作:

OUTB的-the作用(我不明白Linux手冊)

- 地址及其含義

另一個無關的問題,我讀到outb和inb是用於端口映射的I/O,我們可以使用內存映射的I/O做輸入/輸出通信?

謝謝。

+0

對於由內存映射IO控制的硬件(PIC是_not_),您當然可以執行內存映射IO。 – hirschhornsalz

+0

8086繼承了其前身8080和8085的這些指令,其中單獨的I/O空間非常有用,以免浪費任何64k內存地址空間。 –

回答

5

outb()將由其第二個參數指定的字節寫入由其第一個參數指定的I/O端口。在這種情況下,「端口」是CPU與另一個芯片進行通信的一種手段。

您提供的特定C代碼與8259A可編程中斷控制器(PIC)相關。

您可以閱讀關於PIC herehere

如果這樣不能提供足夠的詳細信息來理解命令和位掩碼,則可以始終引用芯片的datasheet

1

設備特定的代碼最好與相應的數據表一起閱讀。例如,「8259A可編程中斷控制器」數據表(http://pdos.csail.mit.edu/6.828/2005/readings/hardware/8259A.pdf)清楚地(但簡潔地)解釋了幾乎所有的事情。但是,這份數據表只會解釋芯片如何使用(在任何系統中),而不會解釋芯片如何用於特定系統(例如在「PC兼容」80x86系統中)。爲此,您需要依賴「隱含的事實標準」(因爲PIC芯片的許多功能並未在「PC兼容」80x86系統上使用,現代/集成芯片組可能不支持)。

通常(由於歷史原因)PIC芯片的IRQ以奇怪/不好的方式映射到中斷。例如,IRQ 0映射到中斷8,並與CPU的雙重故障異常衝突。您發佈的特定代碼重新映射PIC芯片,以便IRQ0映射到中斷0x20(和IRQ1中斷0x21,...,映射到IRQ 0x2F的IRQ 15)。這是操作系統通常用來避免衝突的原因(例如,每個中斷都用於IRQ或異常,而不是兩者)。

要理解「outb()」,請查看Intel手冊中的「OUT」指令。就像有2個地址空間 - 一個用於正常物理地址,另一個用於IO端口,一般指令(間接)訪問正常的物理內存;和IO端口指令(IN,OUT,INSB/W/D,OUTSB/W/D)訪問單獨的「IO地址空間」。

1

傳統的8088/86有一個存儲器控制信號,它本質上是另一個直接與指令相連的地址位。控制信號將訪問分爲I/O和內存,從而創建兩個獨立的地址空間。與CS,DS等不同,在芯片內部創建單獨的存儲器空間(在訪問外部存儲器空間之前)。其他處理器系列使用所謂的內存映射I/O。

現在,內存控制器/系統以各種不同的方式在芯片內外被切碎,有時例如有許多控制信號指示指令與數據,緩存行填充,寫入與寫回等。除了外部電路之外,存儲器映射發生在芯片內部,例如專用的ROM接口(與ram分離)等在邊緣被發現,遠比舊的8088/86的I/O空間與存儲器空間更復雜和獨立。

out和in指令和一些家庭成員會改變您是否正在進行I/O訪問或內存訪問,並且傳統上中斷控制器是解碼內存總線​​尋找I/O訪問的芯片分配給該設備。幾十年的反向兼容性,你有目前的代碼,你正在看。

如果您真的想了解它,您需要找到包含中斷控制器的器件的數據表,可能與大型支持芯片上的一堆其他邏輯相結合。其他數據表也可能需要。

+0

對不起,我不明白,這是否意味着x86使用端口映射而不是內存映射訪問? –

+0

是的,我想解釋什麼I/O映射與內存映射的意思,它傳統上,對於x86,意味着一個控制線。其他架構使用一個或多個地址位來做同樣的事情。除了x86之外,控制信號與特殊指令相關的區別非常小。 –

+0

通過允許一些項目可在任一地址空間尋址,pci增加了複雜度。堅持進/出可能使得與內存相比更容易控制和虛擬化。有一個IOPM I/O保護圖,我認爲每個虛擬機(在這種情況下,即使是在Linux機器上的一個簡單的應用程序),你有一個單獨的IOPM。查看windows的giveio驅動程序,瞭解更多關於此的信息以及如何解決此問題。 –

相關問題