2

私はここで非常に素朴な質問があります、そして私がここに出した間違った概念について私を訂正してほしいです。質問は次のとおりです。

私は自分のマシンにubuntuをインストールしましたが、今は言語でhelloWorld.cプログラムを書いています。Cこれで、オペレーティングシステムにコンパイラがインストールされ、helloWorld.cプログラムを実行すると、OSがコンパイラをスケジュールし、基本的にコードをマシンコードにコンパイルして、最終的に実行します。

今、私のカーネルコードはCで書かれていますが、私のマシンはそのコードをどのように解釈しますか?私のカーネルコードはhelloWorld.c、このコードをコンパイルするためにコンパイラを必要としないとしましょう。また、コンパイラをROMなどでハードコーディングした場合、どの言語で記述されていますか?アセンブリ言語?

問題を明確にしたかどうか教えてください。

ありがとう。

編集:カーネルコードとは、オペレーティングシステムのコードです。オペレーティングシステムコード。Cで書かれていると思いますよね?

4

3 に答える 3

14

あなたの質問の核心は、コンパイラにとって一種のチキンアンドエッグの問題だと思います。

  1. Cコードをビルドするには、コンパイラが必要です。
  2. ACコンパイラ自体はCで書かれています
  3. では、そもそもどのようにしてコンパイラを構築したのでしょうか。

現在、コンパイラーを利用できます。したがって、Cで記述された新しいバージョンのコンパイラ(たとえばgcc4.7)を開発する場合、最初に古いバージョンのコンパイラを使用してビルドします。つまり、gcc4.6(すでに存在している)を使用してコードをコンパイルし、最新バージョン、つまりgcc4.7を生成します。

これは、最初のコンパイラにまでさかのぼることができます。これは、当然のことながら、アセンブリで大量のコーディングが必要でした。

1番目のコンパイラのブートストラップと履歴に関するこの議論をご覧になることをお勧めします。


アップデート :

また、 「最初の」 OS+コンパイラを実行するためのかなり一般的な方法はクロスコンパイルです。これは、すべての人が何をする必要があるのか​​、そしてそれをどのように行うのかについての素晴らしい説明です。エンジニアリング界では、このプロセスはOSを特定のデバイス/アーキテクチャに「移植」することと呼ばれています。

基本的に、最初に必要な最低限の要素は次のとおりです。

  1. カーネル
  2. libc
  3. コンパイラ
  4. シェル
  5. 基本的なOSユーティリティ
于 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 に答える