はじめに
On 10月 2, 2021 by adminまず最初に、オペレーティング システムの開発は、おそらくコンピュータでできる最も難しいことのひとつです (Doom の最終ボスをナイトメアの難易度で倒すことに次いで)。 オペレーティング システムを構成するには、コンピュータ サイエンスの中のいくつかの複雑な領域に関する多くの知識が必要です。 ハードウェアの仕組みを理解し、複雑なアセンブリ言語と、より高度な言語(C、C++、Pascalなど)を読み書きできるようにする必要があるのです。 また、抽象的な理論を理解し、無数の思考を抱くことができる頭脳も必要です。 まだ落胆していますか? 心配しないでください。 何時間もかかってやっと問題が解けたときの達成感は、何物にも代えがたいものがあります。 そして、しばらくして、自分がゼロから作ったものを振り返ることができる。 手書きのシステムが起動し、ハードウェアに対して魔法をかけ、ユーザーにユーザーインターフェイスと遊ぶためのプログラムを提供するのです。 いったん最初のシステムを立ち上げて動かせば (これは適切なチュートリアルを見つけることで)、次に進むべき道を選ぶことができるのです。 あなたのOSはまさにあなたのものです。 あなたには究極のコントロールがあり、限界はありません!
Contents
- 1 厳しい現実
- 2 責任
- 3 必須知識
- 4 自分の計画をまとめる
- 5 開発環境の選択
- 5.1 GNU/Linux
- 5.2 Windows
- 5.3 Windows
- 6.4 Windows
5.3 MacOS
- 10.1 記事
- 10.1 記事
10.2 スレッド
The Hard Truth
オペレーティングシステム開発は複雑で進行中のプロセスであるという基本事実が、あなたをがっかりさせないことを願っています。 実際、オペレーティング システムの開発は、最大限の忍耐と慎重なコード設計を必要とし、ゲームやWeb ベースのスクリプトのような開発から得られる「即効性」はほとんどないため、本当に比類のないものです。 時折、混乱や落胆、そして私たちの中には……一時的な狂気に襲われることも覚悟しておいてください。 やがて、そして十分な献身をもってすれば、あなたはオペレーティングシステムに貢献した数少ないエリートの一人になれるでしょう。 もし、途中でくじけそうになったら、この本の内容を読んでリフレッシュしてください。 うまくいけば、なぜ最初にこのような非常識な旅を始めたのかを思い出させてくれるでしょう。
この段階では、初心者の失敗のページも読んでおくとよいでしょう。 フォーラムのユーザーは、これらの間違いの多くが時間の経過とともに繰り返されることに気づいており、これらを避けることは、自分自身を馬鹿にしないための素晴らしい方法です。 このような考え方は、オペレーティング システムの設計では危険です。 単純なアプリケーションを作るときには、ずさんなコードを書いてもいいかもしれませんが、1秒間に何千回も呼び出されるかもしれない重要なコードとなると、できる限りのオーバーヘッドを取り除く必要があるのです。 オペレーティング システムは、実行中のアプリケーションに基本的なリソースとしてコンピューターを供給すべきであり、できるだけ複雑化、抽象化、およびオーバーヘッドを少なくする必要があります。 もちろん、それは良いことですが、お粗末なプログラムを繁栄させることを犠牲にしてまで、それを行うべきではありません。 プログラムエラーが発生した場合、「水面下」でいろいろなことが起こっているのです。 下手なプログラムは貴重な実行時間を犠牲にし、メモリと周波数の両方で高価なタスクスイッチを伴います。 558>
必要な知識
主な記事:「貧弱に書かれたソフトウェアを阻止することをお勧めします。
計画を整理する
先に進む前に、オペレーティングシステムを書くことで何を得たいかを考えてみてください。 このプロジェクトを引き受ける動機は何でしょうか。 趣味の OS プロジェクトを引き受ける理由はたくさんあり、ほとんどの OS ディベロッパは一つ以上持っています。 ただやりたい」というだけでも十分ですが、自分の目標と動機を考え、明確にすればするほど、本当にやりたいことに集中できるようになります。 プロジェクトに大きな野心を持つことは、たとえそれが第一の目的でなくても(あるいは特に)恥じることではありません。 主な目的だと思うものだけでなく、すべての目標を認めるようにしましょう。
OS デザインのどの側面に最も興味があるか、取り組む必要があると思うか、決めてみてください。 OS 開発、特に初期に行われることのほとんどはカーネル設計と開発ですが、カーネル自体はほとんどの OS のほんの一部です。もしあなたの主な興味が UX やネットワーキング、ドライバプログラミングであれば、(現在または将来的に)本当に自分自身の OS を書く必要があるか、あるいは既存のカーネル上でそれらの開発を行うことに満足できるかについて考える必要があるでしょう。 本当にデスクトップ環境を設計したかったのに OS 開発に取り掛かった人は少なからずいますので、これは自分自身に問うべき非常に重要な質問です。
OS 以外のプロジェクトで、特に OS プロジェクトの練習や準備として、最初に、あるいは同時に取り組みたいものはないか考えてみてください。 通常、今すぐ OS プロジェクトで作業する必要はありませんし、前もって準備しておけばおくほど、より良い結果が得られます (少なくとも、ある点までは。準備は一つのことで、先延ばしは別のことです)。
同様に、既存のデザインをフォークして実験したり、ある特定の目的のために変更する作業をするつもりなら、一般的な開発問題よりもそれに焦点を当てましょう。 既存のコードベースのどの部分が必要で、どの部分を変更したいかを検討してください。
いくつかの具体的なプロジェクト目標を設定し、それが役に立つなら、別々のプロジェクトを計画する用意をしておいてください。 もしあなたが単にあちこちを歩き回って、どこに行くのか見るつもりなら、それは良いことです。もしあなたの意図が Microsoft を打倒することであるなら、それも (おそらく非現実的ですが) 良いことです。 何をしたいのかがわかれば、その詳細を具体的な目標に落とし込み、それを達成するために何が必要なのかを考えることができます。 もし相反する目標で試したいことがあれば、それらを別のプロジェクトに分割してください。
計画中の OS デザインの概要を、注目すべき特定の要件や詳細、あるいは助けを必要とすることを明確にするために書き出し、可能なら公開リポジトリに追加するとよいかもしれません。 これは他の人があなたを助けやすくするだけでなく、物語や論文のアウトラインを書くのと同じように、あなたの計画を整理し安定させる助けになります。 目標や計画が変わるたびにそれを維持する用意がありますが、古いバージョンのコピー (または、バージョン管理下の文書) を保管しておくと、時間の経過とともに自分の仕事がどのように発展するかを確認できます。 プロジェクトに割ける時間が限られていることがわかっている場合、それを考慮に入れ、たとえ達成できると確信していても、外の締め切りにコミットしないようにします。 OSの開発には時間がかかります。多くの時間が必要で、一学期にOSのプロジェクトをすべて終わらせようとするのは現実的ではありません。 一般的なコンピュータの流れから、最も人気があるのはGNU/Linuxだが、Windowsも多く使われている。 GNU/Linux システムを使用する開発者は、ツールの利用可能性において若干有利ですが、これは Windows でも Cygwin や MinGW のようなシステムを使用することで解決可能です。 オブジェクトファイルを操作するための基本的なツール。
これらのツールのすべてを使うことはないかもしれませんが、「念のため」手元に置いておき、基本的なレベルでも使い方を知っておくとよいでしょう。 しかし、他の言語を使用することを決めた場合、ツールの使用はほとんどあなた次第であり、上記のリストだけでは何の役にも立たないかもしれません。 以下は、主に C/C++ やアセンブリの開発者に関連する情報です。
GNU/Linux
OS 開発で最も推奨されるシステムは GNU/Linux です。 GNU/Linuxを使う場合、ほとんどのGNU開発ツールはすでに存在していると思われる。 そうでない場合は、ディストリビューションのパッケージ管理ツール (APT, RPM, Portage, Pacman, Apk など) を使って、必要に応じてインストールしてください。 ここでも、開発システムのランタイムファイルをリンクしないように、クロスコンパイラーを作ることが必要です。
一般的なエディターは、Vim、Emacs、KDevelop、Komodo Edit などです。 IDE の代わりに gedit、Geany、SciTE のような軽量なエディタを好む人もいます。 多くの人は、テキスト UI と内蔵エディタ (mcedit) を持ち、非常に軽量で高速な Midnight Commander を好みます。
どのディストリビューションを使うべきかということについては、Linux ディストリビューションのリストを参照してください。 ディストリビューションにはさまざまな種類があり、すべてがカーネル開発に向いているわけではありません。 セキュリティ(Kali, Qubes, BackTrack, Parrotなど)、科学アプリケーション(Scientificなど)、ファイアウォールやルーティング(DD-WRTなど)、システム復旧や組み込み環境(Knoppix、Rescatux、TinyCoreなど)、特に初心者をターゲットにしたディストロは使わないようにしましょう(Linux MintやNitruxなど。初心者向けのLinuxはありですが、汎用ディストロとして選ぶのがいいでしょう)。 また、パッケージが最新であること、ローリングリリースを採用しているものが良いでしょう。 Debianは使いやすいですが、しばしば古いバージョンやパッチが適用されたバージョンを出荷しています(ツールは説明されたようには動作しないかもしれません)。 多くの初心者は Ubuntu が好きで、それはいいのですが、いくつかのツールチェーンとコンパイル環境に問題があると報告されています (インストールされているものを使うのではなく、自分でクロスコンパイルをすれば、これは問題ではありません)
カーネル開発に最適なディストロは次のとおりです (ただし、これも個人の好みの問題ですので、これらのディストロは必須ではなくむしろ推奨であり、通常ある程度の経験が必要であることを覚えておいてください)。 Arch, Gentoo, Solus, Slackware, void など。Puppy も。
もしわからないなら、Ubuntu や Manjaro を試してみてください。 MinGW や DJGPP もありますが、MSYS2 が最も完全で互換性のある環境であり、ライブラリやツールをインストールするためのパッケージマネージャも含まれているので、強くお勧めします。
Microsoft は最近(執筆時点)、Windows 10 のオプション機能として Windows Subsystem for Linux をリリースしました。 これは基本的に、VM を使用せずに Windows 上で動作する本物の Ubuntu コマンドライン ディストリビューションです。 この環境では、最新のGCCとBinutils(執筆時点では6.1.0と2.27)がコンパイルされ、正常に動作する。 Bashシェルを使って、/mnt/<drive letter>経由でWindowsのハードディスクにアクセスすることができます。 この方法の利点は、必要なWindowsやLinuxのツールがCygwinで動くかどうかを調べる必要がなく、作業ができることです。 必要なツールの多くは “apt-get” を使ってインストールできます。
上記のすべてについて、デフォルトのコンパイラーは異なる実行形式をターゲットにしているだけでなく、一般にクロスコンパイラーを構築することが強く推奨されます。 詳細と手順については、GCC クロスコンパイラーのページを確認してください。
また、エディターも必要です。 メモ帳を使ってもうまくいきますが、より完全なエディターがあればより簡単です。 例えば、Notepad++ や Notepad2 は多くの人が使っています。 Unix エディターに慣れているのであれば、Cygwin が提供する選択肢 (たとえば、Vim や Emacs など、慣れが必要だが非常に強力なもの) から選ぶことができます。
Visual Studio や、自由にダウンロードできる Visual C++ Express Edition を使用して、オペレーティング システムを作成およびコンパイルすることも可能です。 特別な設定ファイルが必要であり、少数派であることは間違いありませんが、非常にうまく機能します。 また、Windows SDKをインストールすることで、64bitの開発も可能です。 558>
Watcom や Borland のような他のツールも使用できますが、それぞれ独自の要件があり、この種の作業にはあまり使用されません。 通常のツールはすべて利用可能です (vi, bash, dd, cat, sed, tar, cpio, etc.) ほとんどすべてのチュートリアルが箱から出してすぐに動きます。 ループバックデバイス、fdisk、mkfs.vfat、mtoolsがありません。 しかし、これらの目的のために diskutil を使うこともできますし、brew や macports を使って不足しているツールをインストールすることもできます。 新しい MacOS バージョン (10.13 以上) では、ターミナルから “xcode-select –install” を実行して、コマンドラインの XCode (IDE ではなく、ツールチェインのみ) をインストールすることができます。 これで、gcc、binutils、makeがインストールされます。 この gcc は実際にはマスカレードされた CLang ですが、あなた自身のクロスコンパイラを問題なくビルドできるほど機能が充実しています。 ブートストラップ用の gcc は、brew や macports からインストールするよりも公式のコンパイラを使う方が好ましいです。 テスト
The above article goes into a lot of depth about choosing how to test your operating system and how to integrate that with your development process.The above article has been a lot of depth about choosing how to test your operating system and how to integrate that with your development process.
コードの保護
コードを構築する際には、何百、何千行ものコードを書くことになります。 言及できないほどの時間を費やし、本当に寝るべき時に夜遅くまでコーディングしていることでしょう。 最後に必要なのは、ディスクのクラッシュや、不完全に書かれた ‘rm’ や ‘format’ コマンドがあなたの仕事をすべて投げ出すことです。 CVS は何年も使われてきましたが、最近では Subversion、Bazaar、Mercurial、そして Git との競争にさらされています。 もし可能なら、バージョン管理サーバとして遠隔地のコンピュータかサーバをセットアップすべきですが、もしそのようなマシンが利用できないなら、バージョン管理システムをあなたのローカル開発コンピュータでホストすることも可能です。
この点を強く強調することはできませんが、まだソース管理を使用していないのであれば、すぐに開始すべきです。 自分のコードを安全にバージョン管理し、簡単に取得できるようにすることの重要性を理解するには、自分のコードで深刻な間違いを一度犯すだけでよいのです。 小規模で個人的な趣味のプロジェクトには過剰に思えるかもしれませんが、一度リビジョン管理を使う習慣を身につければ、どうしてこれなしでやってきたのかと思うことでしょう。 Bitbucket も、Git と Mercurial の両方をサポートしているので、良い代替手段です。
ネットワークからアクセス可能なリポジトリでバージョン管理を使用することのもうひとつの利点は、他の人とのコラボレーションや他の人からの助けを得ることが非常に容易になることです。 これは、特にフォーラムにおいて、常に更新されたバージョンのコードをメッセージスレッドに投稿する必要性を回避できるため、非常に便利です。 プロジェクトが成長するにつれて、プロジェクトの他の開発者と協力し始める場合にも重要です (ただ、一夜にしてそうなるとは思わないでください)。
Common starting points
“hello world” カーネルを始める最も簡単な方法は、Bare Bones チュートリアルです。
さらなる知識を得る
今日、インターネット上には、オペレーティングシステム開発に関する驚くほど多くの知識が存在します。 それはただ見つけるだけの問題なのです。 まず第一に、この wiki 自体があります。 とりわけ、私たちはたくさんのチュートリアルを用意しています。 あなたはここにいるのですから、おそらくすでに見つけていることでしょう。 また、このサイトにはフォーラムがあり、多くの開発者がたむろしており、あなたを助けてくれるでしょう(ただし、最初に質問のしかたを読んでおいてください)。 オペレーティングシステムの開発に関する本もかなり多く書かれています。 これらの多くは Books ページで紹介されていますし、 osdever.net にもあります。
See Also
Articles
です。
コメントを残す