LDD3讀書筆記(第9章 與硬件通信)

#include <linux/kernel.h>
void barrier(void)
    這個“軟件”內存屏障要求編譯器考慮執行到該指令時所有的內存易變性。
#include <asm/system.h>
void rmb(void);
void read_barrier_depends(void);
void wmb(void);
void mb(void);
    硬件內存屏障。要求CPU(和編譯器)執行該指令時檢查所有必需的內存讀、寫(或二者兼有)已經執行完畢。
#include <asm/io.h>
unsigned inb(unsigned port);
void outb(unsigned char byte,unsigned port);
unsigned inw(unsigned port);
void outw(unsigned short word,unsigned port);
unsigned inl(unsigned port);
void outl(unsigned doubleword,unsigned port);
    這些函數用於讀和寫I/O端口。如果用戶空間的程序有訪問端口的權限,則也可以調用這些函數。
unsigned inb_p(unsigned port);
...
    如果I/O操作之後需要一小段延時,可以用上面介紹的函數的6個暫停式的變體。
    這些暫停式的函數都已_p結尾
void insb(unsigned port,void *addr,unsigned long count);
void outsb(unsigned port,void *addr,unsigned long count);
void insw(unsigned port,void *addr,unsigned long count);
void outsw(unsigned port,void *addr,unsigned long count);
void insl(unsigned port,void *addr,unsigned long count);
void outsl(unsigned port,void *addr,unsigned long count);
    這些“串操作函數”爲輸入端口與內存區之間的數據傳輸做了優化。這類傳輸時通過對同一端口連續讀/寫count次實現的。
#include <linux/ioport.h>
struct resource *request_region(unsigend long start,unsigned long len,char *name);
void release_region(unsigned long start,unsigned long len);
int check_region(unsigned long start,unsigned long len);
    爲I/O端口分配資源的函數。check_函數在成功時返回0,出錯時返回負值,但我們不建議使用該函數。
struct resource *request_mem_region(unsigend long start,unsigned long len,char *name);
void release_mem_region(unsigend long start,unsigned long len);
int check_mem_region(unsigend long start,unsigned long len);
    這些函數處理對內存區域的資源分配。
#include <asm/io.h>
void *ioremap(unsigned long phys_addr,unsigned long size);
void *ioremap_nocahe(unsigend long phys_addr,unsigned long size);
void iounmap(void *virt_addr);
    ioremap把一個物理地址範圍重新映射到處理器的虛擬地址空間,以供內核使用。
    iounmap用來解除這個映射。
#include <asm/io.h>
unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);
void iowrite8(u8 value,void *addr);
void iowrite16(u16 value,void *addr);
void iowrite32(u32 value,void *addr);
    用來訪問I/O內存的函數。
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);
    I/O內存訪問原語的“重複”版本。
unsigend readb(address);
unsigend readw(address);
unsigend readl(address);
void writeb(unsigned value,address);
void writew(unsigned value,address);
void writel(unsigned value,address);
memset_io(address,value,count);
memcpy_fromio(dest,source,nbytes);
memcpy_toio(dest,source,nbytes);
    也是用來訪問I/O內存的函數,但老一些且不安全。
void *ioport_map(unsigned long port,unsigned int count);
void ioport_unmap(void *addr);
    如果驅動程序作者希望將I/O端口作爲I/O內存一樣進行操作,則可將這些端口傳遞給ioport_map函數。不再使用這種映射時,應該使用ioport_unmap函數解除映射。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章