NXP MCU 技术论坛
直播中

王浩

7年用户 1312经验值
私信 关注
[问答]

s32g274a a53内核上的MMU Level 3表配置问题求解

我在 MMU 中为 s32g274a 处理器的 cortex-a53 建立 3 级表时遇到问题。1 级和 2 级表按预期工作,但我的项目需要一个 4KB 的内存块。下面是我为配置 mmu 编写的代码。有人可以看看错误设置的内容,从而导致 3 级表配置不正确吗?  
MOV x0, #0x44 /* 内部/外部可缓存 WB */
MSR mair_el3, x0
/* 在当前异常级别使 TLB 无效 */
TLBI alle3
/* RES1
RES1
PS 40 位
ORGN0 外部 WB 无 WA 可缓存
IRGN0 内部 WB 无 WA 可缓存
T0SZ 39 位区域大小 */
LDR x0, =(1 << 31) | (1 << 23) | (2 << 16) | (3 << 10) | (3 <<| 25
MSR tcr_el3, x0
/* 页表设置 */
LDR x1, =ttb // L1表的地址
//0x0000,0000 - 0x3FFF,FFFF
LDR x2, =ttb1 // 获取二级表的地址
MOV x0, #0x03 // 指向下一级表的指针的入口模板
ORR x0, x0, x2 // 将模板与二级表Base组合地址
STR x0, [x1]
//0x4000,0000 - 0x7FFF,FFFF
MOV x0, #0x405 // 条目模板

ORR x0, x0, #0x40000000 // “或”模板与基本物理地址
STR x0, [x1, #8]

LDR x1, =ttb1 // L2表的地址
//0x0000,0000 - 0x2000,0000
MOV x0, #0x401
MOV x2, #0x100
1:
STR x0, [x1], #8
ADD x0, x0, #0x200000 // 增加物理地址字段
SUB x2, x2, # 1
CBNZ x2​​, 1b
//0x2000,0000 - 0x3400,0000(故障)
MOV x0,#0x0
ORR x0,x0,#0x20000000 //“或”模板与基本物理地址
MOV x2,#0xA0
1:
STR x0,[x1],#8
ADD x0, x0, #0x200000 // 增加物理地址域
SUB x2, x2, #1
CBNZ x2​​, 1b

//0x3400,0000 - 0x3480,0000(SDRAM)
mov x0, #0x401
MOV x6, #0x34000000
ORR x0, x0, x6 // “或”模板与基本物理地址
MOV x2, #2
1:
STR x0, [x1], #8
ADD x0, x0, #0x200000 / / 增加物理地址字段
SUB x2, x2, #1
CBNZ x2​​, 1b

LDR x2, =ttb2 // 获取三层表的地址
MOV x0, #0x03 // 指向下一层表指针的入口模板
ORR x0, x0, x2 // 模板与三层表组合
STR x0, [x1]
MOV x0, #0x405 // 入口模板
MOV x6, #0x34600000
ORR x0, x0, x6 // “或”模板与基本物理地址
STR x0, [x1, #8]

LDR x1, =ttb2 // L3表的地址
//0x3440,0000 - 0x3460,0000
MOV x0, #0x401
MOV x6, #0x34400000
ORR x0, x0, x6 // “或”模板与基本物理地址
MOV x2, #0x200
1:
STR x0, [x1], # 8
ADD x0, x0, #0x1000 // 增加物理地址字段
SUB x2, x2, #1
CBNZ x2​​, 1b
DSB SY

/* 确保所有转换表写入都已排空到内存中,
TLB 失效完成,
并在启用 MMU 之前提交转换寄存器写入 */
DSB ISH
ISB
LDR x0, =ttb // L1 表的地址
MSR ttbr0_el3, x0 //设置 TTBR
MRS x0, S3_1_c15_c2_1 // cpuectlr_el1
ORR x0, x0, #0x40
MSR S3_1_c15_c2_1, x0

MRS x0, sctlr_el3
bic x0, x0, #(1 << 1) /* 清除 A,禁用对齐错误检查 */
/* I 启用指令缓存
C 启用数据和统一缓存
M 启用 EL3 MMU */
LDR x1, =( 1 << 12) | (1 << 2) | 1
ORR x0, x0, x1 /* 设置位 */
MSR sctlr_el3, x0
/* 确保 MMU 使能立即生效 */
ISB

回帖(1)

红旧衫

2024-4-10 16:24:41
由于代码中的最后一行截断了,我无法准确判断配置是否正确。但是从您提供的代码中,至少可以看出以下几点问题:

1. 您在设置 MAIR_EL3 寄存器时,将缓存策略设置为了可写回(WB)可缓存(C),但并未设置内存属性。缺少内存属性会导致无法正确区分内存是外设设备还是常规 RAM。建议使用如下代码来设置 MAIR_EL3 寄存器:

MOV x0, #(0x00 << 24) | (0xff << 16) | (0x04 << 8) | (0xff<< 0) /* Normal memory type */ MSR mair_el3, x0

2. 您在设置 TCR_EL3 寄存器时,设置的区域大小为 39 位。在 cortex-a53 上,地址线只有 48 位,为了避免访问越界,应将区域大小设置为 48 位。建议使用如下代码来设置 TCR_EL3 寄存器:

LDR x0, =((64 - 48) << 16) | ((0x00 << 14) | (0x00 << 12) | (0x02 << 10) | (0x01 << 8) | (0x00 << 6) | 0x10) /* 4KB Granule, Inner & Outer Write-Back cacheable, Normal memory type */ MSR tcr_el3, x0

3. 最后一行代码被截断了,无法判断正确性。建议您将完整代码分享,以便更准确地协助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分