- I/O 内存可以或者不可以通过页表来存取.
当通过页表存取, 内核必须首先安排物理地址, 并且这常常意味着在做任何 I/O 之前你必须调用ioremap .
如果不需要页表, I/O 内存位置看来很象 I/O 端口, 并且你只可以使用对应函数读写. I/O 内存分配和映射
I/O 内存区必须在使用前分配. 分配内存区的接口是( 在 定义):
struct resource *request_mem_region(unsigned long start, unsigned long len, char *name);
这个函数分配一个 len 字节的内存区, 从 start 开始. 如果一切顺利, 一个 非NULL 指针返回; 否则返回值是 NULL. 所有的 I/O 内存分配来 /proc/iomem 中列出.内存区在不再需要时应当释放:
void release_mem_region(unsigned long start, unsigned long len);
IO内存分配完后,如果要直接进行存取还一定要经过一个映射. 这是 ioremap 函数的功能。这个函数设计来特别的安排虚拟地址给 I/O 内存区.
|
一旦装备了 ioremap (和iounmap), 一个设备驱动可以存取任何 I/O 内存地址, 不管是否它是直接映射到虚拟地址空间. 但是, 从 ioremap 返回的地址不应当直接引用; 相反, 应当使用内核提供的存取函数.
存取 I/O 内存
|
|
当前不鼓励使用旧的代码方式 readb/w/l 和 writeb/w/l 等IO内存读写函数。