如何通过机器理解OS内核代码

时间:2012-10-14 15:21:34

标签: c assembly compiler-construction

我在这里有一个非常天真的问题,我希望你能纠正我在这里提出的任何错误概念。问题如下:

我的机器上安装了ubuntu,现在用helloWorld.c语言编写了C程序。现在,在操作系统上我安装了一个编译器,当我执行我的helloWorld.c程序时,操作系统会调度编译器,并且基本上将我的代码编译成机器代码,最终我执行。

现在我的内核代码是用C编写的,那么我的机器如何解释该代码呢?假设我的内核代码是helloWorld.c,现在我不需要任何编译器来编译这段代码。另外,如果我在ROM或其他东西中对编译器进行硬编码,那么它的语言是什么?汇编语言?

如果我已经清楚了解问题,请告诉我。

感谢。

编辑:我的意思是内核代码,操作系统的代码。操作系统代码。我想这是用C写的吗?

3 个答案:

答案 0 :(得分:13)

我认为你问题的关键是chicken-n-egg problem for compilers

  1. C代码需要编译器来构建它。
  2. C编译器本身是用C
  3. 编写的
  4. 那么我们是如何构建编译器的呢?
  5. 现在我们有编译器可用。因此,当开发用C编写的较新版本的编译器(比如gcc4.7)时,首先使用较旧版本的编译器来构建它。即gcc4.6(已经存在)将用于编译代码并生成最新版本,即gcc4.7。

    这可以追溯到第一个编译器永远,正如你正确提到的那样,在汇编时需要大量的编码。

    您可能需要查看此discussion on the bootstrapping & history of the 1st compiler


    更新:

    使“第一个” OS +编译器运行的一种相当常见的方法是交叉编译。以下是所有所需要的nice description以及 一个人对此的看法。在工程界,这个过程被称为“移植”操作系统到特定的设备/架构。

    基本上是第一个需要的裸体:

    1. 内核
    2. 的libc
    3. 编译
    4. 基本操作系统工具

答案 1 :(得分:6)

内核也被编译为特定于处理器体系结构的机器语言,与生成的helloWorld程序相同。

正如你所说,有人在C中编写内核,但是在已经拥有操作系统且能够编译新内核的计算机上编译它。

曾几何时,内核是用机器语言手工编写的,然后使用它来编写更复杂的程序,包括用于编写替换内核的编辑器和编译器。其余的都是历史......

答案 2 :(得分:0)

操作系统“内核”通常在机器的MODE0中运行。它可以直接访问所有硬件,并为其启用了更多指令。如果您的HELLO WORLD要直接访问硬件,请将其写入内核..然后..首先,您的引导加载程序将从您的内核所在的位置获取二进制数据,然后将设置运行内核的环境以执行。反过来,这将为您执行该程序。