在定制处理器上运行 Linux 内核和 Ubuntu

在定制处理器上运行 Linux 内核和 Ubuntu

这几乎不是一个理论问题,因为许多人已经这样做了,尽管有关基本过程的信息很少。

我正在开发一个基于 MIPS 的定制处理器,我想在其上运行 Ubuntu。在设计了指令集和计算机体系结构本身之后,我对下一步该做什么感到非常困惑。我需要能够运行内核和操作系统,但这一切如何结合起来?

目前我正在研究为 Linux 内核设计一个编译器来生成适当的汇编语言。这是一个好方法吗?之后我需要做什么?

答案1

在架构方面,您需要的不仅仅是指令集和计算机架构。您还需要:

  • 某种形式的 CPU(模拟器、FPGA、硅片……)。
  • 启动处理器的方法:将操作系统放入处理器在启动时运行的内存中的方法。大多数处理器启动到存储在 ROM 中的代码,这些代码要么打开某种闪存并分支到它,要么将某些代码从某些存储介质加载到 RAM 并分支到它。下一阶段是操作系统引导加载程序。
  • 一些外设——至少是 RAM、某种存储控制器和一些输入/输出设备。

在软件方面,您将需要:

  • 一个编译器。由于您使用的是 MIPS 架构,任何现有的针对 MIPS 的编译器都应该足够了。如果您的指令集扩展了基本的MIPS指令集(例如使用额外的寄存器),您可能需要相应地扩展汇编器。
  • 一个内核。 Linux for MIPS 已经存在。您必须添加对架构中自定义内容的支持:引导、MMU……
  • 司机。您需要为所有非现成的计算机体系结构编写驱动程序。
  • 引导加载程序。引导加载程序中通常有一些特定于体系结构的内容,但您可能可以向现有引导加载程序添加必要的支持,例如通过将机器定义添加到U盘启动
  • 这就是全部。一旦有了内核和引导加载程序,用户态程序就应该可以正常工作了。从现有发行版修补内核和引导加载程序,在您的 PC 上交叉编译并安装。 Ubuntu 不支持 MIPS,但是德班做 (mips 或 mipsel取决于字节顺序)。

答案2

哇,我想你已经投入了很多工作(如果你问我的话,这听起来像是一个多年的项目)。你实际上不会做所有这些,对吧?

是的,下一步是编写(或者更好:移植)某种编译器(我想首先您想使用当前 PC 上的交叉编译器)。

我猜想移植现有的编译器(如 gcc)可能是更容易的任务(它已经支持许多体系结构,但是我从来没有做过类似的事情,也许GCC 内部文档会帮助你)。

在你启动并运行你的编译器之后,我会尝试一些基本的类似微控制器的程序(例如让一个数据端口上的 LED 闪烁等)和一些测试程序,看看一切是否正常工作预期的。

下一步可能是实现一个引导加载程序,最终加载您的内核。我不知道您的架构是否会使用 BIOS/EFI 或类似的东西,但这是设计引导加载程序时要考虑的另一件事。

之后,就该进入内核了。从最小的内核配置开始,并尝试启动并运行它。您需要将内核移植到您的体系结构(其中包括配置所有依赖于架构的头文件、编写模块来访问您的硬件、串行驱动程序以便您可以访问 shell 等),这又是一个相当广泛的过程。

顺便说一句:我希望你的架构有一个内存映射单元,否则你稍后会遇到一些严重的麻烦(如果它没有研究过)µClinux它能够运行无 mmu 的内核,但我严重怀疑你是否能够运行完整的桌面操作系统)。

您可能想看看 android 或 OpenWRT 内核,它们都在嵌入式设备上运行。

一旦内核被移植(如果你想自己做的话,很多年后),你将继续用户空间。我首先移植 busybox、编译器,然后是一些基本的 unix 工具,如 openssh、cron 等。

之后(假设您的系统已经连接了一个可以工作的 GPU),您必须编写一个 GPU 驱动程序并尝试获取X服务器(或其替代品韦兰)。请记住,您需要实施 2D/3D 加速才能启动并运行 Ubuntu 桌面。

最后,任务是将尽可能多的 ubuntu 软件包移植到您的平台。

总而言之:您刚刚花费了大量时间来开发自己的 CPU 架构,但您刚刚开始在其上运行一个成熟的 Linux 发行版。我希望你只是写一本关于这个过程的书,而不是真正去做,因为你在接下来的几年里会让自己陷入繁重的工作负担中。

不过,我希望我能给您简要介绍一下这个过程(我希望我没有错过任何重要的事情)。祝你好运。

相关内容