1. Linux 发行版(例如 Debian)

1. Linux 发行版(例如 Debian)

我通过从 kernel.org 下载 Linux 内核来编译它,将其放在桌面上,然后打开终端。我更改为 linux-3.2.13 文件夹,输入mr proper
然后我用它make menuconfig来配置我的 .config 文件。完成并保存后,我输入make并终端开始编译文件。经过3个小时的编译,我想知道我是否做错了什么。

我的问题是:

  1. 我做错什么了吗?
  2. 如果没有的话我下一步该做什么?
  3. 输出是什么(例如 .bin、.elf)?
  4. 我的最终目标是制作一个可以放在光盘上、放在另一台计算机上并运行的操作系统(不是具有不同内核的 Ubuntu 操作系统)。

答案1

我做错什么了吗?

看起来不像。编译最新的内核非常消耗资源。如果您的 CPU 不是最新的,并且您没有大量 RAM,则可能需要非常长的。
确保只选择实际需要的模块/功能,如果您有一台具有一定 RAM 的多核/线程计算机,请使用该-jX选项,make以便它可以并行运行构建。例如

make -j4

大部分构建将使用四个核心。

输出会是什么?

它将是一个压缩的内核映像。它不是 ELF 文件,也不是普通意义上的可执行文件。它采用适合您平台的引导加载程序处理的格式。

接下来我应该做什么?

取决于你要做什么......(参见这里假设您使用的是 Grub,请参阅安装模块和内核映像的简单 HOWTO。通过快速搜索还有很多其他可用的,如果您计划使用新内核实际运行主流发行版,您最好查看当前发行版的文档 - 有一些功能要求,并且可能需要满足 initrd 的特殊性予以考虑。)

[我的目标是构建自己的操作系统]

恐怕你离那还很远。构建操作系统是一项非常非常复杂的任务 - 而构建内核是非常简单的部分之一。

我建议你去Linux 从头开始并阅读当前稳定的“书”。还关注一下发行观察,然后搜索“基于源”的发行版类别,其中一些可能是您感兴趣的。

答案2

我发表了很多评论,并认为最好将内容作为答案发布,因为盒子更大,我可以胡说八道。 :) 我希望你能原谅我疯狂的胡言乱语。

另外,我现在警告你:我是个彻头彻尾的混蛋,我会稍微剪掉你的翅膀。

您需要决定的第一件事是:您的编程技能有多好?如果没有良好的编程技能和对硬件的充分了解,您就无法编写自己的操作系统。

您需要决定的第二件事是:

  1. 您正在制作 Linux 发行版吗? (例如 Debian、Ubuntu、红帽)
  2. 您正在制作具有不同运行时的基于 Linux 的操作系统吗? (例如 Android、Maemo)
  3. 您是从头开始编写操作系统吗? (例如 VMS、CP/M、RT-11、阿米巴、Plan/9)

在回答这些问题之前,您应该仔细检查以确保您已记下条款,这样您就知道自己在做什么。

1. Linux 发行版(例如 Debian)

如果您只想制作另一个 Linux 发行版,那么编译内核是您最不用担心的。只要有足够的时间和足够大的计算机,内核实际上可以自行编译。

这是一个讨论制作 Linux 发行版的一些方面的文章

为什么这比您想象的要困难:您想要添加到发行版中的功能越多,正确构建发行版就越困难。您必须选择是重新发明轮子(创建自己的包管理器),还是使用现有的轮子(RPM?APT?端口?)。无论哪种情况,您都将花费数月时间进行烦人的工作,协调相互不兼容的软件包、编译、验证使用具有不同 CPU(不仅仅是 Intel 或 AMD)的不同计算机的工作,等等。

根据范围的不同,您最终可能不得不自己重做数千人的工作。你会从中学到很多东西吗?绝对地!但是,通过运行现有的 Linux 发行版,以及偶尔自己编译一些软件包来了解其工作原理,您也可以学到很多东西。如果您只想了解 X 服务器是如何构建的,为什么还要构建 libc 和数​​百个其他库呢?

可以这样想:如果您想学习如何组装 PC,您会从一桶晶体管和烙铁开始,还是从 PC 组件和一些文档开始?

2.基于Linux的操作系统(例如Android)

有相当多基于 Linux 的操作系统的运行时与 POSIX 相当不同。我想到的是 Maemo、Meego、Android 和其他(最常见的是嵌入式)操作系统。

这样做的好处是你不需要编写自己的内核。这样做的缺点是您不仅需要设计自己的发行版,而且还必须自己制作大部分软件包。您认为编译gcclibc痛苦吗?尝试编写自己的 ANSI-C 兼容 C 编译器从头开始的完整软件堆栈。多年来编写烦人的小函数(可能在汇编中)提供了微小的满足感。您还需要学习 Linux 内核的大部分内部结构,以及它如何与用户空间通信,因为您将在该接口上进行构建。到本文结束时,您应该已经记住了大多数系统调用编号。 :)

你会学到很多东西吗?绝对地!比你想象的更多。会不会感到沮丧和烦恼?哦是的。 Android 不是由一个孤独的人在业余时间用笔记本电脑开发的,这是有原因的。甚至gcc不是那样建造的。

3. 从头开始​​的操作系统

这是您从汇编器和 C 编译器开始并编写您自己的内核的地方 - 如果您的操作系统甚至有内核。情况并非普遍如此。下载您能找到的所有硬件数据表,然后就可以开始使用了。一旦你运行了基本的内核,你就可以看到运行时了。您可以编写自己的运行时,或者确保您的内核部分或完全兼容 POSIX,然后您将拥有完整的 GNU 运行时。您“只需”创建第一层库并gcc在新操作系统上运行。

这有回报吗?令人惊讶的是。会很难吗?如果唐纳德·高德纳(Donald Knuth)、安德鲁·塔南鲍姆(Andrew Tanenbaum)这些名字对你来说毫无意义,那么你可能应该重新考虑。将会有很多人学习理论计算机科学。真正从头开始构建操作系统涉及大量的理论。不幸的是,现代系统也存在大量单调乏味的情况。

过去,您只需在正确的位置烧录带有 JMP 指令的 ROM,插入它,通电,然后就完成了。现代系统需要大量的工作才能启动并运行 CPU 内核、设置内存、枚举输入设备以及启动输出设备。关于这些任务中的每一项都有完整的书(我有一本关于原来的超过 1,000 页的 VGA — 在 8 位机器的陪伴下长大,我以为对 1987 年的 VGA 进行编程会很简单,我非常恼火,但在这个过程中我学到了很多东西!)

那么,你应该吗?

你绝对应该尝试。不要对“成功”有误解,除非您从一开始就设定了目标。维护操作系统/发行版是一个开放式的通常由一大群人完成的任务。但即使尝试这样做也会磨练你的技能并教会你新的技能。

顺便说一句,我是根据大多数这些事情的(通常是痛苦的)经验来说话的。我已经(共同)为一些 CPU(学习/工作/娱乐)编写了嵌入式低级运行时,并且目前我正在为玩具 CPU 编写一个玩具操作系统(这都是为了好玩)。

答案3

按照以下教程中给出的步骤在 Ubuntu 中编译内核:

如何编译内核:Ubuntu 方式”

相关内容