问题概述
Uboot中如果打开MMU,则MMU需要配置MMU table来管理不同的地址空间。
其中ARMV7和ARMV8中这部分的配置代码是不同。
ARMV7的配置过程
代码参考:u-boot-2020.04/arch/arm/lib/cache-cp15.c
mmu_setup
→set_section_dcache
→dram_bank_mmu_setup
其中dram_bank_mmu_setup函数中使用到的bd->bi_dram[bank].start,bd->bi_dram[bank].start是board中中定义,例如xxx_evb.c定义的:
c
int dram_init_banksize(void)
{
gd->bd->bi_dram[0].start = 0x40000000;
gd->bd->bi_dram[0].size = 0x40000000;
return 0;
}
ARMV7的mmu初始化不需要用到mem_map,所以不需要在arch目录下对应的文件中定义类似ARMV8的
c
static struct mm_region xxx_mem_map[] = {
{
.virt = 0x40000000UL,
.phys = 0x40000000UL,
.size = 0x80000000UL,
.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
PTE_BLOCK_INNER_SHARE
}, {
.virt = 0x00000000UL,
.phys = 0x00000000UL,
.size = 0x40000000UL,
.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
PTE_BLOCK_NON_SHARE |
PTE_BLOCK_PXN | PTE_BLOCK_UXN
}, {
/* List terminator */
0,
}
};
struct mm_region *mem_map = xxx_mem_map;
ARMV8的配置过程
代码参考:u-boot-2020.04/arch/arm/cpu/armv8/cahc_v8.c。
在进行MMU初始化的时候需要用到mem_map,所以需要在对应arch目录下定义对应的mem_map数组。