分类: Android平台
2015-03-17 11:38:26
1,对于多核的处理器,每个CPU 都有自己的MMU,这个是在做trustzone SMP 启动的时候验证过的。
2,Uboot MMU 解读:
在board/samsung/tiny4412/lowlevel_init.S 中
mmu_table:
.set __base,0 开始地址
// Access for iRAM
.rept 0x200 从开始地址起,总共要重复的次数
FL_SECTION_ENTRY __base,3,0,0,0
.set __base,__base+1
.endr
// Not Allowed
.rept 0x400 - 0x200 这一段的不允许访问
.word 0x00000000
.endr
.set __base,0x400 开始地址
// 512MB for SDRAM with cacheable
.rept 0x800 - 0x400 从开始地址起,总共要重复的次数是0x800-0x400
FL_SECTION_ENTRY __base,3,0,1,1 权限设置
.set __base,__base+1
.endr
// access is not allowed.
.rept 0xc00 - 0x800
.word 0x00000000
.endr
.set __base,0x400
// 512MB for SDRAM with cacheable
.rept 0xE00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
// access is not allowed.
.rept 0x1000 - 0xE00
.word 0x00000000
.endr
总共4G 即0x1000 被映射完毕
3,虚拟地址:
对于开启MMU 的系统,由CPU 发出访问的地址都是虚拟地址,虚拟地址经由MMU 转换成物理地址。
4,总线地址
实际上就是说这个发出地址的请求不是由CPU 发出的,他有可能是DMA控制器,或者USB控制器发出的地址请求,不是CPU 发出的地址自然就不会被MMU 截获,所以就不可能是虚拟地址了,但是我们的控制器(DMA或者具有类似DMA功能的USB控制器等)拿到一个地址的时候,这个地址往往是从CPU移交过来的,所以,我们得先把这个地址转换成总线地址(物理地址)再给控制器使用。通常内核会有一个vir_to_phy 之类的接口可以直接转换。 当然,对于控制器的IO 也有IOMMU 专门管这个,类似MMU了,只不过MMU 是给CPU 用的,IOMMU 是给外设控制器用的。
哎,以前没看到谁的博客把这个说明白的。