前置き
前回、前々回私はRISC風CPUを作りました。
しかし!!
それだけでは満足できなかったので次はOSを作りたいと思います。
OS動作できるようにするにはBIOSや割り込みなどのシステムも必要になってきます。
なのでOS編は3部構成にしてお届けしたいと思っています。
ちなみにCPUは改造して使います
前編: OS/BIOS/周辺機器について
中編: 仕様/エミュレーターの作成
後編: BIOS/OS制作
では早速いきましょう!!
1.OSとは
OSとは"Operating System"の略で、ハードウェアとアプリケーションの間を取り持つ基本となるプログラム(ソフトウェア)のことです。
有名なものとしてはWindows、macOS、Android、linux、iOSなどがあるよ
CPUを脳とした時、OSは神経として命令や情報を仲介し、アプリケーションは筋肉のように実際の動作を行う役割を持つよ
2.OSの仕組み
OSの働き
OSは主に
- ハードウェアの管理
- プログラム管理
- ファイルシステムの管理
- 入出力の管理
を行っていて具体的には、以下のような働きをしています。
ハードウェアの管理
CPUやメモリ、画面などの機器を直接制御し、アプリケーションが安全に利用できるようにする。
プログラム管理
アプリケーションの起動や終了を管理し、複数のプログラムを同時に動かせるようにCPUの使用時間を分配する。
ファイルシステムの管理
データをファイルやフォルダとして整理し、保存・読み込みを正しく行えるようにする。
入出力の管理
キーボード入力や画面表示、ディスクやネットワークとの通信などを仲介し、アプリケーションが機器の違いを意識せずに使えるようにする。
カーネルって?
OSにはカーネルというコンピュータのすべてを直接制御できる(OSの)中心となる仕組みが存在します。
カーネルはOSの中でも最も重要な部分で、以下のような処理を担当します。
- CPUやメモリの直接制御
- プロセスの管理
- ファイルシステムやデバイスの管理
- 割り込みや例外処理
- 特権モードでの命令実行(⇦重要)
特権モードとは
CPUには、プログラムを実行できるレベルが存在します。
その中で、最も強い権限を持つのが特権モードです。
特権モードでは、
- すべてのCPU命令を実行できる
- メモリやハードウェアに直接アクセスできる
といったことが可能になる。
代表的なものとしては"リングプロテクション"などがあります。
個人的にわかりやすかったリングプロテクションの記事をのっけときます。
なぜカーネルがあるの?
もしすべてのプログラムが特権モードで動作すると、
アプリケーションのバグやウイルスによってシステム全体が停止したり破壊されたりする危険があるので、
カーネル:特権モード
アプリケーション:ユーザーモード
というように役割を分けている(らしい)
3.BIOSについて
BIOSは簡単にいうと
PCの電源が入ったとき最初に動く、主にハードウェアを制御するプログラム
です。
BIOSは、CPU・メモリ・キーボード・ディスクなどの初期化を行い、
その後、記憶装置からOSを読み込んで起動処理を引き渡します。
また、OSが起動する前の段階では、
キーボード入力や画面表示、ディスクアクセスなどを
BIOS割り込みを通して行うことができます。
つまりBIOSは、ハードウェアとOSをつなぐ起動時の橋渡し役として働いています。
余談 ~BIOSとUEFI~
実はBIOSにはlegacyBIOSとUEFI BIOSの二種類があります。
legacyBIOSは従来のPCで使われてきた起動方式で、
- 16bit中心の古い設計
- BIOS割り込み(INT 10h / 13h など)を提供
- 512Bを読み込んで実行するMBRブート方式が基本
これに対してUEFI BIOSは
- 32bit / 64bitで動作
- ファイルシステム(FAT)を理解できる
- 高速起動・セキュアブート対応
- GUIやネットワーク機能も持つ
など簡単に複雑な処理を行うことができます。
なので現在のPCの多くは、実際にはUEFIを搭載しています。
UEFI環境では、レガシーBIOS向けに作られたOSやブートローダをそのまま起動することはできません。
そのため、一部のUEFIには
CSM(Compatibility Support Module)と呼ばれる、
レガシーBIOSを擬似的に再現する機能が搭載されています。
CSMを有効にすることで、UEFI上でlegacyBIOS向けのOSを起動することができます。
4.BIOS実装に必要なもの
BIOSを実装するためには、以下のような仕組みを理解/実装する必要があります。
BIOS Data Area(BDA)
- メモリ上の決められた領域に存在するデータ領域
- ハードウェアについての情報が書かれているところ
- INT割り込みなどで参照する
- INT割り込みが行われる際に更新される
割り込みサービス
- 特定の動作をする関数の集まり
- 引数や戻り値は、主にCPUのレジスタを通してやり取りされる
Power On Self Test(POST)
- PC起動直後に実行される、BIOS内部の自己診断処理
- メモリのチェックや、I/O命令を用いたデバイスの状態確認を行う
- 異常があった場合は、ビープ音やエラー表示で通知する
ブート処理
- 起動可能なデバイスを検索する
- ディスクからブートセクタをメモリに読み込む
- CPUの制御をブートローダへ移す
最後に
今回は、OSを作る上で前提となる
OS・カーネル・BIOS・UEFIといった基礎知識について解説しました。
自作CPUでOSを動かすためには、
命令セットだけでなく、割り込みやブート処理など
「CPUの外側の世界」をどう設計するかが重要になってきます。
次回は、それらを踏まえた上で
CPU仕様の整理とエミュレーターの設計を行っていきます。
見てくれてありがとうございました。
次回もお楽しみに!
