我的代码死在boot_linux中的arch_disable_mmu

发布于 2022-09-30 18:46:32 字数 2725 浏览 13 评论 0

执行boot命令的时候,会执行以下跳入kernel的函数,这和其他bootloader的做法是一样的,唯一的不同是LK使用了MMU和Cache来支持多线程,所以在跳到内核之前要先disable mmu和cache,代码如下: void boot_linux(void *kernel, unsigned *tags,

                const char *cmdline, unsigned machtype,

                void *ramdisk, unsigned ramdisk_size)

{

        unsigned *ptr = tags;

        void (*entry)(unsigned,unsigned,unsigned*) = kernel;

................

for (i = 0; i < 500; i++)

        dprintf("%x ", (char *)kernel[i]);  //打印出kernel地址处的数据,的确是zImage的数据00 00 a0 e1 .... , kernel 地址为0x00208000

        enter_critical_section();  //关闭中断

        platform_uninit_timer();  //关闭watch dog

        arch_disable_cache(UCACHE); //关闭cache

        arch_disable_mmu(); //关闭mmu

        entry(0, machtype, tags);

}
复制代码但是,在arch_disable_mmu()之后并没有继续执行entry这个函数,而如果把arch_disable_mmu()去掉,则可以到entry(0, machtype, tags); 但是内核同样跑不起来,可能是进入内核前一定要关闭mmu导致?所以问题的关键还是在arch_disable_mmu();后为什么没有到entry(0, machtype, tags); ?

arch_disable_mmu();的是这样实现的: void arch_disable_mmu(void)

{

        arm_write_cr1(arm_read_cr1() & ~(1<<0)); //  disable mmu

}
复制代码arm_write_cr1和arm_read_cr1的实现为: /* uint32_t arm_read_cr1(void) */

FUNCTION(arm_read_cr1)

        mrc                p15, 0, r0, c1, c0, 0

        bx                lr

/* void arm_write_cr1(uint32_t val) */

FUNCTION(arm_write_cr1)

        mcr                p15, 0, r0, c1, c0, 0

        bx                lr
复制代码所以arch_disable_mmu();的最后一条指令时bx lr , 即返回指令,这条指令也执行了,但奇怪的是为什么entry(0, machtype, tags);这个就不执行了呢?
entry(0, machtype, tags);被反汇编为5条指令,3条push压栈指令,一条mov r0 , #0, 最后是blx r9 , 跳到内核,其中 r9是zImage 地址.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

深爱成瘾 2022-10-07 18:46:32

是否还需要invalidate一下tlb呢?arm没研究过,我觉得需要吧

始终不够 2022-10-07 18:46:32

Thanks

强者自强 2022-10-07 18:46:32

thanks
还有哪位高人能再给解释下?

并安 2022-10-07 18:46:32

wo ye peng dao zhe ge wen ti le ?
ye bu zhi dao wei shen me?

你怎么敢 2022-10-07 18:46:32

期待解答

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文