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函数解除映射。

你可能感兴趣的:(LDD3读书笔记(第9章 与硬件通信))