首页 文章

Linux内核如何编译自己?

提问于
浏览
87

在我的机器上安装Linux系统时,我不太了解Linux内核的编译过程 .

以下是让我困惑的一些事情:

  • 内核是用C语言编写的,但是如何在没有安装编译器的情况下编译内核?

  • 如果在编译内核之前在我的机器上安装了C编译器,如何在没有安装编译器的情况下编译编译器本身?

几天来我很困惑,谢谢你的回应 .

7 回答

  • 5

    你的Linux机器的第一轮二进制文件是在其他Linux机器上构建的(可能) .

    第一个Linux系统的二进制文件是在其他平台上构建的 .

    该计算机的二进制文件可以将其根目录追溯到另一个平台上构建的原始系统 .

    ...

    推动这一点,您会发现使用更原始的工具构建的编译器,这些工具又构建在除主机之外的机器上 .

    ...

    继续推送,你发现计算机已经建成,以便 setting switches on the front panel of the machine 可以输入他们的指令 .

    很酷的东西 .

    规则是“构建工具来构建工具来构建工具......” . 非常像运行我们的物理环境的工具 . 也被称为“通过引导拉自己” .

  • 1

    描述这种现象的术语是bootstrapping,它足以编译自己的软件 . 实际上,这些类型的设备通常没有足够的资源来像编译器一样复杂地运行任何东西 .

    他们的软件是在台式机上开发的,然后在编译后复制 .

    如果这种事情让你感兴趣的话,我脑海中浮现的一篇文章是:Reflections on Trusting Trustpdf),这是一本经典而有趣的读物 .

  • 33

    它不是乌龟一路下来 . 就像你说的那样,你无法在运行该操作系统的系统上编译以前从未编译过的操作系统 . 类似地,至少编译器的第一个构建必须在另一个编译器上完成(并且通常也是一些后续构建,如果第一个构建结果不能仅仅编译它自己的源代码) .

    我认为最初的Linux内核是在Minix盒子上编译的,虽然我不确定 . GCC当时可用 . 许多操作系统的早期目标之一是运行编译器以便编译自己的源代码 . 更进一步,第一个编译器几乎肯定用汇编语言编写 . 第一批汇编程序是由那些不得不用原始机器代码编写的穷人编写的 .

    您可能想要查看Linux From Scratch项目 . 你实际上在本书中构建了两个系统:一个"temporary system",它构建在你自己没有构建的系统上,然后构建在临时系统上的"LFS system" . 本书目前的编写方式,您实际上是在另一个Linux机器上构建临时系统,但理论上您可以调整它以在完全不同的操作系统上构建临时系统 .

  • 14

    如果我正确理解你的问题 . 这些天内核并没有“自我编译” . 今天的大多数Linux发行版都通过linux live cd提供系统安装 . 内核从CD加载到内存中,并且正常运行,就像它安装到磁盘一样 . 在系统上启动并运行Linux环境后,只需将必要的文件提交到磁盘即可 .

    如果你在谈论自举问题; dmckee总结得相当不错 .

    只提供另一种可能性......

  • 5

    我认为你应该区分:

    compile ,v:使用编译器处理源代码并生成可执行代码[1] .

    install ,v:连接,设置或准备使用[2] .

    编译从源代码生成二进制可执行文件 . 安装只是将这些二进制可执行文件放在正确的位置以便以后运行它们 . 因此,如果二进制文件可用,则安装和使用不需要编译 . 相应地考虑“编译”和“安装”,如“烹饪”和“服务” .

    现在,您的问题:

    内核是用C语言编写的,但是如何在没有安装编译器的情况下编译内核?

    没有编译器就无法编译内核,但可以从已编译的二进制文件中安装内核 .

    通常,在安装操作系统时,需要安装预编译的内核(二进制可执行文件) . 它是由其他人编译的 . 只有当你想自己编译内核时,才需要源代码和编译器以及所有其他工具 .

    即使在像gentoo这样的“基于源代码”的发行版中,您也可以从运行已编译的二进制文件开始 .

    所以,你可以在不编译内核的情况下度过你的整个生活,因为你有别人编译它们 .

    如果在编译内核之前在我的机器上安装了C编译器,如何在没有安装编译器的情况下编译编译器本身?

    如果没有内核,则无法运行编译器(OS) . 因此,必须安装一个已编译的内核来运行编译器,但不需要自己编译内核 .

    同样,最常见的做法是安装编译器的已编译二进制文件,并使用它们编译其他任何内容(包括编译器本身和内核) .

    现在,鸡和鸡蛋的问题 . 第一个二进制文件是由其他人编译的......请参阅dmckee的优秀答案 .

  • 207

    内核不是由用户空间中的C编译器编译的 . 在大多数CPU架构中,CPU在特殊寄存器中有许多位,表示当前运行的代码具有哪些特权 . 在x86中,这些是代码段(CS)寄存器中的当前特权级别位(CPL) . 如果CPL位为00,则认为代码在安全环0中运行,也称为内核模式 . 如果CPL位是11,则认为代码在安全环3中运行,也称为用户模式 . 其他两种组合,01和10(分别为安全环1和2)很少使用 .

    关于在用户模式与内核模式下代码可以做什么和不能做什么的规则相当复杂,但足以说明,用户模式严重降低了特权 .

    现在,当人们谈论操作系统的内核时,他们指的是操作系统代码中以高级权限在内核模式下运行的部分 . 通常,出于安全原因,内核作者会尽量保持内核尽可能小,因此不需要额外权限的代码也没有 .

    C编译器就是这样一个程序的一个例子 - 它不需要内核模式提供的额外特权,因此它像大多数其他程序一样在用户模式下运行 .

    在Linux的情况下,内核由两部分组成:内核的源代码和内核的编译可执行文件 . 任何带有C编译器的机器都可以将内核从源代码编译成二进制映像 . 那么,问题是如何处理二进制图像 .

    在新系统上安装Linux时,通常是从物理介质(例如CD DVD)或网络安装预编译的二进制映像 . BIOS将从媒体或网络加载内核引导加载程序的(二进制映像),然后引导加载程序将内核的(二进制映像)安装到您的硬盘上 . 然后,当您重新启动时,BIOS会从硬盘加载内核的引导加载程序,并且引导加载程序会将内核加载到内存中,然后您就会关闭并运行 .

    如果你想重新编译你自己的内核,这有点棘手,但它可以完成 .

  • 11

    首先是哪一个?鸡还是鸡蛋?

    从恐龙时代开始,鸡蛋一直存在 .

    ..有点混淆一切,说鸡实际上是大兽的后代......长话短说:技术(鸡蛋)在当前产品(鸡)之前存在

    你需要一个内核来构建一个内核,即你用另一个内核构建一个内核 .

    第一个内核可以是你想要的任何内容(最好是可以创建你想要的最终产品的合理内容^ __ ^)

    This tutorial from Bran's Kernel Development教您开发和构建一个小内核,然后您可以使用您选择的虚拟机进行测试 .

    含义:您在某个地方编写和编译内核,并在空(无操作系统)虚拟机上读取它 .

    这些Linux安装所发生的事情遵循相同的想法,增加了复杂性 .

相关问题