我正在尝试在cortex A53上启动arm64 linux(自定义内核配置,从当前的git master构建到21年9月23日),在FPGA平台上仿真。我的可用内存是2GB(0x0 - 0x80000000)。我使用u-boot作为引导加载程序,将uImage传递到一个加载点(和相同的入口点):0x10000000。
通过外部jtag调试器,我可以看到执行是在头部。S(https://github.com/torvalds/linux/blob/master/arch/arm64/kernel/head.S)运行函数,(__enable_mmu). 一旦设置了TTBR寄存器并执行了启用mmu的SCTLR寄存器,系统就会陷入硬挂。我立即失去了跟踪程序计数器的能力。我假设mmu已启用,但我不确定出了什么问题。(在此之前没有早期打印)。 我怀疑:
- 我看到在头部。在启用mmu之前,linux在设置页表条目方面做得最少。我认为这是标准的。这一步有什么地方可能出错吗?如果页表没有正确设置,我如何验证&解决这个问题。我对mmu相关的东西比较陌生。
更新:
- 在大量的试验错误之后,禁用dcache使它通过了硬挂。我更改了传递给sctlr的参数(启用mmu,禁用缓存),引导继续进行,没有任何问题*。我的问题是,为什么这个工作。这无疑表明了一个更深层次的问题。dcache刷新/无效没有正确发生吗?缓存操作的时间是否不同步?
在加载驱动程序时,引导确实会崩溃,但这是另一个问题。
任何见解都会有所帮助。干杯!
回答我自己的问题来解决这个问题。这是一个非常特殊的角落案例,它与如何为FPGA平台配置硬件有关。硬件设计实现了时钟门控,这打乱了缓存和内存之间的读取周期,导致了硬挂。