您的位置:首页 > 其它

整个的一个外设映射关系以及phys_to_virt与io_remap

2018-02-18 21:48 831 查看
整个的一个外设映射关系以及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还是其他外设没有关系。只要建立起映射关系,我们便能访问他们。

在使用计算出的虚拟地址时,首先要保证已经建立器物理地址和虚拟地址的一个映射关系
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: