一、内核空间
其中在前面非连续多页内存映射的内核VMA(struct vm_struct)中提到了设备内存的映射方法:ioremap。
/*ioremap实现与体系结构有关,例如x86下的函数如下,另外还有一些变体ioremap_xxx(),这些变体
的主要功能是通过加入一些映射标志位来影响相关内核页表项的设置。
1)此时的__iomem的作用只是提醒调用者返回的是一io类型的地址,如同__user, __percpu一样,某些
工具软件有可能会利用这些定义符做一些诸如代码质量等方面的检查。
2)ioremap函数及其变种用来将内核虚拟地址空间的vmalloc区域的某段虚拟地址映射到I/O空间,其实现
原理与vmalloc()函数基本一样,都是通过在vmalloc区域分配虚拟地址快,然后修改内核页表的方式将
其映射到设备的内存区,也就是设备的I/O地址空间。与vmalloc不同的是ioreamp并不通过伙伴系统去分配
物理内存,因为ioremap要映射的目标地址是I/O空间,而不是物理内存。
*/
void __iomem *ioremap(resource_size_t phys_addr, unsigned long size)
/*将内核虚拟地址空间vmalloc区中分配的虚拟内存块返回给vmlloc区,清除对应的页表页目录项等*/
void iounmap(volatile void __iomem *addr)