设为首页 加入收藏

TOP

Linux驱动中的outb()与volatile
2014-11-24 07:23:55 来源: 作者: 【 】 浏览:0
Tags:Linux 驱动 outb volatile

在Linux的驱动程序中,都会使用大量的outb、outw、inb、inw等等宏来访问硬件或寄存器。这些宏的定义都在相应处理器体系下的include\asm目录下的io.h中定义。追究下去,这些宏最终就是一个volatile变量的的赋值:


#define __arch_putb(v,a) (*(volatile unsigned char *)(a) = (v))


#define __raw_writeb(v,a) __arch_putb(v,a)


#define outb(v,p) __raw_writeb(v,__io(p))


在(*(volatile unsigned char *)(a) = (v))中,a是一个物理地址(实地址,多数是特殊功能寄存器地址)。(volatile unsigned char *)对a进行类型转换,成为一个指向该地址指针,最后*(volatile unsigned char *)(a)引用该指针对该地址赋值v。这样就可以达到访问底层硬件的目的了。


volatile关键字是一种类型修饰符,用它声明的变量表示可能被未知的因素(如:硬件等)更改。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。


(*(volatile unsigned char *)(a) = (v))访问的并不一定是实际的物理地址,可能是经过内存管理重新映射后的地址,也就是虚拟地址。只不过volatile是使变量访问不经过Cache优化。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java中 static什么作用? 下一篇Shell脚本大小写字符串转换

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·数据库:推荐几款 Re (2025-12-25 12:17:11)
·如何最简单、通俗地 (2025-12-25 12:17:09)
·什么是Redis?为什么 (2025-12-25 12:17:06)
·对于一个想入坑Linux (2025-12-25 11:49:07)
·Linux 怎么读? (2025-12-25 11:49:04)