1. 内存映射
一直以为,映射设备的IO的资源到内存上,读写这段内存地址就是等于直接读写设备的IO资源了。
实际这是大错特错的,从CPU的引脚连线角度去看,设备IO根本就没直接连接到CPU上,试问这可能直接就读写设备的IO呢?这显然是不可能的。
内存映射实际上是操作系统提供的一种机制,这种机制的在于:将读写映射内存空间的操作转化对被映射的物理地址读写操作。由于物理条件所限制,这种 “转化” 肯定不是以硬件的方式转化,就像虚拟地址通过MMU转化为物理地址那样的“直接”。这转化实际是由内核将这片内存空间的数据搬移到设备的IO之上的,可见其并不是直接的,通常都内核的缓冲页作传送的。
说到底,内存映射就是映射到内存,读写的始终是内存而不是设备IO,之所以会有作用,是因为内核帮我们操作转化了。
内存映射的实现是在内核空间的,如ioremap将设备IO映射到某内核空间上,mmap通过建页表使设备的IO映射的用户空间上。
在用ioremap之前,一般都要使用申请IO端口/内存子资源函数(request_region()和request_mem_region())。两个函数使用的都是物理地址,目的是为检测这段物理的在当前是否已经被使用。
具体实现过程如下:若是申请IO端口,调用__reques_region(&ioport_resource, start,size,name),其中那ioport_resource是为根结点,内核把所有IO端口资源都挂载到其下,这颗树称为IO端口资源树,内核。在通过常规性的检错后,遍历资源树,看所申请的IO端口资源