ARM64 启用 MMU 和 TLB

问题描述

我目前正在研究 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 (将#修改为@)