问题描述
我目前正在研究 ARM64 架构,并且正在尝试启用 MMU 和 TLB。
/* Initialize MAIR indices */
__asm__ __volatile__("msr MAIR_EL1,%0\n\t" : : "r" (MAIR_ATTRIBUTES) : "memory");
kprintf("[MMU] MAIR init");
/* Invalidate TLBs */
tlb_flush();
kprintf("[MMU] tlb flush");
/* Initialize TCR flags */
__asm__ __volatile__("msr TCR_EL1,%0\n\t" : : "r" (TCR_MMU_ENABLE) : "memory");
kprintf("[MMU] TCR init");
// tell the MMU where our translation tables are. TTBR_CNP bit not documented,but required
// lower half,user space
asm volatile ("msr ttbr0_el1,%0" : : "r" ((unsigned long)&KERNEL_DATA_END + TTBR_CNP)); // upper half,kernel space
asm volatile ("msr ttbr1_el1,%0" : : "r" ((unsigned long)&KERNEL_DATA_END + TTBR_CNP + ARM64_PAGE_SIZE));
/* Ensure system register writes are committed before enabling MMU */
isb();
kprintf("[MMU] ISB");
/* Enable MMU */
__asm__ __volatile__("mrs %0,SCTLR_EL1\n\t" : "=r" (sctlr) : : "memory");
sctlr |= SCTLR_C | SCTLR_M | SCTLR_I;
__asm__ __volatile__("msr SCTLR_EL1,%0" : : "r" (sctlr));
kprintf("[MMU] MMU enable");
isb();
这是我找到的代码。但我不明白 TTBR0 和 TTBR1 初始化。我从链接文件中读取了 KERNEL_DATA_END,但老实说我不明白是什么以及我是否正确。
ENTRY(_do_start)
PAGE_SIZE = 0x1000;
RAM_BASE = 0x40080000;
RAM_SIZE = 0x80000000;
BOOT_ADDR = RAM_BASE;
SECTIONS
{
. = BOOT_ADDR;
KERNEL_CODE_START = .;
.bootstrap :
{
__BOOTSTRAP_START = .;
*boot*.o (.*)
__BOOTSTRAP_END = .;
}
. =ALIGN(PAGE_SIZE);
.text : AT(ADDR(.text))
{
__TEXT_START = .;
*(.text.*)
__TEXT_END = .;
}
KERNEL_CODE_END = .;
. = ALIGN(PAGE_SIZE);
KERNEL_DATA_START = .;
.data : AT(ADDR(.data))
{
__DATA_START = .;
*(.rodata)
*(.rodata.*)
*(.data)
*(.data.*)
__DATA_END = .;
}
.bss : AT(ADDR(.bss))
{
__BSS_START = .;
*(.bss)
*(.bss.*)
__BSS_END = .;
}
KERNEL_DATA_END = .;
. =ALIGN(PAGE_SIZE);
/disCARD/ :
{
*(.comment)
*(.note)
}
__BSS_SIZE = __BSS_END - __BSS_START;
stack_base = .;
stack_top = . + 0x4000;
}
这是我使用的来源:https://github.com/bztsrc/raspi3-tutorial/blob/master/10_virtualmemory/mmu.c
所以我的问题是:
- 我的 MMU 初始化是否正确?
- 我的 TLB 初始化是否正确? (因为就我阅读的文档而言,似乎在 arm 中,我只需要启用 mmu,因为 TLB 是硬件管理的”)
感谢您的回答!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)