2008年8月7日 星期四

I/O對應的方式

  1. I/O mapped I/O(port-mapped I/O或Direct I/O)

  2. I/O與memory均擁有自己的記憶體空間
    需要特別的指令來處理I/O

    好處是完全不用考慮記憶體空間被I/O佔用,缺點需要額外的指令專門處理I/O存取。
  3. Memory Mapped I/O

  4. I/O與memory共用記憶體空間
    不需要特別指令來處理I/O
    其實Memory mapped I/O只是將I/O的port或memory 映射(mapping)到記憶體位址(memory address)上,

    其好處就是可以把I/O存取直接當成存取記憶體來用,缺點是有映射到的區域原則上就不能放真正的記憶體。
以PCI Device例子來看:
假設有個PCI的Device它的PFA(PCI Function Address)為(0,6,0)[bus/dev/function]
我們想要對PCI Register 43h bit1寫入1
範例程式碼如下:
mov eax, 80003040h
mov dx, 0cf8h
out dx, eax

mov dx, 0cffh
in al, dx
or al, 00000010b
out dx, al

IO Port 0x0cf8/0x0cfc為PCI Config Address/Data Port
這種方式就是I/O Mapped I/O

如果是PCIe Device的話,原則上原本的0x0cf8/0x0cfc還是可以用,但它只能存取Offset 00h~FFh,
要存取100h以上的空間時,就必需要用MMIO了。
範例程式如下:
假設我們要讀取Device(4,0,0)的register 0,讀2bytes
mov ax,[50400000h]

假設0x50000000是PCIe的Memory Base Address
PCIe PFA[27:20]: Bus information
PCIe PFA[19:15]: Device information
PCIe PFA[14:12]: Function information
PCIe PFA[11: 8]: Extended Register
PCIe PFA[7:2]: DW number
PCIe PFA[1:0]: Byte enable


參考資料來源:
http://biosengineer.blogspot.com/2007/10/bios-pci-scan-9.html
http://www.ltivs.ilc.edu.tw/kocp/mpu/m2/m2-3-2.htm
http://www.ltivs.ilc.edu.tw/kocp/mpu/m2/m2-3-3.htm

4 則留言:

AYR 提到...

你的文章太棒了!!!

Unknown 提到...

名稱上I/O mapped I/O = Direct I/O,那
Memory mapped I/O = Indirect I/O嗎?
想請教您I/O mapped I/O和 Memory mapped I/O 與Direct和Indirect之間的關係是什麼呢?

昏~ 提到...

請問上述所說的I/O mapped跟memory mapped是一種抽象的定義嗎?還是說一台電腦使用哪種mapped是取決於你的硬體設計??因為我的疑問點在於說I/O mapped,是與main memory各自獨立的,但memory mapped卻是與main memory共享,那這樣到底main memory中到底有沒有其中一個區塊是與I/O中的記憶體同步?

史丹利 提到...

我的理解是這樣子的, 其實兩種設計, 都是取決於硬體設計.硬體沒設計就都沒有用的.
Memory Mapped,以ARM Based的範例來說 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0225d/BBAJIHEC.html
裏面用到的Memory Address皆會對硬體去操作.
IO mpaaed IO, 最簡單的解釋就是, 當你使用in,out這一類的cpu instruction去跟硬體溝通時, 就屬於direct I/O
不管是那一種, 其實硬體在設計時, 都要把address/data bus接對, 命令才會有辦法傳遞到的.

兩者對user操作上的差異性是, 一個直接操作記憶體同等於操作硬體, 另一個則必需額外的cpu instruction去跟硬體溝通.