arm架构_TTBR0,TTBR1与TTBCR寄存器

arm的两个页表基地址寄存器

TTBR0与TTBR1

armv7中,有两个存放页表(一级页表)基地址的寄存器,TTBR0和TTBR1。那mmu进行地址翻译(translation table walk)的时候到底是选择哪一个寄存器的值作为基地址呢?

TTBCR寄存器

那么这个时候就需要用到TTBCR寄存器,这个寄存器的格式如下图
TTBCR
其中最后[2-0]位(值为N)决定了用TTBR0还是TTBR1,看下手册的说明
在这里插入图片描述
当N>0时,如果给的虚拟地址[31:32-N]位都是0,那么用TTBR0,一旦这其中的某一位是1了,就用TTBR1。又N的取值只有0到7(只有3位),所以每个N的取值都对应了一个用TTBR0或者TTBR1的分界线。比如当N=2时,如果给的虚拟地址第[31:30]位为0,即不超过0x40000000,那么就用TTBR0,一旦等于或者超过0x40000000那么就用TTBR1.
下面还有一张N值不同时,对应的地址分界线图
在这里插入图片描述

在这里插入图片描述

EL1和CA76是指ARM处理器的执行等级和架构版本。使能MMU的代码则是用于在ARM处理器上启用内存管理单元(MMU)的代码。 在ARM处理器架构中,MMU起着重要的作用,它负责将虚拟地址转换为物理地址,并提供对内存访问权限的控制。启用MMU可以使程序能够使用虚拟地址空间,提供更好的内存管理和保护机制。 以下是一个简单的示例代码片段来使能MMU: ```C void enable_mmu(void) { unsigned int ttbr0, ttbcr; // 设置页表基址和控制寄存器 ttbr0 = /* 设置页表基址 */; asm volatile("mcr p15, 0, %0, c2, c0, 0" :: "r" (ttbr0)); ttbcr = /* 设置控制寄存器 */; asm volatile("mcr p15, 0, %0, c2, c0, 2" :: "r" (ttbcr)); // 使能MMU asm volatile("mrc p15, 0, r0, c1, c0, 0"); asm volatile("orr r0, r0, #0x1"); asm volatile("mcr p15, 0, r0, c1, c0, 0"); } ``` 上述代码的作用是设置页表基址和控制寄存器,然后通过修改协处理器中的寄存器来启用MMU。具体的代码实现可能会根据处理器的型号和架构版本有所不同。 启用MMU之后,程序可以使用虚拟地址来访问内存,MMU会负责将虚拟地址转换为物理地址,并进行访问权限的控制。这可以提高内存管理的灵活性和安全性,使程序运行更加可靠和高效。 总之,以上代码片段是一个简单的示例,用于在ARM处理器上启用MMU。具体的代码实现可能会因处理器型号和架构版本而有所不同。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值