Mai*_*nID 87 c linux compiler-construction
在我的机器上安装Linux系统时,我不太了解Linux内核的编译过程.
以下是让我感到困惑的一些事情:
几天来我很困惑,谢谢你的回应.
dmc*_*kee 207
你的Linux机器的第一轮二进制文件是在其他Linux机器上构建的(可能).
第一个Linux系统的二进制文件是在其他平台上构建的.
该计算机的二进制文件可以将其根目录追溯到另一个平台上构建的原始系统.
...
推动这一点,您会发现使用更原始的工具构建的编译器,这些工具又构建在除主机之外的机器上.
...
继续推动并找到计算机,以便通过设置机器前面板上的开关输入指令.
很酷的东西.
规则是"构建工具来构建工具来构建工具......".非常像运行我们的物理环境的工具.也被称为"通过引导拉自己".
sas*_*nin 33
我认为你应该区分:
compile,v:使用编译器处理源代码并生成可执行代码[1].
和
安装,v:连接,设置或准备使用的东西[2].
编译从源代码生成二进制可执行文件.安装只是将这些二进制可执行文件放在正确的位置以便以后运行它们.因此,如果二进制文件可用,则安装和使用不需要编译.相应地考虑关于"烹饪"和"服务"的"编译"和"安装".
现在,您的问题:
- 内核是用C编写的,但是如果没有安装编译器,内核是如何编译的呢?
没有编译器就无法编译内核,但可以从已编译的二进制文件中安装内核.
通常,在安装操作系统时,需要安装预编译的内核(二进制可执行文件).它是由其他人编译的.只有当你想自己编译内核时,才需要源代码和编译器以及所有其他工具.
即使在像gentoo这样的"基于源"的发行版中,你也可以从运行已编译的二进制文件开始.
所以,你可以在不编译内核的情况下度过你的整个生活,因为你有别人编译它们.
- 如果在编译内核之前在我的机器上安装了C编译器,那么如果没有安装编译器,编译器本身如何编译?
如果没有内核(OS),则无法运行编译器.因此,必须安装已编译的内核来运行编译器,但不需要自己编译内核.
同样,最常见的做法是安装编译器的已编译二进制文件,并使用它们编译其他任何内容(包括编译器本身和内核).
现在,鸡肉和鸡蛋问题.第一个二进制文件是由其他人编译的......请参阅dmckee的优秀答案.
Ada*_*eld 11
内核不编译自己 - 它由用户空间中的C编译器编译.在大多数CPU架构中,CPU在特殊寄存器中有许多位,表示当前运行的代码具有的特权.在x86中,这些是代码段(CS)寄存器中的当前特权级别位(CPL).如果CPL位为00,则认为代码在安全环0中运行,也称为内核模式.如果CPL位是11,则认为代码在安全环3中运行,也称为用户模式.其他两种组合,01和10(分别为安全环1和2)很少使用.
关于在用户模式与内核模式下代码可以做什么和不能做什么的规则相当复杂,但足以说明,用户模式严重降低了特权.
现在,当人们谈论操作系统的内核时,他们指的是操作系统代码的部分,这些部分可以在内核模式下以提升的权限运行.通常,出于安全原因,内核作者会尽量保持内核尽可能小,因此不需要额外权限的代码也没有.
C编译器就是这样一个程序的一个例子 - 它不需要内核模式提供的额外特权,因此它像大多数其他程序一样在用户模式下运行.
在Linux的情况下,内核由两部分组成:内核的源代码和内核的编译可执行文件.任何带有C编译器的机器都可以将内核从源代码编译成二进制映像.那么,问题是如何处理二进制图像.
在新系统上安装Linux时,通常是从物理介质(例如CD DVD)或网络安装预编译的二进制映像.BIOS将从媒体或网络加载内核引导加载程序的(二进制映像),然后引导加载程序将内核的(二进制映像)安装到您的硬盘上.然后,当您重新启动时,BIOS会从硬盘加载内核的引导加载程序,并且引导加载程序会将内核加载到内存中,然后您就会启动并运行.
如果你想重新编译自己的内核,这有点棘手,但可以做到.
首先是哪一个?鸡还是鸡蛋?
从恐龙时代开始,鸡蛋一直存在.
..有些人混淆了一切,说鸡实际上是大兽的后代......长话短说:技术(鸡蛋)在当前产品(鸡)之前存在
你需要一个内核来构建一个内核,即你用另一个构建一个内核.
第一个内核可以是你想要的任何东西(最好是能够产生你想要的最终产品的合理的东西^ __ ^)
Bran的内核开发教程教您开发和构建一个小内核,然后您可以使用您选择的虚拟机进行测试.
含义:您在某处编写和编译内核,并在空(无操作系统)虚拟机上读取它.
这些Linux安装所发生的事情遵循相同的想法,增加了复杂性.
它不是乌龟一路下来.就像你说的那样,你无法在运行该操作系统的系统上编译以前从未编译过的操作系统.类似地,至少编译器的第一个版本必须在另一个编译器上完成(并且通常也是一些后续版本,如果第一个构建结果不能仅仅编译自己的源代码).
我认为最初的Linux内核是在Minix盒子上编译的,虽然我不确定.GCC当时可用.许多操作系统的早期目标之一是运行编译器以便编译自己的源代码.更进一步,第一个编译器几乎肯定用汇编语言编写.第一批汇编程序是由那些不得不用原始机器代码编写的穷人写的.
您可能想查看Linux From Scratch项目.实际上,您在本书中构建了两个系统:一个构建在您自己未构建的系统上的"临时系统",然后构建在临时系统上的"LFS系统".本书目前的编写方式,您实际上是在另一个Linux机器上构建临时系统,但理论上您可以调整它以在完全不同的操作系统上构建临时系统.