加载中...

9.5. 快速参考


9.5. 快速参考

本章介绍下列与硬件管理相关的符号:

  1. #include <linux/kernel.h>
  2. void barrier(void)

这个"软件"内存屏蔽要求编译器对待所有内存是跨这个指令而非易失的.

  1. #include <asm/system.h>
  2. void rmb(void);
  3. void read_barrier_depends(void);
  4. void wmb(void);
  5. void mb(void);

硬件内存屏障. 它们请求 CPU(和编译器)来检查所有的跨这个指令的内存读, 写, 或都有.

  1. #include <asm/io.h>
  2. unsigned inb(unsigned port);
  3. void outb(unsigned char byte, unsigned port);
  4. unsigned inw(unsigned port);
  5. void outw(unsigned short word, unsigned port);
  6. unsigned inl(unsigned port);
  7. void outl(unsigned doubleword, unsigned port);

用来读和写 I/O 端口的函数. 它们还可以被用户空间程序调用, 如果它们有正当的权限来存取端口.

  1. unsigned inb_p(unsigned port);

如果在一次 I/O 操作后需要一个小延时, 你可以使用在前一项中介绍的这些函数的 6 个暂停对应部分; 这些暂停函数有以 _p 结尾的名子.

  1. void insb(unsigned port, void *addr, unsigned long count);
  2. void outsb(unsigned port, void *addr, unsigned long count);
  3. void insw(unsigned port, void *addr, unsigned long count);
  4. void outsw(unsigned port, void *addr, unsigned long count);
  5. void insl(unsigned port, void *addr, unsigned long count);
  6. void outsl(unsigned port, void *addr, unsigned long count);

这些"字串函数"被优化为传送数据从一个输入端口到一个内存区, 或者其他的方式. 这些传送通过读或写到同一端口 count 次来完成.

  1. #include <linux/ioport.h>
  2. struct resource *request_region(unsigned long start, unsigned long len, char *name);
  3. void release_region(unsigned long start, unsigned long len);
  4. int check_region(unsigned long start, unsigned long len);

I/O 端口的资源分配器. 这个检查函数成功返回 0 并且在错误时小于 0.

  1. struct resource *request_mem_region(unsigned long start, unsigned long len, char *name);
  2. void release_mem_region(unsigned long start, unsigned long len);
  3. int check_mem_region(unsigned long start, unsigned long len);

为内存区处理资源分配的函数

  1. #include <asm/io.h>
  2. void *ioremap(unsigned long phys_addr, unsigned long size);
  3. void *ioremap_nocache(unsigned long phys_addr, unsigned long size);
  4. void iounmap(void *virt_addr);

ioremap 重映射一个物理地址范围到处理器的虚拟地址空间, 使它对内核可用. iounmap 释放映射当不再需要它时.

  1. #include <asm/io.h>
  2. unsigned int ioread8(void *addr);
  3. unsigned int ioread16(void *addr);
  4. unsigned int ioread32(void *addr);
  5. void iowrite8(u8 value, void *addr);
  6. void iowrite16(u16 value, void *addr);
  7. void iowrite32(u32 value, void *addr);

用来使用 I/O 内存的存取者函数.

  1. void ioread8_rep(void *addr, void *buf, unsigned long count);
  2. void ioread16_rep(void *addr, void *buf, unsigned long count);
  3. void ioread32_rep(void *addr, void *buf, unsigned long count);
  4. void iowrite8_rep(void *addr, const void *buf, unsigned long count);
  5. void iowrite16_rep(void *addr, const void *buf, unsigned long count);
  6. void iowrite32_rep(void *addr, const void *buf, unsigned long count);

I/O 内存原语的"重复"版本.

  1. unsigned readb(address);
  2. unsigned readw(address);
  3. unsigned readl(address);
  4. void writeb(unsigned value, address);
  5. void writew(unsigned value, address);
  6. void writel(unsigned value, address);
  7. memset_io(address, value, count);
  8. memcpy_fromio(dest, source, nbytes);
  9. memcpy_toio(dest, source, nbytes);

旧的, 类型不安全的存取 I/O 内存的函数.

  1. void *ioport_map(unsigned long port, unsigned int count);
  2. void ioport_unmap(void *addr);

一个想对待 I/O 端口如同它们是 I/O 内存的驱动作者, 可以传递它们的端口给 ioport_map. 这个映射应当在不需要的时候恢复( 使用 ioport_unmap )


还没有评论.