一つ一つ構文を理解していくことで機械語を書いてみる本です。
機械語は、ソフトウェアエンジニアの領域の言語としては低レイヤー中の低レイヤーで、これより下は無いってくらいですが、バイナリ列とはいえちゃんとパターンがあり、構文として捉えることができ、人の手で書くこともできます。
本書の構成は以下の通りです。
■ 第1章 環境構築とはじめてのプログラム
・ループだけの簡単なプログラムを通して、環境構築をしながら、本書で機械語を理解していく流れを紹介します
・開発はテキストベースで行えるように簡単なスクリプトを使います
・実行環境はQEMU上です。OSレスで直接動作させます。
・また、機械語を理解するための補助器具として、シェル上で手軽にアセンブル・逆アセンブルするツールも用意しておきます
■ 第2章 基本的な演算
・基本的な演算命令(四則演算、論理演算等)の機械語における構文を紹介します
■ 第3章 シリアルドライバを作る
・シリアルドライバを作り、QEMUのシリアル出力画面に文字を表示してみます
■ 第4章 フレームバッファで画面描画
・フレームバッファと呼ばれる領域へピクセル値を書き込むことで画面描画します
■ 第5章 キーボードドライバを作る
・キーボードドライバを作り、キーボードからの入力を取得します
■ 付録A 登場した機械語命令と構文の一覧
・登場した構文と命令を一覧にまとめています
UEFIの機能を直接呼び出すことでブートローダーでのマルチコア対応を実現するこちらの記事の書き直し(第1章)と、
ブートローダー後(UEFIを抜けた後)のカーネル・アプリでのマルチコア対応方法の紹介(第2章)の2章の構成です。
内容としては、「システムコールを通じて任意のアプリを指定されたコアで動かす」までをてっとりばやく実現します。
本書は以下の2章構成です。
■ 第1章 ブートローダー編
・ブートローダーを改造し、これまで使用していなかった残りのプロセッサもカーネルへジャンプさせます
■ 第2章 カーネル・アプリ編
・カーネルへジャンプしてきた後の、簡単な排他制御の方法や、外部アプリの実行のさせ方、各プロセッサへのタスク実行のシステムコール化を行います
なお、本書ではマルチコア時の割り込みについてはあまり立ち入りません。マルチコアとして新たに使用するプロセッサへ任意の処理を、ブートローダー/カーネル/アプリのレベルでそれぞれ行えるようになればOKとします。
本書は自作OSでNICドライバを作ってみる本です。
「フルスクラッチで作る!x86_64自作OS」シリーズで作成するOSを対象にしていますが、PCI上のNICデバイスの確認方法から紹介していますので、ご自身のOS向けにNICドライバを作る際にも参考になるかと思います。
NICドライバとしては、NICが受信したバイナリ列(ほとんどの場合イーサネットフレーム)を画面にダンプしたり、NICへ任意のバイナリ列を「オレオレイーサネットフレーム」として送信させたり、といったことをやってみます。プロトコル・スタックの実装までは踏み込みませんが、NICのMACアドレスの取得方法を付録で紹介しているので、NICへ送信させるバイト列に「宛先MACアドレス」や「送信元MACアドレス」・「タイプ」をヘッダとして含めておけば、ちゃんとしたイーサネットフレームを送信するようにもできます。
【目次】
■ はじめに
・本書の構成
・開発環境・動作確認環境
・本書の PDF 版 /HTML 版やソースコードの公開場所について
■ 第1章 PCI から NIC の情報を取得する
・1.1 この章でやること
・1.2 lspci コマンドで NIC を確認
・1.3 PCI コンフィグレーション空間のアクセス方法
・1.4 PCI コンフィグレーション空間から NIC のベンダー ID ・デバイス IDを読んでみる
・1.5 コマンドレジスタ・ステータスレジスタを確認してみる
・1.6 NIC の BAR をダンプしてみる
■ 第2章 NIC を制御してイーサネットフレームを送受信する
・2.1 NIC のレジスタの操作方法
・2.2 フレームを受信する
・2.3 オレオレフレームを送信する
■ 付録 A MAC アドレスを取得する
・A.1 EEPROM へのアクセスを試す
・A.2 受信アドレスレジスタから取得する
■ おわりに
■ 参考情報
・参考にさせてもらった情報
・開発リポジトリ
・本シリーズの過去の著作
システムコールの仕組みを説明し、実装する薄い本(表紙込40ページ)です。
システムコールを実装することで、カーネルとアプリをバイナリレベルで分離できるようになります。また、本書ではアプリから別バイナリのアプリを呼び出す実装例も「フォアグラウンド」・「バックグラウンド」それぞれで紹介します。
本書は「フルスクラッチで作る!x86_64自作OS」シリーズの3冊目で、実装方法の説明の際はこのシリーズで作ってきたOSを対象としていますが、「システムコール」という単体の技術領域について1から説明していますので、ご自身のOSへ実装する際や「システムコール」という技術領域の理解の参考にもなるかと思います。
【目次】
■ はじめに
・本書の構成
・開発環境・動作確認環境
・本書の PDF 版 /HTML 版やソースコードの公開場所について
■ 第1章 システムコールを実装し、カーネルとアプリを分離する
・1.1 システムコールの仕組み
・1.2 ソフトウェア割り込みを使えるようにする
・1.3 カーネルから外部の実行バイナリ ( アプリ ) を起動する
・1.4 システムコールを実装する
■ 第2章 アプリから別のアプリを呼び出す
・2.1 フォアグラウンド実行を実現する
・2.2 バックグラウンド実行を実現する
■ おわりに
・表紙のフィギュアについて
■ 参考情報
・開発リポジトリ
・本シリーズの過去の著作
自作OSの自動化の第一歩として、
BIOSが最初に実行する512バイトのMBR(マスタブートレコード)の自動テストをKVMで実現し、
テスト対象のMBR自身も遺伝的アルゴリズムで自動生成してしまおうという本です。
【目次】
■ はじめに
・本書でやること
・本書の構成
・開発環境・動作確認環境
・本書の PDF 版 /HTML 版やソースコードの公開場所について
■ 第1章 /dev/kvm を直接叩いて理解する
・1.1 Hello KVM!
・1.2 BIOS を動かす
■ 第2章 既存のコードを改造して MBR テスターを作る
・2.1 実現すること
・2.2 手軽そうなサンプルを探す
・2.3 kvmulate について
・2.4 改造する
・2.5 動作確認
・2.6 補足: GUI 上の内容を標準出力へ出す
■ 第3章 遺伝的 MBR を実現する
・3.1 遺伝的アルゴリズムについて
・3.2 実装について
・3.3 動作確認
・3.4 補足: 評価方法を工夫する (MBRatoon)
■ おわりに
■ 参考情報
・参考にさせてもらった情報
サブタイトル「ACPIでHPET取得してスケジューラを作る本」の通り、
「ACPI」・「HPET」・「スケジューラ」という一連の技術要素をすべて扱う本です。
主題は「HPETの制御」で、2005年頃からPCのチップセットに組み込まれるようになった
比較的新しい高精度なタイマーであるHPET(High Precision Event Timer)を直接制御します。
そのためにACPIからHPETの情報を取得するところから始めるため、
自作OSでACPIから情報を取得する方法としても参考になる本かと思います。
そして、前著で作成したカーネル・アプリの枠組みにスケジューラを追加します。
【目次】
■ はじめに
・本書でやること
・開発環境・動作確認環境
・本書の PDF 版 /HTML 版やサンプルコードの公開場所について
・前著からの差分について
■ 第1章 ACPI
・1.1 共通 : この章でやること
・1.2 boot: EFI Configuration Table を見てみる
・1.3 boot: ACPI Table を見つける処理を実装する
・1.4 boot: RSDP をカーネルへ渡すようにする
・1.5 kernel: RSDP をブートローダーから受け取る
・1.6 kernel: XSDT を見てみる
・1.7 kernel: OVMF のバージョンを上げる
・1.8 kernel: HPET テーブルを見つける処理を追加する
■ 第2章 HPET
・2.1 HPET の情報を表示してみる
・2.2 sleep を実装してみる
・2.3 alert を実装してみる
・2.4 周期タイマー (ptimer) を実装してみる
■ 第3章 スケジューラ
・3.1 やること
・3.2 実装 : sched.c を用意
・3.3 コンテキストスイッチの流れ
・3.4 これから実装すること
・3.5 実装 : コンテキストスイッチ
・3.6 実装 : 実験用のタスクを定義
・3.7 実装 : タスク B のスタックの初期化
・3.8 動作確認
■ おわりに
・表紙について
■ 参考情報
・参考にさせてもらった情報
・本シリーズの過去の著作
カーネルとアプリをフルスクラッチで作る本です。
ブートローダーは前著(UEFIベアメタルプログラミング)の内容で作ったものを前提としますが、
「ブートローダー」と「カーネル・アプリ」はバイナリ単位で分かれていますので、
本書から始めることもできます。
内容は、
・ 画面出力として「フレームバッファ」を使用した画面表示と、簡易的なフォントを実装した文字表示
・ キーボード入力として「キーボードコントローラ(KBC)」の使用方法
・ 割り込みの使い方としてCPUの「IDT」と「割り込みコントローラ(PIC)」の設定方法
・ 「ファイルシステム」としてRAM上に簡易的なファイルシステムを作る方法
を紹介します。
そして、最後にそれらの機能を使用した「アプリケーション」として、
ファイルシステム上の画像ファイルを表示しキー入力で切り替える「画像ビューア」を作ります。
■ 目次
「UEFI」で「ベアメタルプログラミング」を行う本のパート2です。
UEFIの仕様には前著で紹介した他にも色々な機能があります。
本書はパート1で紹介できなかった機能を紹介するTIPS本です。
【目次】
■ はじめに
・本書に関する情報の公開場所
■ 第1章 コンソール出力
・1.1 文字色と文字の背景色を設定する
・1.2 出力可能な文字であるか否かを判定する
・1.3 テキストモードの情報を取得する
・1.4 テキストモードを変更する
■ 第2章 キーボード入力
・2.1 特定のキー入力で呼び出される関数を登録する
■ 第3章 UEFI アプリケーションのロード・実行
・3.1 自分自身のパスを表示してみる
・3.2 デバイスパスを作成してみる(その1)
・3.3 デバイスパスをロードしてみる(その1)
・3.4 デバイスを指定するパス指定
・3.5 デバイスパスを作成してみる(その2)
・3.6 デバイスパスをロードしてみる(その2)
・3.7 ロードしたイメージを実行してみる
・3.8 Linux を起動してみる : カーネルビルド
・3.9 Linux を起動してみる : カーネル起動オプション指定
■ 第4章 タイマーイベント
・4.1 時間経過を待つ
・4.2 イベント発生時に呼び出される関数を登録する
■ 第5章 BootServices や RuntimeServices のその他の機能
・5.1 メモリアロケータを使う
・5.2 シャットダウンする
■ おわりに
■ 参考情報
・参考にさせてもらった情報
・本書の他に UEFI ベアメタルプログラミングについて公開している情報
ライブラリやツールチェイン等を使わず、
エディタとコンパイラだけの「フルスクラッチ」でUEFIファームウェアを叩く
「ベアメタルプログラミング」を紹介し、
OSっぽいもの(poiOS)を作る本です。
【目次】
■ はじめに
・poiOS について
・本書に関する情報の公開場所
■ 第1章 Hello UEFI!
・1.1 ベアメタルプログラミングの流れ
・1.2 UEFI の仕様に沿ったプログラムを書く
・1.3 UEFI ファームウェアが実行できる形式へクロスコンパイル
・1.4 UEFI ファームウェアが見つけられるように起動ディスクを作成
■ 第2章 キー入力を取得する
・2.1 EFI_SIMPLE_TEXT_INPUT_PROTOCOL
・2.2 エコーバックプログラムを作ってみる
・2.3 シェルっぽいものを作ってみる
■ 第3章 画面に絵を描く
・3.1 EFI_GRAPHICS_OUTPUT_PROTOCOL
・3.2 矩形を描くサンプルを実装
・3.3 GUI モードを追加する
■ 第4章 マウス入力を取得する
・4.1 EFI_SIMPLE_POINTER_PROTOCOL
・4.2 マウスカーソルを追加する
■ 第5章 ファイル読み書き
・5.1 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL
・5.2 ルートディレクトリ直下のファイル / ディレクトリを一覧表示 (ls)
・5.3 GUI モードでファイル / ディレクトリ一覧を表示する
・5.4 ファイルを読んでみる (cat)
・5.5 GUI モードへテキストファイル閲覧機能追加
・5.6 ファイルへ書き込んでみる (edit)
・5.7 GUI モードへテキストファイル上書き機能追加
■ 第6章 poiOS の機能拡張例
・6.1 画像を表示してみる
・6.2 GUI モードとシェルの終了機能を追加する
・6.3 マウスを少し大きくする
・6.4 機能拡張版 poiOS 実行の様子
■ おわりに
■ 参考情報
・参考にさせてもらった情報
・本書の他に UEFI ベアメタルプログラミングについて公開している情報
QEMU(BIOS + x86_32)向けにブートローダー・カーネル・ユーザーランドを
フルスクラッチで自作しているOS(OS5)の
全ソースコード+コメンタリー本です。
【目次】
■ はじめに
・この本について
・本書の構成
■ 第1章 OS5 について
・1.1 OS5 とは
・1.2 ソースディレクトリ構成
・1.3 メモリマップ
■ 第2章 ブートローダー
・2.1 MBR 部
■ 第3章 カーネル
・3.1 初期化
・3.2 割り込み / 例外
・3.3 メモリ管理
・3.4 タスク管理
・3.5 ファイルシステム
・3.6 システムコール
・3.7 デバイスドライバ
・3.8 ライブラリ
■ 第4章 ユーザーランド
・4.1 共通部分
・4.2 0shell
・4.3 uptime
・4.4 whoareyou
・4.5 libkernel
・4.6 libcommon
・4.7 libconsole
・4.8 libstring
■ 第5章 ツール類
・5.1 ファイルシステム作成
・5.2 ブログ記事作成支援
■ おわりに
■ 参考情報