ioport和iomem
来源:互联网 发布:淘宝一口价规则 编辑:程序博客网 时间:2024/05/17 05:04
则无任何作用。
$ grep -RIn 'define __iomem' include/linux
# define __user __attribute__((noderef, address_space(1)))
# define __kernel /* default address space */
# define __safe __attribute__((safe))
# define __force __attribute__((force))
# define __nocast __attribute__((nocast))
# define __iomem __attribute__((noderef, address_space(2)))
# define __acquires(x) __attribute__((context(0,1)))
# define __releases(x) __attribute__((context(1,0)))
# define __acquire(x) __context__(1)
# define __release(x) __context__(-1)
# define __cond_lock(x) ((x) ? ({ __context__(1); 1; }) : 0)
extern void __chk_user_ptr(void __user *);
extern void __chk_io_ptr(void __iomem *);
#else
# define __user
# define __kernel
# define __safe
# define __force
# define __nocast
# define __iomem
# define __chk_user_ptr(x) (void)0
# define __chk_io_ptr(x) (void)0
# define __builtin_warning(x, y...) (1)
# define __acquires(x)
# define __releases(x)
# define __acquire(x) (void)0
# define __release(x) (void)0
# define __cond_lock(x) (x)
#endif
几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。
有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可象访问一个内存单元那样访问外设I/O端口,而无需设立专门的外设I/O指令。这就是所谓的“内存映射方式”(Memory-mapped)。
__user表示是一个用户空间的指针,所以kernel不可能直接使用。
#ifdef __CHECKER__
# define __user __attribute__((noderef, address_space(1)))
# define __kernel /* default address space */
#else
# define __user
# define __kernel
#endif
noderef告诉编译器,不应该解除该指针的引用,因为在当前地址空间中它是没有意义的。
这里的CHECKER表示是否使用了Sprase(就是一种静态分析工具,用来分析内核源码中的BUG)。是不是想研究一下了?呵呵。可以参见http://sparse.wiki.kernel.org/index.php/Main_Page
所以对于这种变量,在kernel中使用要用到copy_to_user和copy_from_user。
__iomem是2.6.9中加入的特性。是用来个表示指会指向一个I/O的内存空间。主要是为了driver的通用性考虑。由于不同的CPU体系结构对I/O空间的表示可能不同。当使用__iomem时,compiler会忽略对变量的检查(因为用的是void __iomem)。但sparse会对它进行检查,当__iomem的指针和正常的指针混用时,就会发出一些warnings。
下面还有一些为个变量新加入的函数:
unsigned int ioread8(void __iomem *addr);
unsigned int ioread16(void __iomem *addr);
unsigned int ioread32(void __iomem *addr);
void iowrite8(u8 value, void __iomem *addr);
void iowrite16(u16 value, void __iomem *addr);
void iowrite32(u32 value, void __iomem *addr);
可以看一下http://lwn.net/Articles/102240/
和http://lwn.net/Articles/102232/
- ioport和iomem
- iomem
- /proc/iomem和/proc/ioports
- /proc/iomem和/proc/ioports
- /proc/iomem
- /proc/iomem
- 关键词ioport的作用是什么
- 关键词ioport的作用是什么
- DSP C54X ioport的用法
- iomem—I/O映射方式的I/O端口和内存映射方式的I/O端口
- iomem—I/O映射方式的I/O端口和内存映射方式的I/O端口
- ——iomem的作用
- dsp 中关于ioport 的用法
- 由 cat /proc/iomem 所学到的
- 设备驱动中的iomem(kernel-4.7)
- 通过/proc/ioports开查看端口的使用(/proc/iomem)
- 从设备树的reg到/proc/iomem
- . 和 ->
- stuts2与spring3最小结合jar集合
- Rsync linux 到 linux 同步设置详细指南
- 用命令查看cisco光模块型号及序列号(转载)
- 实用性简单PCB阻抗设计指南
- android用webservice连接sqlserver数据库
- ioport和iomem
- gcc编译C++程序
- 解决struts2 下载中文名称乱码问题 适应不同三大主流浏览器 chrome28.0.1500.95、 firefox 23.0.1 、 IE11
- OCP-1Z0-053-V12.02-663题
- 为何选择使用MINA
- solve xcode Undefined symbols for architecture i386:"_OBJC_CLASS_$_SKPSMTPMessage", referenced from
- Myeclipse 实现java 可视化开发
- 常见的watir-webdriver非标准html元素操作代码
- MFC常用类CTime