整个的一个外设映射关系以及phys_to_virt与io_remap的区别
首先一定要有DDR和IO外设是同级设备的观念,其实他们只是地址总线上的不同区段的地址而已
首先我们会传入ddr的实际大小(通过内核参数mem=xx),此时会将整个DDR映射到内核的线性映射区中,在set_up的时候我们将这个线性映射区一分为2,
一部分用于内核自己用,用于支持正常内核运行所需要的内存空间,以及各种malloc(除过vmalloc),另一部分设置为resever区,以保证内核不会去操作这段内存。
此时DDR已经占用了一些kernel space。
对于外设,我们继续映射(使用静态或者动态)到kernel space的动态映射区
对于reserve出来的内存如何使用呢,两个方法:
1.由于他被映射到了内核的静态映射区,所以是一个固定的映射,可以使用phys_to_virt得到内存的虚拟地址(因为是一一映射,且之前整个DDR的与内核的静态映射区之间的映射关系已经建 立起来了),然后直接操纵这片地址就可以,这种方式适用于大片内存的操作;
2.使用ioremap把这一片reseve出来的内存当作IO外设动态映射过来
其实,不管是phys_to_virt还是使用IO_ADDRESS去操作虚拟地址,目的都是计算出虚拟地址,他们只是工具。我们应该看到的是哪段物理地址被映射到虚拟地址的哪个空间,与他是DDR还是其他外设没有关系。只要建立起映射关系,我们便能访问他们。
在使用计算出的虚拟地址时,首先要保证已经建立器物理地址和虚拟地址的一个映射关系