1、与体系结构关系密切,有些I/O是内存映射的体系结构,比如MIPS,ioremap 也只是通过加一个偏移,简单的将物理地址映射成虚拟地址,则与 phys_to_virt没太大区别。但是在类似于x86这样的体系结构上,I/O地址是端口号形式的,就不能简单的通过加偏移来映射I/O地址到虚拟地址了。
2、ioremap 用来实现物理地址到虚拟地址的动态重映射的,常使用在映射CPU外围控制器的地址。
3、phys_to_virt 是将已经映射的物理内存的地址转换为虚拟地址。
#define phys_to_virt(vaddr) ((void *)((unsigned long)(vaddr)+PAGE_OFFSET))
vaddr = paddr + PAGE_OFFSET,说明这段内存是直接映射区的,即高端内存之下的部分。
例如物理地址为: 0x0 ~ 0xA000000 对应的虚拟地址为 0xc0000000 ~ 0xc0A00000,实现连续物理地址的转换。