web-dev-qa-db-ja.com

Cでオペレーティングシステムを作成することはできますか?

しばらく前に、私は Stack Overflowの質問 についてのコメントを見ました。

Cでオペレーティングシステムを作成することはできません。不可能です。できることは、Cコアの上にかなりの量の非標準機能を追加/定義するCベース/ Cのような言語でオペレーティングシステムを作成することです。

Cをそれほど狭く定義することは有用ですか? Linux、GPUドライバー、または組み込みシステムは「Cで書かれた」ではなく、「ハードウェアに対応する拡張機能を備えたCで書かれた」とは言われていません。

そうすることは間違っていますか?

7
Crashworks

質問はかなり広範で、現状では答えはイエスです。実際、ほとんどのプログラミング言語では答えはイエスですが、catchがあります。

OSコードをマシンが理解できるものに変換する必要があります。そして、あなたの言語でオペレーティングシステムを書くことができるかどうかを決定するのは、マシンとその母国語、そして「あなたの」言語から「母国語」の言語に翻訳する能力です。

一般理論

機械にレバーがあるとしましょう。そして、2つのことだけが可能です。レバーを押し下げると、マシンにコーヒーが注がれ、マシンを引き上げると、コーヒーの注ぎが止まります。ここで、私のネイティブランゲージトランスレータが、紙に印刷されたCコードを読んで、レバーを上下に押すかどうかを決定できる人間だと想像してください。したがって、たとえば次の行を読むと、人間の「コンパイラリンカー」がレバーを押し下げます。

printf("pour coffee"); //Support more similar syntax in later versions!

次の行を読むと、人間の「コンパイラリンカー」がレバーを引き上げます。

printf("stop pouring coffee"); //Support more similar syntax in later versions!

オペレーティングシステムの記述に成功しましたこのコーヒーマシンの場合完全にC言語で記述しています。さらに、compilerJava、C#、KSH、Perl、英語、スラビック、サンスクリットなどを翻訳し、マシンを「操作」します。したがって、用語、オペレーティングシステム。

もちろん、最近のほとんどのコンピューターは、これよりも複雑なことを行うことができます。したがって、それらの 命令セット の複雑さは、単なるレバー state を超えています。これらの命令セットは最終的にいくつかのトランジスタ/磁石/ LEDなどをある状態に置くだけであり、私たち人間は結果としてそれを解釈します。

したがって、問題は、このマシンを操作して、目的の状態を達成することの1つになります。そして、あなたの言語(例えば、C)がそのネイティブの命令セットに翻訳できる場合andこのブリッジを使用してマシンにあなたが望むことをさせることができれば、成功したオペレーティングシステム。

具体的な例

現在x86_64システムを実行しています。このシステムはCが何であるかを知りません。 OS X、Windows、またはBSDが何であるかはわかりません。最終的には、いくつかのx86_64アセンブリコードを実行しています。そのコードは人間によって(ほとんどの場合)作成されたものではありません。おそらくCまたはC++で人間によって書かれ、アセンブリ言語に翻訳されています。このコンパイル済みコードを私のパワーPCマシンにコピーすると、動作しませんが機能します。元のC/C++/whatever_languageコードベースが必要で、そのコードをPower PC言語に変換する必要があります。 PC言語に翻訳できないCで何かを試みている場合、その機能は新しいオペレーティングシステムでは機能しませんが機能しません。

デバイスはどうですか?

