Uboot中ARMV7和ARMV8 MMU配置

问题概述

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数组。

相关推荐
CheungChunChiu1 小时前
Linux 内核设备模型与驱动框架解析 ——以 rk-pcie 为例
linux·运维·ubuntu
列逍2 小时前
Linux进程(三)
linux·运维·服务器·环境变量·命令行参数
水天需0103 小时前
VS Code Ctrl+Shift+V 预览 Markdown 无效的解决方案
linux
赖small强5 小时前
【Linux C/C++开发】Linux 平台 Stack Protector 机制深度解析
linux·c语言·c++·stack protector·stack-protector·金丝雀机制
清风6666665 小时前
基于单片机的汽车安全气囊充气控制系统设计(protues仿真设计)
单片机·嵌入式硬件·汽车·毕业设计·课程设计·期末大作业
小李做物联网6 小时前
【单片机毕业设计】65.1基于单片机物联网智能书桌-超声+升降系统项目程序开发
stm32·单片机·嵌入式硬件·物联网
陌路206 小时前
Linux42 守护进程
linux
liteblue6 小时前
DEB包解包与打包笔记
linux·笔记
minji...6 小时前
Linux 基础IO(一) (C语言文件接口、系统调用文件调用接口open,write,close、文件fd)
linux·运维·服务器·网络·数据结构·c++
赖small强6 小时前
【Linux内存管理】Linux虚拟内存系统详解
linux·虚拟内存·tlb