2

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

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

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

让我知道我是否已经明确了这个问题。

谢谢。

编辑:通过内核代码,我的意思是操作系统的代码。操作系统代码。我猜它是用C写的吧?

4

3 回答 3

14

我认为您问题的症结是编译器的一种先有鸡的问题

  1. C 代码需要编译器来构建它。
  2. AC 编译器本身是用 C 编写的
  3. 那么我们最初是如何构建编译器的呢?

现在我们有可用的编译器。因此,当开发一个用 C 编写的新版本的编译器(比如 gcc4.7)时,首先要使用旧版本的编译器来构建它。即gcc4.6(已经存在)将用于编译代码并生成最新版本即gcc4.7。

这可以一直追溯到第一个编译器,正如您正确提到的那样,它需要大量的汇编代码。

你可能想看看这个关于第一个编译器的引导和历史的讨论


更新 :

“第一个” OS+编译器运行的一种相当常见的方法是交叉编译。这是对所有人需要什么以及如何进行的很好的描述。在工程界,这个过程被称为将操作系统“移植”到特定的设备/架构。

本质上,一个人需要拥有的第一个准系统:

  1. 核心
  2. 编译器
  3. 基本操作系统工具
于 2012-10-14T15:33:37.473 回答
6

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

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

曾几何时,内核是用机器语言手工编写的,然后使用它编写更复杂的程序,包括用于编写替换内核的编辑器和编译器。剩下的就是历史了……

于 2012-10-14T15:26:59.667 回答
0

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

于 2012-10-14T15:27:09.093 回答