我的理解是,像 Ubuntu 这样的发行版是构建在 Linux 内核之上的,而内核本身只是平台硬件的一个接口。例如,Linux 源代码要求平台实现某些功能,例如raw_copy_from_user
.一旦平台遵循这个接口,我们就可以编译它。现在,将发行版视为需要此编译的二进制文件作为构建输入的附加代码是否正确?在这种情况下,任何编译的二进制文件都可以作为输入吗?
例如,假设我开发了一个新平台,并将所有必要的代码放入arch/
内核进行编译。那么我将如何使用这个二进制文件和现有的发行版在我的平台上构建可运行的操作系统?
答案1
在发行版中提供新平台涉及几个步骤,其中第一步不是内核:
您需要能够为该平台构建程序,这意味着您需要一个编译器(和一个汇编器);对于使用 GCC 的系统,这意味着您需要为该平台提供可用的 Binutils 和 GCC。
一旦你有了编译器,你就需要一个 C 库;只有这样,您才拥有构建常规 C 程序所需的一切。
有了这些,您就可以开始为您的新平台交叉编译程序了;这就是平台初始化通常是如何完成的——最初你在新平台上不会有工作环境,你需要在另一个系统上构建它。
一旦你拥有了 C 编译器,甚至在 C 库之前,你就可以开始处理内核了;内核的大部分内容与平台无关,但您需要添加一个新的
arch
子目录并实现新平台所需的所有内容(系统初始化、内存管理、系统调用接口等)。 Linux 内核的构建基础设施对交叉编译提供了强大的支持,即使在架构启动之后,这也是很有帮助的——嵌入式系统尤其受益于能够在更快的系统上构建其内核。平台启动的最后一部分是引导 - 您将需要某种引导加载程序,其详细信息可能是特定于平台的。
此时,您应该能够构建发行版的核心,至少足以在新平台上运行构建环境,这将允许您开始在新平台上本地构建程序。 (交叉编译并不适用于所有情况。)
在发行版环境中,一旦构建环境可以在新平台上运行,您通常会将其提供给发行版使用的通用构建基础架构,并开始构建发行版的软件包。您可以在Debian 端口和构建的统计数据— 特别查看软件包可用性图表:
垂直线表示新架构何时提出;所有为新架构“轻松”构建的软件包都会快速提升,然后将进度逐渐提高到 100%。 (架构永远无法达到 100%,因为某些包是特定于架构的。)
非官方架构的图表也很有趣:
像这样的新兴架构riscv64
很容易被识别,像hppa
.