# OS開発 ## OS起動までの流れ ・パソコンの電源を入れる ・POST(自己診断テスト)を実行 ・BIOSが起動する ・MBRを読み込む ・MBRに記録されているOSのある領域を読み込む ・OSの起動プログラム(OSローダ)を読み込む ・OSが起動する ### POST(自己診断テスト)を実行 Power On Self Test。 メインメモリやディスクコントローラ、キーボードコントローラなどの各機器に異常がないか調べる。 パソコンのPOSTプログラムはBIOSの一部としてROMの中に収められている。 異常があればビープ音が鳴る。 ### BIOSが起動する BIOSはROMに収められている。 BIOSは電源を入れたりリセットした時に最初に実行され、キーボード、マウス、プリンターといったコンピュータの基本的なハードウェアを制御する。 ### MBRを読み込む Master Boot Record。 MBRにはハードディスクのパーティションに関する情報などが記録されている。 MBRが読み込まれた後にハードディスクのパーティションの情報が読み込まれ、その情報にしたがって、起動するOSがインストールされている領域を読み込む。 ## OS開発基礎知識編 ### メモリマップ メインメモリのどの部分がどの用途で使われているかを記載している地図。メモリの空き容量を把握したり、CPUなどの重要な機能の設定情報を上書きして誤作動を起こさないためにはメモリマップの把握が重要。 | PhygicalStart | Type | NumberOfPages | |:-------------:|:--------------------:|:-------------:| | 0x00000000 | EfiBootServiceCode | 0x1 | | 0x00001000 | fiConvensionalMemory | 0x9F | | 0x00800000 | EfiACPIMemoryNVS | 0x8 | | ⋮ | ⋮ | ⋮ | メモリマップの例 ### 汎用レジスタ 値を記憶することを目的としたレジスタ。メインメモリと役割が似ているが、メインメモリと比べて容量が小さく読み書きが速い。CPU内に内蔵されている。 ### 特殊レジスタ CPUの設定を行う、タイマーなど、CPUに内蔵された機能を制御するためのレジスタ。汎用レジスタの機能に加え、「命令の結果によって変化する」値を保持している。 | 名称 | 説明 | |:------:|:-------------------------------------------------------:| | RIP | CPUが次に実行する命令のメモリアドレスを保持するレジスタ | | RFLAGS | 命令の実行結果によって変化するフラグを集めたレジスタ | | CR0 | CPUの重要な設定を集めたレジスタ | 特殊レジスタの例 ### カーネル システムのリソースや、ハードウェアとソフトウェアの連携を管理する。 メモリ、CPU、入出力を中心としたハードウェアを抽象化し、ハードウェアとソフトウェアがやり取りできるようにする。また、ユーザープログラムのための機能として、プロセスの抽象化、プロセス間通信、システムコールなどを提供する。 ### ブートローダ コンピュータの起動直後に自動的に実行されるコンピュータプログラム。 ストレージ(外部記憶装置)からOSを読み出して起動するもの。 ### フレームバッファ コンピュータ内部で一画面分の表示内容を丸ごと記憶しておくことができるメモリ領域やメモリ装置のこと。 画面に何かを描画する際にはまずソフトウェアがフレームバッファの内容を書き換え、その内容を一定のタイミングでディスプレイなどの表示装置に転送することで画面上に更新が反映される。これにより、描画処理の過程やその途中の状態が利用者の目に触れることを防ぐことができる。 ### PCI Peripheral Component Interconnect。コンピュータのプロセッサと周辺機器との間の通信を行うためのバスアーキテクチャの一つ。 ### PCIコンフィギュレーション空間 PCIデバイスのベンダコードやクラスコードなど、PCIデバイスに関する基礎的な情報が書かれている。接続している機器の情報はこの空間に展開されている。 ### xHCI Extensible Host Controller Interface。 USB接続の周辺機器とコンピュータ本体の通信を制御するUSBコントローラの種類の一つで、USB 3.x規格に対応したもの。 ### 割り込みベクタ 割り込みの要因を示す番号のこと。 割り込みには、ハードウェア割り込み、ソフトウェア割り込みがあるが、割り込みベクタによって、どのような割り込みが発生したかが分かるようになっている。 割り込みの発生要因によって、実行される処理(割り込みハンドラーと呼ばれたりサービスルーチンと言われる)はシステムによって決められている。 割り込みが発生した場合に処理するプログラムの先頭アドレスが格納されている対応表を、割り込みベクタテーブルと言い、テーブルの内容によって割り込みに対応した処理が実行される。 なお、割り込みベクタテーブルのことを割り込みベクタと呼ぶこともある。 ### MSI割り込み Message Signaled Interrupts。 信号線を使わずメモリバスへの書き込み動作により割り込みを発生させる。特定のメモリアドレスへの書き込みにより、割り込みをCPUへ通知することができる。これにより割り込み信号機線がPCI機器間で共有されることはなく、また、同一のPCI機器から複数種類の割り込みをCPUへ通知できるようになった。 ### スタック領域 メモリ上の、ローカル変数やメソッドの情報を格納する領域のこと。 ### セグメント メモリ空間を複数に分割した区分。 分割することにより、このセグメントは読み取り専用かの情報や、このセグメントには権限が必要だなどの管理ができるようになる。 ### GDT GDT(グローバルディスクリプタテーブル)とはセグメントを管理するためのテーブルのこと。 ### ページング メモリアドレス空間をページ単位で管理する。 ### アイデンティティマッピング プログラム上でのアドレス表記と実際にアクセスされるアドレスが等しくなる設定。 ### スマートポインタ 通常のポインタの機能に加え、「指し示す先の変数が不要になったときに自動的に削除する」ことができる。参照カウントという技術が使われっている。 ### バックバッファ フレームバッファと同じ大きさを持つバッファ。 バックバッファに描画を行なった後でバックバッファをフレームバッファに転送することにより、画面描画の際のチラつきをなくす。 ### Local APICタイマー 対応する CPU の任意のベクター番号に割り込みをかけることができるが、他の CPU からアクセスできず、また、他の CPU に割り込みをかけることができない。 現代の CPU では Local APICタイマーがCPU に内蔵されているため、CPU が省電力モードに入ると停止するモデルがある。 ### ACPI Adovanced Configulation and Power Interface。 コンピュータの構成や電源を管理するための規格。 ### ACPI Power Management タイマー ACPIの電源管理のためのタイマー。 ### パーティション コンピュータのストレージ(外部記憶装置)の内部を複数の独立した区画に分割すること。 ### PBR Partition Boot Record。 パーティションの大きさやFATのデータ構造が何ぶろっくめからはじまるかなどの情報が書かれている。 ### ディレクトリエントリ ファイル名などの情報は「ディレクトリ」と呼ばれる型の専用ファイルに保管される。 ディレクトリに含まれる各種ファイルの情報をディレクトリエントリという。ディレクトリエントリにはファイル名以外に以下の情報を含む。 ・ディスク上のファイルの存在位置(ポインター) ・作成日時、更新日時等 ・ファイルの属性 ・ファイルの大きさ ディレクトリエントリには通常のファイルのほか、他のディレクトリを参照するエントリを含めることが出来る。 このようにしてディレクトリとファイルによる階層を作り、この階層構造をファイルシステムと呼ぶ。 ### ファイルシステム OSの機能の一つで、永続的にデータを保存できる記憶装置(ストレージ/外部記憶装置)内部の記録状態を管理・制御し、人間に分かりやすいファイル単位でデータの書き込みや読み出しができるようにするシステム。ストレージ以外のシステム上の資源もファイル単位で取り扱えるようにするものもある。 ### FAT File allocation table。 ファイルシステムの1つ。FAT系のファイルシステムは仕様が公開されており、管理領域の容量が小さくシンプルなプログラムで高速に読み書きできるなどの特徴がある。 ### TSS Task state segment。 x86ベースのCPUでタスクの情報を保存するための構造体。 TSSには以下のような情報が保存される。 ・レジスタ情報 ・I/Oポート許可ビットマップ(80386以降) ・Tビット(80386以降) ・割り込みリダイレクトビットマップ(Pentium以降) ・特権レベル0, 1, 2のスタックポインタ ・TSSのバックリンクセレクタ ・LDTセレクタ ### システムコール アプリケーションから安全にOSの機能を呼び出す仕組み ### EOF End of File。 ファイルの終端を表す。標準入力には終端がないため、grepなどのファイル内検索を行うと処理が無限ループを起こす。EOFを発見した際に処理を終了するように設計すれば、コマンド実行時に処理が無限ループを起こさず正しく動作する。 ### EOT End of Transmission。 標準入力やネットワーク通信のようなデータ転送における終端を表す。CTR+Dなどでコマンドを強制終了できるのはEOTのおかげ。 ### デマンドページング OSがストレージ上の領域を利用して仮想メモリを管理しているとき、あるページへのアクセス要求が行われた際に当該ページをストレージから物理メモリ上へ読み込む方式。 例外が発生した際にアプリを強制終了されないように物理メモリを割り当て、アプリの実行を継続する。 ### ページフォールト プログラム(プロセス)がアクセスしようとした仮想メモリ領域(ページ)が物理メモリ上に無く、ストレージに退避していることが分かったときに発生する例外。 ### メモリマップトファイル ファイルをメモリアドレスにマップすることで、普通のメモリであるかのようにファイルを読み書きする仕組み。ランダムアクセスがしやすい。 ### メモリマップトIO ハードウェアのレジスタをメモリにマップし、普通のメモリであるかのようにレジスタを読み書きする。 様々なものをメモリに見せかけることで、特殊な機械語を使うことなく簡単な命令で読み書きできる。 ### フラグメント ファイルの書き込みや消去を繰り返すと、ディスクに記録されたファイル(または空きブロック)が細かく分断されてくる。フラグメントが大きくなってくるとファイルアクセスの速度が低下する。このためディスクを効率よく使用するには、分断されたディスクの空きブロック、使用済みブロックを整理しフラグメントを低減させる必要がある。 ### 共有メモリ ページングの仕組みを使ったアプリ間通信の方法。同じ物理フレームを複数のアプリの仮想アドレスにマップする。