![在定制处理器上运行 Ubuntu 内核和操作系统](https://linux22.com/image/828024/%E5%9C%A8%E5%AE%9A%E5%88%B6%E5%A4%84%E7%90%86%E5%99%A8%E4%B8%8A%E8%BF%90%E8%A1%8C%20Ubuntu%20%E5%86%85%E6%A0%B8%E5%92%8C%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.png)
这不是一个理论问题,因为很多人都这样做过,尽管关于其底层过程的信息很少。
我正在开发一个基于 MIPS 的定制处理器,我想在该处理器上运行 ubuntu。在设计了指令集和计算机架构本身之后,我很困惑下一步该做什么。我需要能够运行内核和操作系统,但这一切如何联系在一起?目前,我正在研究为 Linux 内核设计一个编译器来生成适当的汇编语言。这是个好办法吗?之后我需要做什么?
答案1
要想有机会移植它,首先需要 GCC 能够为目标 CPU 生成目标代码,内核是使用 GCC 编写的,我们还假设 GCC 也用于构建许多用户空间应用程序。
然后,您还需要在内核中为您的 CPU 和平台编写特定于体系结构的部分。如果您的 CPU 基于现有的 MIPS 设计,那么这会让事情变得容易一些,例如,如果幸运的话,您的目标 CPU 可能已经存在虚拟内存管理处理,但是如果是新设计,您可能需要从头开始编写它。
如果你正在编写自己的编译器,那么你需要让它支持内核支持的所有 GCC 特定扩展,而且有很多。移植 GCC 可能比从头编写自己的编译器更容易。
移植内核是第一步,但对于新 CPU,您需要考虑如何设计用户空间将系统调用传入内核的方式,并且您需要为内核编写系统调用处理程序,以及用户空间 C 库系统调用垫片。您会发现,需要付出巨大的努力才能让用户空间第一个进程 init 运行。然后,您需要交叉编译所有核心库和实用程序才能启动基本系统。这并非易事。第一步是能够构建 busybox 之类的工具,这些工具为您提供一组最少的 Linux 工具,以便能够使用一组最少的工具运行 shell 来与系统交互。
在 2.2 内核时代,我将 Linux 和 busybox 移植到新架构(VLIW 媒体处理器)作为研究项目(已取消)的一部分,花了大约一年的时间才能够启动内核、运行 init 并在串行 TTY 上启动 busybox。这还不包括获得稳定工具链的努力。请注意,这可能需要一些努力。