マシンに接続するデバイス(モニター、マウス、プリンター、オーディオ出力など)が多いほど、ブリッジ用に作成するコードが多くなります。それがドライバーの仕事です。必要に応じて、Cでドライバーを作成できます。必要なのは、Cをそのデバイスの「命令セット」に変換する方法だけです。通常、reads標準電気信号であるコード/回路をデバイスに埋め込んで、コアコンピューターをだまして標準命令セットを使用してこれらの電気信号を生成する方が簡単です。デバイスバス(例 [〜#〜] usb [〜#〜] )。

ブートストラップについてはどうですか?

もちろん、最近のオペレーティングシステムはマシンに「同梱」されています。そして、人々がすることは、コードを[マシンの命令セット言語にコンパイルされて]マシンがそれを見つけられる場所にインストールすることです。トリックは、bootstrap起動時にそのコードを見つけるマシンです。A [〜#〜] jvm [〜#〜] bootstrapの例を以下に示します:

public final class Hello {
    public static void main(String[] args_) {
        System.out.println("Hello, World!");
    }
}

0000: cafe babe 0000 002e 001a 0a00 0600 0c09  ................

どうですか…?

Tanenbaum を参照するか、別の質問をしてください。

13
Apoorv Khurasia

デバイスドライバー(Cインターフェイスを持つ)を使用してハードウェアと通信する可能性を許容する場合、ANSI CでOSを作成できなかった理由はありません。ANSIにない必要なもの(ネイキッドポインターなど) Cは、デバイスドライバーによって提供されます。

そのコメントの筆者は、主張をするのが難しいです。彼は、ANSI C言語のオペレーティングシステムで実行する必要がある可能性のあるすべてのことをキャプチャすることはできないと言っています。私が同意するかどうかはわかりません。 ANSI Cはチューリング完全言語であり、ビットいじりを含む多くの低レベルの構成要素があります。

いずれにせよ、あなたは彼を文脈から引用しました。スレッドのさらに下にある追加コメントの1つを見てください。

...あなたはそれを今よりも劇的な音にしています。少量のアセンブリ言語(インラインまたは個別のファイル)と優れたリンカーは、ほとんどのアーキテクチャで実際に必要なすべてです。カーネルが使用する他の非標準的なもの(出力セクションの操作、パッキング、整列、分岐予測のヒント、クレイジーポインターの計算、未定義のユニオンの動作など)はoptimization。

11
Robert Harvey

そうすることは間違っていますか?

特定の状況でCをそのように定義することは「正しくありません」。

私の意図は、特定のコメンターを狙うことではなく、「XはCで書かれた」と言えるときと、「XはCのような言語で書かれた」と本当に言う必要があるときの境界を探し出すことです。

好きなことを言える!単語の意味を示すIT用語法はありません。

その男は、「C」をANSI C規格で厳密に定義されている言語と同等にすることで、(やや頭がおかしい)ポイントを作っています。しかし、それは問題ありません。私たちは知っている彼は手段とは何か。

逆に言えば、残りの人は "C"を使用してC言語の実際の実装を意味することができます...必要に応じて。

5
Stephen C

Cの作成の背後にある理由はUnix(one史上最高のオペレーティングシステムの)を書くためだったので、そのコメントを書いた人は誰も彼が何を話しているのかわからないと思います。 Unixの作成以降、多くの点が変更されたため、オペレーティングシステムの記述に最適な言語です。オペレーティングシステムの記述に関しては、Cより優れた言語が数多くありますが、CでOSを記述することは不可能ではありません。 。

3
Farouk Jouti

高水準言語でのカーネルの作成には大きな問題が1つあります純粋に:存在する高水準言語では、OSが使用する必要があるすべてのCPU命令にアクセスできません。

X86アーキテクチャを例にとります。ページテーブルのツリーを指す単一の特殊目的レジスタを提供することにより、仮想メモリを実装します。ここで、プロセスの仮想アドレス空間を設定する必要のあるカーネルは、2つのことを行う必要があります。1。ページテーブルのツリーを構築すること、2。そのツリーのルートへのポインタを専用レジスタにロードすること。ただし、その特殊目的レジスターはCからアクセスできません。ステップ1はCで実行できますが、ステップ2は実行できません。 -Cコンパイラから取得できる一連の命令は、使用可能なCPU命令の真のサブセットであり、そのサブセットには、CPU自体の処理モードを操作するために必要なすべての特別な目的の命令がありません。

そのため、存在するすべてのカーネルには、ある程度のアセンブラコードを含める必要があります。もちろん、カーネルプログラマーは、アセンブラーコードの量をできるだけ少なくして、カーネルの大部分をCのような高水準言語で記述しようとします。このコードの大部分が、「LinuxはCで書かれている」と言われる理由です。 Linuxカーネルの99%がCコードだからです。しかし、Cだけではうまくいきません。