为什么uboot的入口文件是用汇编语言编写的?

时间:2014-03-11 09:45:07

标签: c u-boot

为什么uboot的入口点(Start.S)是用汇编语言编写的?是出于性能原因还是存在其他问题。为什么它不是用C语言编写的?

3 个答案:

答案 0 :(得分:1)

除非保证入口点符合C编译器使用的ABI中C函数调用形式的初始状态,否则C不能表示入口点。如果寄存器中存在任何相关状态,则(1)可能被编译器生成的任何序言代码破坏,对于call-clobbered寄存器,以及(2)即使寄存器被调用保存,编译器也可能会移动它们某个未暴露于C代码的地方,即使C代码可以访问内联汇编扩展。 (旁注:uClibc对某些arch的{​​{1}}实现在这方面是错误的;它是使用内联asm而不是asm函数错误编写的,并假设编译器尚未修改/移动已调用的寄存器当内联asm到达时。)许多入口点(例如对于ELF二进制文件)也有初始状态以不能用C表示的方式放置在堆栈上。

答案 1 :(得分:0)

每个处理器架构都有自己的启动顺序和过程。 它们可能过于具体,无法在C下概括。

例如

ARM要求内核的启动和初始化在管理程序模式下完成,这可以通过设置控制寄存器中的S位来启用。然后将控件切换到用户模式。此过程在x86和PowerPC中有所不同。

是的,它可以在C中完成,但在架构特定的汇编语言中执行与架构相关的初始化更有意义。

答案 2 :(得分:0)

入口点处于汇编状态,因为在早期启动阶段,没有任何工具可以调用C函数。在我们调用C函数之前,系统应该已经有一个有效的堆栈。有效堆栈可以位于DDR RAM或SRAM中。在我们使用DDR RAM或SRAM之前,我们必须先将其初始化。在初始化这些之前,我们必须首先设置PLL和其他时钟。你应该在这里看到一个模式。一切都从复位向量开始(除非u-boot是RAMBOOT变体)。

所有这些早期的低级初始化都是由启动代码(在汇编中)执行的。内存初始化后,代码设置堆栈和堆,并继续运行C编码部分。