3

我正在尝试为 Raspberry-Pi 构建自己的工具链。我知道有很多预建的工具链。这项工作是出于教育原因。我正在从头开始关注嵌入式 arm linux。并且目前成功构建了gcc和uClib。我正在为目标 arm-unknown-linux-eabi 构建。

现在谈到准备一个可引导的文件系统,我正在质疑自己关于引导加载程序构建的问题。

关于这个系统的引导加载程序的部分似乎不完整。现在我在问自己如何使用我的 arm-unknown-linux-eabi 工具链为这个系统构建一个 uboot。

我是否需要构建一个不依赖于 linux 内核调用的工具链。我的第一个研究使我指出,有不同类型的工具链依赖于操作系统(linux 内核系统调用等......)和不需要在下面有内核的工具链。有时称为“裸机”工具链或“独立”工具链。

一些消息来源提到可以使用 linux 工具链构建 U-Boot。如果这是真的,为什么以及如何工作?

如果我必须为“Bare Metal”工具链构建第二个工具链,我在哪里可以找到有关这两者之间差异的信息。我需要另一个 libstdc 吗?

4

2 回答 2

2

您可以使用用于构建内核的相同交叉工具链构建 U-Boot - 并且很可能是系统的其余用户空间。

根据定义,引导加载程序是自包含的,并且不关心您选择的 C 运行时库,因为它不使用它。因此,系统调用的问题并没有涉及。

工具链总是需要由功能齐全的开发系统托管 - 总是不是您的目标系统。无论您看到什么对“裸机工具链”的引用,都不是指编译器对系统调用的使用(它严重依赖于操作系统的 I/O)。在构建引导加载程序和内核时,重要的是编译器和链接器被配置为生成可以在特定内存地址运行的静态链接代码。

于 2012-12-13T20:18:19.527 回答
1

在几乎所有可能的方面,嵌入式工具链和 Linux 工具链之间没有区别。但有一个例外。

该例外是 __clear_cache - 一个可以由编译器生成的函数,并且在“Linux”工具链中包括用于同步指令和数据缓存的系统调用。(有关该位的更多信息,请参阅http://blogs.arm.com/software-enablement/141-caches-and-self-modifying-code/。)

现在,除非您显式添加对该函数的调用,否则我知道调用它的唯一方法是在 C 中编写嵌套函数(应该避免的 GCC 扩展)。但这是有区别的。

于 2012-12-15T20:19:18.273 回答