IO端口、IO內存、IO空間、內存空間的含義和聯系


  1,IO空間:X86一個特有的空間,與內存空間獨立的空間,同樣利用IO空間可以操作數據,只不過是利用對應的IO端口操作函數,例如inb(), inbw(), inl(); outb(), outw(), outl()等。

    2,內存空間:內存地址的尋址范圍,例如32位操作系統內存空間為2的32次冪,即4G。

    3,IO端口:當外部寄存器或內存映射到IO空間時,即只能用IO端口操作函數進行數據讀寫,稱為IO端口。

    4,IO內存:當外部寄存器或內存映射到內存空間時,即使用訪問內存的方式對外部寄存器或者內存進行讀寫操作。

    從上面定義可以看出,外部設備只能通過設備上的寄存器或者內存(SRAM?DRAM?)與CPU進行通訊,外部設備的寄存器可以是IO端口(映射到IO空 間),也可以是IO內存(映射到地址空間)。當映射到IO空間時,必須使用對應的IO操作函數;映射到內存空間時就要注意要使用特定的IO內存操作函數, 最好不要直接使用指針操作,IO內存操作函數有如下:

    IO內存讀函數:

    unsigned int ioread8(void *addr);

    unsigned int ioread16(void *addr);

    unsigned int ioread32(void *addr);

    IO內存寫函數:

    unsigned int iowrite8(u8 value, void *addr);

    unsigned int iowrite16(u8 value, void *addr);

    unsigned int iowrite32(u8 value, void *addr);

    以下這些函數讀和寫一系列值到給定的I/O內存區域,從給定的buf讀或寫count個值到addr,參數count表示要讀寫的數據個數,而不是字節數

    void ioread8_rep(void *addr, void *buf, unsigned long count);

    void ioread16_rep(void *addr, void *buf, unsigned long count);

    void ioread32_rep(void *addr, void *buf, unsigned long count);

    void iowrite8_rep(void *addr, const void *buf, unsigned long count);

    void iowrite16_rep(void *addr, const void *buf, unsigned long count);

    void iowrite32_rep(void *addr, const void *buf, unsigned long count);

    需要操作一塊IO地址時,使用下列函數(這些函數的行為類似於它們的C庫類似函數)

    void memcpy_io(void *addr, u8 value, unsigned int count);

    void memcpy_fromio(void *dest, void *source, unsigned int count);

    void memcpy_fromio(void *dest, void *source, unsigned int count);

    由於邊際效應的緣故,不管是否需要 ioremap,都不鼓勵直接使用I/O內存指針,而應使用專門的I/O內存操作函數。這些I/O內存操作函數不僅在所有平台上是安全,而且對直接使用指針操作 I/O 內存的情況進行了優化。 --->《LDD》Chapter 9, Page 249


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM