私はオペレーティングシステムが好きで、最終的には主にカーネルに取り組んでいるOS開発者になりたいと思っています。将来的には、Cは引き続き選択される言語であり、他に何を学ぼうとすべきでしょうか。
17 に答える
研究者の間では、カーネルが誤動作しないことを保証するために言語ベースのテクノロジーを使用することに多くの関心が寄せられています。多くの人々が、現在(当然のことながら)注目を集めているSingularityプロジェクトについて言及しています。なぜ特異点が面白いのですか?
この言語には、ロックを適切に使用するための有限状態モデルが含まれています。コンパイラーは、コードをモデルに対してモデルチェックして、デッドロックが発生しないことを確認できます。
サードパーティのドライバーには、システムへの限定されたインターフェイスが提供されます。コンパイラによって行われるチェックは、悪いドライバがシステムを取り出せないことを保証します---それができる最悪のことはそれ自身のデバイスをノックアウトすることです。
Singularityは、OS / MMUテクノロジではなく、コンパイラテクノロジを使用して、ある「プロセス」を別の「プロセス」から分離します。突然、新しい「プロセス」(実際には新しい種類の保護ドメイン)をフォークすることは、非常に安価であり、この安価さにより、新しい設計が可能になります。
特異点は、OSの問題を解決するために言語とコンパイラ技術を使用したプロジェクトの長いリストの中で最新のものです。私のお気に入りの1つは、ワシントン大学のSPINカーネルでした。これにより、アプリケーションはカーネルを安全に拡張でき、Modula-3で記述されました。
この研究分野はまだ広く開かれており、OSの問題を解決するための「スイートスポット」となる言語またはコンパイラの機能のセットはまだ実際にはわかっていません。だからあなたの質問に答えるために:
今日の生産システムでは、Cはまだ「それ」です。
将来のオペレーティングシステムの場合、Cはほぼ確実に「それ」ではありません。はるかに優れた処理が可能であることはわかっていますが、新しい「それ」の正確な性質は未解決の問題です。
オペレーティングシステムの低レベルの部分(カーネルなど)は、その速度のためにCで記述され続けると言っても過言ではありません。他の場所で述べたように、カーネルの特定の部分のアセンブラを知る必要があります(カーネルをメモリにロードする必要があります)。ただし、アセンブリの知識がほとんどまたはまったくなくても、カーネルで作業できます。良い例は、ファイルシステムを実装している場合です。
オペレーティングシステムが実装されている言語について心配する必要はありません。重要なのは、オペレーティングシステムの使用方法と、オペレーティングシステムを改善するために何ができるかです。良い例は、Unixが最初に登場したときです。ファイルシステムには、ディスクの前面にiノードがあり、残りのスペースにデータがあります。すべてのファイルについてディスクのさまざまな部分を探していたため、これはあまりうまく機能しませんでした。次に、ディスク対応のファイルシステムを作成するためにBerkeley FastFileSystemが作成されました。これは、対応するデータの近くにiノードがあることを意味します。詳細は省略しますが、どの言語でプログラムするかではなく、オペレーティングシステムをどのように改善できるかを考えることが重要であることを示していると思います。
オペレーティングシステムの最近の傾向には、仮想化と分散コンピューティングがあります(MapReduceに関するGoogleの論文を参照)。ファイルシステム、セキュリティ、スケジューリング(特にマルチコアプロセッサを使用)などは、これらの問題が新しいものではない場合でも、継続的に関心のある分野です。
カーネル開発について詳しく知りたい場合は、次のリソースを参照してください。
- Linuxカーネル初心者-Linuxカーネルの変更を始めたい人のためのリソース。
- xv6source -Unixバージョン6のx86ポート。オペレーティングシステムクラスを教えるためにMITによって使用されます。シンプルで拡張も簡単です(詳細)。
- Linuxカーネルマップ-Linuxのシステムコールのコールチェーン。システムコールの機能を視覚化するのに役立ちます。
結論:カーネルに慣れ始め、研究者が書いていることに関する論文を読んでください(USENIXはこれに役立ちます)。この知識は、新しい言語を学ぶよりもはるかに価値があります。オペレーティングシステムの記述に変化があった場合でも、ある言語のほとんどの概念を別の言語に簡単に移すことができるからです。お役に立てれば!
Cはほとんどそれであり、かなりの量のアセンブラーがあります。OSカーネル作業の重要なトピックは次のとおりです。
- キャッシングとキャッシュ管理の原則
- 仮想メモリ、TLB管理
- CPUとシステムアーキテクチャ
- ストレージ階層
- 並行プログラミング手法(相互排除、ロックなど)
- アルゴリズムとデータ構造
実際、C++コード用の最新のOSのコアにはかなりの余地があります。調べたところ、Win7コアカーネルツリーにはかなりのC++コードが含まれています。多くのサブシステムが単純なCのままであることに注意してください。これにはいくつかの理由があります。
- CはNTベースのOSの元の言語です
- Cはキーパーソンに非常によく理解されています
- 適切に記述されたCは、特にカーネルモードでは、デバッグするのに最も簡単なコードです。
そうは言っても、多くのチームや人々は、よく書かれたC++がコアOSの作業に効果的なツールであることに気づいています。
C ++には、スケジューラ、メモリマネージャ、I / Oサブシステム、グラフィックスサブシステムなどのコアリソース管理コードの記述に使用されることを妨げるものは何もありません。
他の人が指摘しているように、カーネルの作業には常にある程度のアセンブリ言語が必要です。
深刻な(実験的ではない)OS開発が当面の間C(およびアセンブリ)にとどまるというのはかなり安全な賭けだと思います。
私が提出する証拠はエイダです。Cと同じくらいベアメタルを取得でき、データ配置をより適切に制御し、ほぼすべてに対してより安全なデフォルトの動作を提供します(例:配列境界チェック)。OS開発者の観点からは、考えられるあらゆる技術的パラメーターにおいて、Cと同等かそれより優れています。それは20年以上前から利用可能です(わかりました...おそらくわずか15でリーズナブルな価格です)。
したがって、Cよりも技術的に優れた言語を探している場合は、代わりにAdaで書かれた場所全体にOSが表示されるはずです。私が実際に目にしているのは、Adaに実装されている深刻なOSの1つです。Cでの再実装を優先して、サポートされなくなりました。
OS開発における他の言語への障壁は、技術的なものではなく、かつてないものです。Cの非技術的なメリットがすぐになくなることはないと思います。また、より優れた言語を設計するだけで、Cのメリットを克服できる人は誰もいません。
Microsoftは、.NETで一部のWindowsを書き直しているところですが、カーネルの多くが変更されるとは思えません。
しかし、私たちに希望を与えるCosmos(http://www.gocosmos.org/index.en.aspx )のようなプロジェクトがあります。
いいえ、それは「それ」ではありません。カーネルは通常、少しのアセンブラーが散りばめられたCで書かれています。しかし、OSはあらゆる種類の言語で書かれています。しかし、そこでも、C++はそれほど問題なく使用できます。他の多くの言語もそうです。Linuxは、他のすべてを恐れて嫌うC狂信者によって書かれています。これが彼らの問題です。WindowsはCとC++の大きな組み合わせで書かれており、おそらく古いPascalコードもいくつか含まれています。そして最近では、.NETのチャンクも増えています。OS Xは、OSコードの多くにObjective-Cを使用しています。
プログラミングの他のすべての領域と同じアドバイスが適用されます。
- あなたのものを知っている
- 自分を1つの真の言語に限定しないでください。
カーネルは、やや「特別な」ルールが適用される唯一の領域です。しかし、カーネルは小さいです。OSの大部分は、どの言語でも作成できます。
確かにCを知る必要がありますが、Cを知るだけでは十分ではありません。
MicrosoftのSingularityプロジェクト(ウィキペディアにもあります)をご覧になることをお勧めします。
Singularityは、2003年からMicrosoft Researchによって構築されている実験的なオペレーティングシステムです。カーネル、デバイスドライバー、およびアプリケーションがすべて管理対象コードで記述されている、信頼性の高いOSとして意図されています。
このOSのごく一部のみが実際にCで記述されており、残りは高級言語(Sing#、C#の拡張)で記述されています。将来的には、この種のものがもっと利用できるようになることを期待できると思います。
確実に!また、少なくとも1つのアセンブリ言語/ハードウェアアーキテクチャを学ぶ必要があります。
あなたが話しているのがカーネルであるなら、あなたは基礎となるハードウェアへのより速いアクセスを可能にする言語を学ぶ必要があります。しか考えられない
- C言語と
- 組み立て
AFAIK、ブートローダーの一部はアセンブリで記述され、それ以降はCになります。たとえば、最新のTOPPERSなど、多くのオープンソースのわかりやすいオペレーティングシステムが利用可能です。それを調べてみてください。
OSカーネルの開発者は、言語の選択よりも、基盤となるハードウェア(プロセッサやメモリなど)に効率的にアクセスする方法についてもっと心配するでしょう。ほとんどの場合、アセンブリを使用したくなるでしょう。
あなたは間違いなくCに堪能でなければなりません。
他の人が指摘しているように、オペレーティングシステムをCで記述しなければならない理由はなく、より洗練された言語を使用することで得られるものはたくさんあります。しかし、現実の世界で(つまり、学界や研究所ではなく)オペレーティングシステムで作業する場合は、次のような現実があります。
- 既存のオペレーティングシステムは巨大で、多くの場合数百万行のコードであり、Objective-CやC++などのCまたはC派生物で記述されています。
- 新しいオペレーティングシステムは、既存のオペレーティングシステムの機能と堅牢性に到達し、それに匹敵するまでに数百エンジニア年(および多くの暦年)を要します。
その結果、世界がCベースのオペレーティングシステムカーネルからいつどのように移行するかを理解するのは困難です。はい、技術的には可能です。しかし、コストが高すぎる可能性があります。どちらかといえば、少数のOSファミリ(Windows、Linux、およびBSD)での統合に向かう傾向があるようです。すべてCベースです。
どのような研究が行われたか、または既存のコードベース(Linuxなど)をより良い言語に進化させるためにどのようなツールや手法が利用できるかを知ることは興味深いでしょう。これは、世界に完全に新しいOSを採用させるよりもはるかに実行可能なアプローチだと思います。
私はWindowsNTとLinuxカーネルの両方で広範なプログラミングを行いました。そして、これら2つのOSがCの周りにある限り、カーネルで使用されることを保証できます。それにはたくさんの理由があると思いますが、最も簡単な答えは時間です。以前のポスターが述べたように、カーネルを別の言語で書き直すのにかかる時間は価値がありません。そして、それは単にコードを移植するだけではありません。カーネルには、いくつかの重大な設計変更が必要になります。個人的には、Cがカーネルに最も適した言語だと思います。カーネルで作業しているときは、開いているメモリを管理し、自分のメモリを動的に割り当てて解放できることが重要です。特に、ページメモリを使用している場合。カーネルモードで割り当てられるスタックサイズも一般にユーザーモードよりも小さいため、メモリ効率が非常に重要です。Cを使用すると、プログラマーは、管理対象言語が持つ肥大化したオーバーヘッドをすべて含まない美しいデータ構造を構築することもできます。私の意見では、構造体はオブジェクトと同じように効果的に使用することもできますが、これもすべての肥大化したオーバーヘッドはありません。管理対象言語も「管理」する必要があります。カーネルでは、混乱をクリーンアップするものは何もありません。誤解しないでください。私はC#が大好きで、.NET Frameworkは美しいと思いますが、カーネルを使用している場合は、Cはこれからもそうです。カーネルでは、混乱をクリーンアップするものは何もありません。誤解しないでください。私はC#が大好きで、.NET Frameworkは美しいと思いますが、カーネルを使用している場合は、Cはこれからもそうです。カーネルでは、混乱をクリーンアップするものは何もありません。誤解しないでください。私はC#が大好きで、.NET Frameworkは美しいと思いますが、カーネルを使用している場合は、Cはこれからもそうです。
Windowsでのカーネルモード開発ではC++がサポートされていますが、例外とRTTIを簡単に使用することはできません。C ++のオーバーヘッドはごくわずかであるため、今日Cでコードを記述する理由はないと思います(トレース/デバッグインフラストラクチャは、仮想関数呼び出しの追加の逆参照よりもはるかにコストがかかります)。実際、ほとんどのWindows DDKは、Cを使用してオブジェクト指向パターンを実装しています。これは、C++と比較して非常に不便です。
カーネルモードの開発にC++を使用する場合は、新しい演算子をオーバーライドして、ページング可能メモリとページング不可メモリのどちらにクラスを割り当てるかを選択する必要があります。いくつかの素晴らしいマクロがそこで役立つかもしれません。
まあ、osdevコミュニティでは、Cは一般的に高級言語と呼ばれています。そして、より「低レベル」の言語はアセンブリです(カーネルの開始時にASMを使用する必要があるため、ASMを使用する必要がありますが、Cを使用する必要はありません)。
Pascal言語の作者であるNiklausWirthから、Oberonプログラミング言語とOberonオペレーティングシステムを指摘します。NiklausWirthプロジェクトにはファンサイトもあります。
АндрейНиколаевичТереховを正しく理解している場合、Adaには、メモリアクセスチェックをCPUハードウェアからコンパイラレベルに移動できるという利点があります。これにより、CPUの論理ゲートの量が減り、エネルギー消費ポイントからメリットが得られます。見る。CPUに必要な論理ゲートが少なければ少ないほど、同じ量の論理ゲートからより多くのコアを作成できます。その観点から、コンパイラがハードウェアの一部を置き換える言語に合わせて特別に調整されたCPUには、ワットあたりの操作数の点で基本的な利点があります。
あまりにも頻繁に、あなたはいくつかの話を聞くことができます:C言語はスピードとエイダの同義語であり、そうではありません。それは真実ではない。Adaは、実行を遅くするいくつかのチェックを追加します。それは本当ですが、デバッグの目的または安全のためです。したがって、コンパイル時に構成によって削除できます。したがって、オーバーヘッドなしでADaプログラムを生成できます。一方、gnuコンパイラはAdaとCを同じ中間コードで変換することに注意してください。その結果、最後に同じ実行可能コードを取得します。ここで、Adaはドライバーの開発には使用できないことを読みました。それは誤りです。AdaはC言語と同じ機能を持っています。さらに、多くのエラーを回避します。完全にAdaで記述されたリアルタイムオペレーティングシステムMarteOSが存在することがわかります。
AdaがOSカーネルのプログラミングに使用されない主な理由は、C言語がUnixで使用される言語であるということです。これは、システムコールAPIがCプロトタイプで表現されるPOSIX標準です。すべてのOSスニペットはすでにCで記述されています。また、C言語は、世界で開発されたソフトウェアの17%を占めています。
最後に、エイダは厳格で、多くの人がこれを嫌います。彼らは、脆弱性のあるソフトウェアを開発し、デバッグにより多くの時間を費やすことを好みます。