在一些平台上, 你可能逃过作为一个指针使用 ioremap 的返回值的惩罚. 这样的使用不 是可移植的, 并且, 更加地, 内核开发者已经努力来消除任何这样的使用. 使用 I/O 内 存的正确方式是通过一系列为此而提供的函数(通过 <asm/io.h> 定义的).

从 I/O 内存读, 使用下列之一:

unsigned int ioread8(void *addr); unsigned int ioread16(void *addr); unsigned int ioread32(void *addr);

这里, addr 应当是从 ioremap 获得的地址(也许与一个整型偏移); 返回值是从给定 I/O 内存读取的.

有类似的一系列函数来写 I/O 内存: 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);

这些函数读或写 count 值从给定的 buf 到 给定的 addr. 注意 count 表达为在被写入 的数据大小;
ioread32_rep 读取 count 32-位值从 buf 开始.

上面描述的函数进行所有的 I/O 到给定的 addr. 如果, 相反, 你需要操作一块 I/O 地 址, 你可使用下列之一:

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

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

这些函数行为如同它们的 C 库类似物.

如果你通览内核源码, 你可看到许多调用旧的一套函数, 当使用 I/O 内存时. 这些函数 仍然可以工作, 但是它们在新代码中的使用不鼓励.
除了别的外, 它们较少安全因为它们 不进行同样的类型检查. 但是, 我们在这里描述它们:

unsigned readb(address);
unsigned readw(address); unsigned readl(address);

这些宏定义用来从 I/O 内存获取 8-位, 16-位, 和 32-位 数据值. void writeb(unsigned value,
address);

void writew(unsigned value, address); void
writel(unsigned value, address);

如同前面的函数, 这些函数(宏)用来写
8-位, 16-位, 和 32-位数据项.

一些
64-位平台也提供 readq 和 writeq, 为 PCI 总线上的 4-字(8-字节)内存操作. 这 个 4-字 的命名是一个从所有的真实处理器有
16-位 字的时候的历史遗留. 实际上, 用 作 32-位 值的 L 命名也已变得不正确, 但是命名任何东西可能使事情更混淆.

最新文章

  1. php文件上传进度条例子
  2. HDOJ 1203 I NEED A OFFER!(01背包)
  3. jmeter随笔(9)--有两种编码风格,导致数据乱码
  4. 8 simple things that will make you sexy
  5. 【HDOJ】2386 Dart Challenge
  6. linux df和du统计的空间不一致
  7. Vulkan Tutorial 02 编写Vulkan应用程序框架原型
  8. 自定义组件-BreadcrumbTreeView 的使用
  9. Java double和 float丢失精度问题
  10. shell if相关参数
  11. 【Bootstrap】 一些提示信息插件
  12. 浅谈轮播图(原生JavaScript实现)
  13. java分布式电子商务云平台b2b b2c o2o需要准备哪些技术??
  14. VS下载Github的项目引用报错
  15. PAT A1075 PAT Judge (25 分)——结构体初始化,排序
  16. webVR框架A-frame
  17. 微信公众号文章转语音tts
  18. CSS----学习2
  19. centos7没有ifconfig命令
  20. 20145335郝昊《网络攻防》Exp9 Web安全基础实践

热门文章

  1. 【转载】【python】python练手项目
  2. Intellij IDEA设置忽略部分类编译错误
  3. 一个iOS开发者对tvOS SDK的初探
  4. 2019-4-29-dotnet-core-通过-frp-发布自己的网站
  5. 你在用 JWT 代替 Session?
  6. 重装系统后ORACLE数据库恢复的方法
  7. JavaScript中常用的几种类型检测方法
  8. Nuxt.js打造旅游网站第2篇_首页开发
  9. CSS文本超过两行用省略号代替
  10. 7-3三个模块 hashlib ,logging,configparser和序列化