├── CNAME ├── README.md ├── _config.yml ├── _layouts └── default.html ├── book-cover-mini.png ├── book-cover.png ├── book-sample.pdf ├── errata ├── first_1suri.md ├── first_1suri_all.md ├── first_2suri.md ├── first_2suri_all.md ├── first_3suri.md ├── first_3suri_all.md ├── first_4suri.md ├── first_4suri_all.md ├── first_5suri.md └── first_5suri_all.md ├── faq.md ├── mikanos-bugs.md ├── ref-latest.md └── toc.md /CNAME: -------------------------------------------------------------------------------- 1 | zero.osdev.jp -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ゼロからの OS 自作入門 2 | 3 | このリポジトリは 2021 年 3 月に出版予定の書籍『ゼロからの OS 自作入門』のサポートを行う場所です。 4 | 書籍の内容に関する質疑応答、正誤表の提供、読者同士のコミュニケーションを主な目的としています。 5 | 6 | [![表紙画像](./book-cover-mini.png)](./book-cover.png) 7 | 8 | [「はじめに」と「0章」のサンプル PDF ファイル](./book-sample.pdf) 9 | 10 | ## News 11 | 12 | 「MikanOS お手軽パック」をリリースしました。 13 | MikanOS の開発環境が無くても、MikanOS をとりあえず起動して楽しめます。 14 | 今のところ Windows 限定です。 15 | 16 | ダウンロードは [MikanOS v1.0 リリース](https://github.com/uchan-nos/mikanos/releases/tag/v1.0) から可能です。 17 | mikanos_otegaru_pack-v1.0.zip がお手軽パックです。 18 | 19 | ## 質疑応答 20 | 21 | 書籍の内容に関する質疑応答は [Issues](https://github.com/uchan-nos/os-from-zero/issues) で受け付けます。 22 | 書籍を読んでの質問でもいいですし、書籍を読む前の質問も可能です。 23 | 質問の前に [FAQ](./faq.md) をチェックし、可能ならば Issues の過去の質疑応答も検索し、すでに回答があるかどうかを調べてください。 24 | 25 | 回答は著者だけとは限らず、他の読者の方がする可能性があります。 26 | 読者の皆さんは回答可能な質問を見つけたら、自由に回答していただいてかまいません。 27 | 28 | 毎週土曜日夜に Discord で雑談会を開催しています。uchan と雑談や MikanOS に関する質問ができます。 29 | 基本は毎週土曜日 21:00 - 22:00 の開催ですが、uchan の都合により中止したり曜日がずれたりします。 30 | 31 | Discord 招待リンク→ [discord.gg/w227g2Q](https://discord.gg/w227g2Q) 32 | 33 | ## 議論の場 34 | 35 | また、質疑応答に限らず、少し発展的な議論などにも [Issues](https://github.com/uchan-nos/os-from-zero/issues) を活用していただけます。 36 | トピックごとに Issue を立て、議論を深めていってください。 37 | 38 | 深い議論を行いたい場合は [osdev-jp](https://osdev.jp/) の Slack やメーリングリストもご活用ください。 39 | 40 | ## 正誤情報 41 | 42 | 正誤情報は errata ディレクトリに随時追加していきます。 43 | 初版の正誤情報へのリンク: [第1刷](./errata/first_1suri.md) [第2刷](./errata/first_2suri.md) [第3刷](./errata/first_3suri.md) [第4刷](./errata/first_4suri.md) [第5刷](./errata/first_5suri.md) 44 | 45 | ## 参考文献 URL 46 | 47 | 最新の参考文献の URL を [ref-latest](./ref-latest.md) にて集約しています。 48 | リンク切れを見つけた際は報告、またはプルリクエストをいただけると幸いです。 49 | (リンク先は常に変動する可能性があるため、正誤としては扱いません) 50 | 51 | ## 読書記録、成果物の紹介 52 | 53 | 読書記録や成果物の紹介などは、ぜひ当リポジトリの [Wiki](https://github.com/uchan-nos/os-from-zero/wiki) に書いて欲しいなと思います。 54 | 55 | Wiki というのは、読者の皆さんによって編集できる Web ページのことです。 56 | 57 | 皆さんが 1 つの Wiki に情報を集約してくださることにより、知見が読者間で共有しやすくなります。 58 | もちろん個人のブログに記事を書くなどでも良いのですが、 59 | その際は Wiki に個人ページを作ってリンクを張り、ブログ記事を紹介していただけると嬉しいです。 60 | 61 | MikanOS を改造したり、独自の OS を作ったりしたら、ぜひ個人ページで自慢してください! 62 | 63 | ## よくある質問と回答 64 | 65 | [FAQ](./faq.md) にまとまっています。 66 | 67 | ## 書籍情報 68 | 69 | - タイトル:ゼロからの OS 自作入門 70 | - 著者:内田公太(uchan) 71 | - 出版社:マイナビ出版 72 | - 出版日:2021 年 3 月 22 日 73 | - ページ数:744 74 | - ISBN:978-4-8399-7586-9 75 | - [ゼロからのOS自作入門の目次](./toc.md) 76 | - [マイナビ出版の書籍ページ](https://book.mynavi.jp/ec/products/detail/id=121220) 77 | - [Amazonの商品ページ](https://amzn.to/2ZNwQtn) 78 | - [サンプル PDF](./book-sample.pdf) 79 | - [公式ハッシュタグ](https://twitter.com/hashtag/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AEOS%E8%87%AA%E4%BD%9C%E5%85%A5%E9%96%80) 80 | 81 | ## リンク集 82 | 83 | - MikanOS ソースコード:[github.com/uchan-nos/mikanos](https://github.com/uchan-nos/mikanos) 84 | - MikanOS 開発環境:[github.com/uchan-nos/mikanos-build](https://github.com/uchan-nos/mikanos-build) 85 | - osdev-jp:[osdev.jp](https://osdev.jp/) 86 | - 著者(uchan)のTwitter:[@uchan_nos](https://twitter.com/uchan_nos) 87 | 88 | ## osdev-jp 89 | 90 | 書籍の筆者 uchan が管理する「osdev-jp」というコミュニティがあります。 91 | 自作 OS やその関連技術が好きな人が集まるコミュニティになっておりますので、興味のある方はご加入ください。 92 | 93 | osdev-jp では、定期的に「自作 OS もくもく会」を開催しています。よろしければご参加ください。 94 | もくもく会の開催が決まると [connpass の osdev-jp ページ](https://osdev-jp.connpass.com/) で告知、募集が行われます。 95 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-slate 2 | title: ゼロからのOS自作入門 3 | description: 「ゼロからのOS自作入門」(内田公太著、マイナビ出版)のサポートサイトです 4 | show_downloads: false 5 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | {% seo %} 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | {% if site.github.is_project_page %} 19 | View on GitHub 20 | {% endif %} 21 | 22 | 23 |

{{ site.title | default: site.github.repository_name }}

24 |
25 |

{{ site.description | default: site.github.project_tagline }}

26 | 27 | {% if site.show_downloads %} 28 |
29 | Download this project as a .zip file 30 | Download this project as a tar.gz file 31 |
32 | {% endif %} 33 |
34 |
35 | 36 | 37 |
38 |
39 | {{ content }} 40 |
41 |
42 | 43 | 44 | 52 | 53 | {% if site.google_analytics %} 54 | 62 | {% endif %} 63 | 64 | 65 | -------------------------------------------------------------------------------- /book-cover-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uchan-nos/os-from-zero/d3990cddc39a8c0913fdf4dfe0ed8e9be6233303/book-cover-mini.png -------------------------------------------------------------------------------- /book-cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uchan-nos/os-from-zero/d3990cddc39a8c0913fdf4dfe0ed8e9be6233303/book-cover.png -------------------------------------------------------------------------------- /book-sample.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uchan-nos/os-from-zero/d3990cddc39a8c0913fdf4dfe0ed8e9be6233303/book-sample.pdf -------------------------------------------------------------------------------- /errata/first_1suri.md: -------------------------------------------------------------------------------- 1 | # 初版第1刷の正誤情報 2 | 3 | 重要な誤植が見つかり次第掲載していきます。些細な正誤情報も含めたリストは [初版第1刷の正誤情報(すべて)](first_1suri_all.md) をご覧ください。 4 | 5 | - p.34 第2段落の3行目 6 | - 誤:「**A.1 開発環境のインストール**」 7 | - 正:「**付録A.01 WSLのインストール**」 8 | - p.35 第1段落の3行目 9 | - 誤:「**A.1 開発環境のインストール**」 10 | - 正:「**付録A 開発環境のインストール**」 11 | - p.35 第1段落の4行目 12 | - 誤:「**A.2 WSLでQEMUを使う準備**」 13 | - 正:「**付録A.02 WSLでQEMUを使う準備**」 14 | - p.39 第2段落の6行目 15 | - 誤:「oは0x65」 16 | - 正:「oは0x6f」 17 | - p.39 第3段落の3行目 18 | - 誤:「**A.8 ASCIIコード表**」 19 | - 正:「**付録F ASCIIコード表**」 20 | - p.49 第2段落直後の埋め込みリスト 21 | - 誤:MikanLoader.dec 22 | - 正:MikanLoaderPkg.dec 23 | - p.49 第2段落直後の埋め込みリスト 24 | - 誤:MikanLoader.dsc 25 | - 正:MikanLoaderPkg.dsc 26 | - p.49 第4段落 27 | - 誤:「付録A EDK IIのファイル説明」 28 | - 正:「**付録C EDK IIのファイル説明**」 29 | - p.51 表2.1 30 | - [正しい表のイメージ](https://github.com/uchan-nos/os-from-zero/issues/3#issuecomment-803728531) 31 | - ヘッダ行(網掛け部分)には「設定項目」「設定値」が来るのが正しい。 32 | - 最終行は不要。 33 | - p.55 表2.3 Type=4の行 34 | - 誤:EfiBootServicesCode 35 | - 正:EfiBootServicesData 36 | - p.56 リスト2.6 37 | - 最終行がリスト外に飛び出しているが、リストに含めるのが正しい。 38 | - p.62 図2.4 39 | - 誤:`int* q` 40 | - 正:`int* p` 41 | - p.63 図2.5 42 | - 2つ目の「0xffc8」は「0xffd8」が正しい。 43 | - アドレスは上から 0xffc8、0xffd0、0xffd8、0xffdc、0xffe0、0xffe8、0xffec、0xfff0 となる。 44 | - p.64 第1段落の3行目 45 | - 誤:9ンバ 46 | - 正:メンバ 47 | - p.72 3.3 第4段落の4行目 48 | - 誤:`_Z3addii` 49 | - 正:`_Z3fooii` 50 | - p.73 第4段落直後のコマンド 51 | - 誤: 52 | ``` 53 | $ cd $HOME/workspace/mikanos/kernel 54 | $ git checkout osbook_day03a 55 | ``` 56 | - 正: 57 | ``` 58 | $ cd $HOME/workspace/mikanos 59 | $ git checkout osbook_day03a 60 | $ cd kernel 61 | ``` 62 | - p.80 第5段落の6行目 63 | - 誤:0x669f028 64 | - 正:0x101010 65 | - p.108 第1段落の4行目 66 | - 誤:vtableというものを実現しています 67 | - 正:vtableを用いて実現しています 68 | - p.108 表4.4タイトル 69 | - 誤:クラスのvtable 70 | - 正:`Base`クラスのvtable 71 | - p.137 リスト6.4タイトル 72 | - 誤:(graphics.hpp) 73 | - 正:(osbook_day06cのgraphics.hpp) 74 | - p.255 第2段落の1行目 75 | - 誤:`Layer::Draw()` に対して描画範囲を指定 76 | - 正:`Layer::DrawTo()` に対して描画範囲を指定 77 | - p.255 第2段落の2行目 78 | - 誤:`Layer::Draw()` 側を改造 79 | - 正:`Layer::DrawTo()` 側を改造 80 | - p.429 リスト18.18 81 | - リスト最終行と脚注1が重なってしまっている 82 | - リストの最終行は `v = v * 10 + (s[i] - '0');` 83 | - 脚注1は「*1 RPN:Reverse Polish Notation」 84 | - p.716 第1段落の4行目 85 | - 誤:WSL(**A.1** を参照) 86 | - 正:WSL(**A.01** を参照) 87 | -------------------------------------------------------------------------------- /errata/first_1suri_all.md: -------------------------------------------------------------------------------- 1 | # 初版第1刷の正誤情報(すべて) 2 | 3 | 重要な正誤情報だけをまとめたリストは [初版第1刷の正誤情報](first_1suri.md) にあります。 4 | 5 | - p.34 第2段落の3行目 6 | - 誤:「**A.1 開発環境のインストール**」 7 | - 正:「**付録A.01 WSLのインストール**」 8 | - p.35 第1段落の3行目 9 | - 誤:「**A.1 開発環境のインストール**」 10 | - 正:「**付録A 開発環境のインストール**」 11 | - p.35 第1段落の4行目 12 | - 誤:「**A.2 WSLでQEMUを使う準備**」 13 | - 正:「**付録A.02 WSLでQEMUを使う準備**」 14 | - p.38 第2段落直後の埋め込みリスト 15 | - 以下のように、「F A C E」の位置を2進数4桁と揃える 16 | ``` 17 | = 1111 1010 1100 1110 18 | = F A C E 19 | = 0xFACE 20 | ``` 21 | - p.39 第2段落の6行目 22 | - 誤:「oは0x65」 23 | - 正:「oは0x6f」 24 | - p.39 第3段落の3行目 25 | - 誤:「**A.8 ASCIIコード表**」 26 | - 正:「**付録F ASCIIコード表**」 27 | - p.40 1.6の最終段落の最終行 28 | - 誤:完全な差分が分かります。 29 | - 正:完全な差分が分かります。詳しくは「**付録B.01 MikanOSのバージョン間の差分確認**」を参照してください。 30 | - p.43 第3段落の3行目 31 | - 誤:**EfiMain()** 32 | - 正:`EfiMain()` 33 | - p.49 第2段落直後の埋め込みリスト 34 | - 誤:MikanLoader.dec 35 | - 正:MikanLoaderPkg.dec 36 | - p.49 第2段落直後の埋め込みリスト 37 | - 誤:MikanLoader.dsc 38 | - 正:MikanLoaderPkg.dsc 39 | - p.49 第4段落 40 | - 誤:「付録A EDK IIのファイル説明」 41 | - 正:「**付録C EDK IIのファイル説明**」 42 | - p.50 第1段落の4行目 43 | - 誤:`#nclude` 44 | - 正:`#include` 45 | - p.51 表2.1 46 | - [正しい表のイメージ](https://github.com/uchan-nos/os-from-zero/issues/3#issuecomment-803728531) 47 | - ヘッダ行(網掛け部分)には「設定項目」「設定値」が来るのが正しい。 48 | - 最終行は不要。 49 | - p.52 リスト2.3 50 | - 誤:EDK IIのUefi.h体 51 | - 正:EDK IIのUefi.h 52 | - p.52 リスト2.4 53 | - 誤:リスト2.4 EDK IIのUefiBaseType.h 54 | - 正:**リスト2.4 EDK IIのUefiBaseType.h** 55 | - p.54 表2.2 0x00001000の行 56 | - 誤:`EfiConvensionalMemory` 57 | - 正:`EfiConventionalMemory` 58 | - p.54 表2.2 0x00100000の行 59 | - 誤:`EfiConvensionalMemory` 60 | - 正:`EfiConventionalMemory` 61 | - p.54 第5段落の5行目 62 | - 誤:4億程度 63 | - 正:43億程度 64 | - p.55 表2.3 Type=4の行 65 | - 誤:EfiBootServicesCode 66 | - 正:EfiBootServicesData 67 | - p.55 表2.3 Type=7の行 68 | - s→t 69 | - 誤:EfiConvensionalMemory 70 | - 正:EfiConventionalMemory 71 | - p.56 リスト2.6タイトル 72 | - 「の仕様」の「様」が1mmほど上方にズレているが、ズレていないのが正しい。 73 | - p.56 リスト2.6 74 | - 最終行がリスト外に飛び出しているが、リストに含めるのが正しい。 75 | - p.58 第2段落の3行目 76 | - 誤:**リスト 2.** 7 のように 77 | - 正:**リスト 2.7** のように 78 | - p.58 リスト2.8 79 | - 1行目は空白1個分しかインデントされていないが、以下の通り、2行目以降と揃えて、空白2個でインデントするのが正しい。 80 | ``` 81 | ␣␣CHAR8 memmap_buf[4096 * 4]; 82 | ␣␣struct MemoryMap memmap = {sizeof(memmap_buf), memmap_buf, 0, 0, 0, 0}; 83 | ␣␣…… 84 | ``` 85 | - p.62 図2.4 86 | - 誤:`int* q` 87 | - 正:`int* p` 88 | - p.63 図2.5 89 | - 2つ目の「0xffc8」は「0xffd8」が正しい。 90 | - アドレスは上から 0xffc8、0xffd0、0xffd8、0xffdc、0xffe0、0xffe8、0xffec、0xfff0 となる。 91 | - p.64 第1段落の3行目 92 | - 誤:9ンバ 93 | - 正:メンバ 94 | - p.64 最終段落の2行目 95 | - 誤:「.」} 96 | - 正:「.」 97 | - p.66 第1段落直後の埋め込みリスト 98 | - 埋め込みリストの2行目以降のインデント(半角スペース2個)を解除する。正しい形は以下。 99 | ``` 100 | EFI_FILE_PROTOCOL* memmap_file; 101 | EFI_FILE_PROTOCOL** ptr_ptr = &memmap_file; 102 | root_dir->Open( 103 | ␣␣␣␣root_dir, ptr_ptr, L"\\memmap", 104 | ␣␣␣␣EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, 0); 105 | ``` 106 | - p.68 脚注1 107 | - 誤:使えます。。 108 | - 正:使えます。 109 | - p.72 3.3 第4段落の4行目 110 | - 誤:int foo(int, int) 111 | - 正:`int foo(int, int)` 112 | - p.72 3.3 第4段落の4行目 113 | - 誤:`_Z3addii` 114 | - 正:`_Z3fooii` 115 | - p.73 第2段落の2行目 116 | - 誤:\_\_asm\_\_() 117 | - 正:`__asm__()` 118 | - p.73 第4段落直後のコマンド 119 | - 誤: 120 | ``` 121 | $ cd $HOME/workspace/mikanos/kernel 122 | $ git checkout osbook_day03a 123 | ``` 124 | - 正: 125 | ``` 126 | $ cd $HOME/workspace/mikanos 127 | $ git checkout osbook_day03a 128 | $ cd kernel 129 | ``` 130 | - p.74 第1段落の5行目 131 | - 誤:`fno-rtti` 132 | - 正:`-fno-rtti` 133 | - p.76 第3段落の4行目 134 | - 誤:「コラム3.2 ポインタのキャスト」 135 | - 正:「**コラム3.2 ポインタのキャスト**」 136 | - p.77 第5段落の3行目 137 | - 誤:C++の整数同士 138 | - 正:C言語の整数同士 139 | - p.80 第5段落の6行目 140 | - 誤:0x669f028 141 | - 正:0x101010 142 | - p.82 第2段落の1行目 143 | - 誤:今後作っていくOSでは、文字列だけではなくウィンドウやマウスカーソルなど、 144 | - 正:今後作っていくOSでは、ウィンドウやマウスカーソルなど、 145 | - p.82 箇条書き第4項目 146 | - 誤:RBG 147 | - 正:RGB 148 | - p.83 第2段落の3行目 149 | - 誤:RBG 150 | - 正:RGB 151 | - p.87 コラム3.2 第3段落の2行目 152 | - 誤:型情報(int) 153 | - 正:型情報(`int`) 154 | - p.88 第2段落の1行目 155 | - 誤:「3.3 初めてのカーネル」 156 | - 正:「**3.3 初めてのカーネル**」 157 | - p.91 第3段落の1行目 158 | - 誤:変数r1に書く操作 159 | - 正:変数`r1`に書く操作 160 | - p.91 箇条書き第3項目 161 | - 誤:指す先の型はint 162 | - 正:指す先の型は`int` 163 | - p.94 第2段落の1行目 164 | - 誤:「第3章 画面表示の練習とブートローダ」 165 | - 正:「**第3章 画面表示の練習とブートローダ**」 166 | - p.94 埋め込みリスト 167 | - 誤:`clang++ -I/home/uchan/osbook/devenv/x86_64-elf/include/c++/v1 -I/home/uchan/osbook/evenv/x86_64-elf/include -nostdlibinc -D__ELF__ -D_LDBL_EQ_DBL -D_GNU_SOURCE -D_POSIX_TIMERS -O2 --target=x86_64-elf -fno-exceptions -ffreestanding -c main.cpp` 168 | - 正:`clang++ -I/home/uchan/osbook/devenv/x86_64-elf/include/c++/v1 -I/home/uchan/osbook/devenv/x86_64-elf/include -I/home/uchan/osbook/devenv/x86_64-elf/include/freetype2 -nostdlibinc -D__ELF__ -D_LDBL_EQ_DBL -D_GNU_SOURCE -D_POSIX_TIMERS -O2 -Wall -g --target=x86_64-elf -ffreestanding -mno-red-zone -fno-exceptions -fno-rtti -std=c++17 -c main.cpp` 169 | - p.99 最終段落の3行目 170 | - 誤:図4.1 171 | - 正:**図4.1** 172 | - p.101 第3段落の3行目 173 | - 誤:「コラム3.1 レッドゾーン」 174 | - 正:「**コラム3.1 レッドゾーン**」 175 | - p.106 第2段落の6行目 176 | - 誤:「4.4 vtable」 177 | - 正:「**4.4 vtable**」 178 | - p.106 第3段落の4行目 179 | - 誤:意味的にきれいにプログラム 180 | - 正:意味的にきれいなプログラム 181 | - p.107 第5段落の6行目 182 | - 誤:知人やosdev-jpに質問するといいでしょう。 183 | - 正:知人や本書のサポートサイトに質問するといいでしょう。 184 | - p.108 第1段落の4行目 185 | - 誤:vtableというものを実現しています 186 | - 正:vtableを用いて実現しています 187 | - p.108 第3段落の5行目 188 | - 誤:Base::Func 189 | - 正:`Base::Func` 190 | - p.108 表4.4タイトル 191 | - 誤:クラスのvtable 192 | - 正:`Base`クラスのvtable 193 | - p.110 第3段落の2行目 194 | - 誤:「第19 章 ページング」 195 | - 正:「**第19 章 ページング**」 196 | - p.110 最終段落の1行目 197 | - 誤:図4.4 198 | - 正:**図4.4** 199 | - p.119 第1段落の6行目 200 | - 誤:「1.2 結局何をやったのか」を参照 201 | - 正:「1.5 結局、何をやったのか?」を参照 202 | - p.137 リスト6.4タイトル 203 | - 誤:(graphics.hpp) 204 | - 正:(osbook_day06cのgraphics.hpp) 205 | - p.140 第5段落の6行目 206 | - 誤:eXtended Host Controller Interface 207 | - 正:eXtensible Host Controller Interface 208 | - p.143 表6.1 209 | - ビット位置「10:8」と「7:0」のフォントを、その他と揃える 210 | - p.215 第3段落の1行目 211 | - 誤:**リスト 9.1** 1 に 212 | - 正:**リスト 9.11** に 213 | - p.255 第2段落の1行目 214 | - 誤:`Layer::Draw()` に対して描画範囲を指定 215 | - 正:`Layer::DrawTo()` に対して描画範囲を指定 216 | - p.255 第2段落の2行目 217 | - 誤:`Layer::Draw()` 側を改造 218 | - 正:`Layer::DrawTo()` 側を改造 219 | - p.429 リスト18.18 220 | - リスト最終行と脚注1が重なってしまっている 221 | - リストの最終行は `v = v * 10 + (s[i] - '0');` 222 | - 脚注1は「*1 RPN:Reverse Polish Notation」 223 | - p.442 図19.2の右から2つ目の枠 224 | - 誤:`PD[0]` … `PDP[511]` 225 | - 正:`PD[0]` … `PD[511]` 226 | - p.443 図19.3(図19.2と同様の修正) 227 | - 誤:`PD[0]` … `PDP[511]` 228 | - 正:`PD[0]` … `PD[511]` 229 | - p.443 図19.3中段 230 | - 誤:`PG` 231 | - 正:`PD` 232 | - p.468 第1段落の1行目 233 | - 誤:108バイト 234 | - 正:104バイト 235 | - p.490 リスト21.3 236 | - 誤:cconst 237 | - 正:const 238 | - p.586 リスト25.3タイトル 239 | - 誤:(terminal.cpp) 240 | - 正:(fat.cpp) 241 | - p.716 第1段落の4行目 242 | - 誤:WSL(**A.1** を参照) 243 | - 正:WSL(**A.01** を参照) 244 | - p.726 リストC.3の2行目 245 | - その他の行と字間を揃える(均等割付をやめ、左詰めにする) 246 | - 誤:`␣␣␣U e f i A p p ……` 247 | - 正:`␣␣UefiApp……` 248 | - 字間を揃えた結果、インデントが半角空白2個となり、3行目(`␣␣UefiLib`)と揃うのが正しい 249 | -------------------------------------------------------------------------------- /errata/first_2suri.md: -------------------------------------------------------------------------------- 1 | # 初版第2刷の正誤情報 2 | 3 | 重要な誤植が見つかり次第掲載していきます。些細な正誤情報も含めたリストは [初版第2刷の正誤情報(すべて)](first_2suri_all.md) をご覧ください。 4 | 5 | - p.39 第2段落の6行目 6 | - 誤:「oは0x65」 7 | - 正:「oは0x6f」 8 | - p.73 第4段落直後のコマンド 9 | - 誤: 10 | ``` 11 | $ cd $HOME/workspace/mikanos/kernel 12 | $ git checkout osbook_day03a 13 | ``` 14 | - 正: 15 | ``` 16 | $ cd $HOME/workspace/mikanos 17 | $ git checkout osbook_day03a 18 | $ cd kernel 19 | ``` 20 | - p.108 表4.4タイトル 21 | - 誤:クラスのvtable 22 | - 正:`Base`クラスのvtable 23 | - p.255 第2段落の1行目 24 | - 誤:`Layer::Draw()` に対して描画範囲を指定 25 | - 正:`Layer::DrawTo()` に対して描画範囲を指定 26 | - p.255 第2段落の2行目 27 | - 誤:`Layer::Draw()` 側を改造 28 | - 正:`Layer::DrawTo()` 側を改造 29 | -------------------------------------------------------------------------------- /errata/first_2suri_all.md: -------------------------------------------------------------------------------- 1 | # 初版第2刷の正誤情報(すべて) 2 | 3 | 重要な正誤情報だけをまとめたリストは [初版第2刷の正誤情報](first_2suri.md) にあります。 4 | 5 | - p.39 第2段落の6行目 6 | - 誤:「oは0x65」 7 | - 正:「oは0x6f」 8 | - p.54 表2.2 0x00001000の行 9 | - 誤:`EfiConvensionalMemory` 10 | - 正:`EfiConventionalMemory` 11 | - p.54 表2.2 0x00100000の行 12 | - 誤:`EfiConvensionalMemory` 13 | - 正:`EfiConventionalMemory` 14 | - p.54 第5段落の5行目 15 | - 誤:4億程度 16 | - 正:43億程度 17 | - p.58 リスト2.8 18 | - 1行目は空白1個分しかインデントされていないが、以下の通り、2行目以降と揃えて、空白2個でインデントするのが正しい。 19 | ``` 20 | ␣␣CHAR8 memmap_buf[4096 * 4]; 21 | ␣␣struct MemoryMap memmap = {sizeof(memmap_buf), memmap_buf, 0, 0, 0, 0}; 22 | ␣␣…… 23 | ``` 24 | - p.73 第4段落直後のコマンド 25 | - 誤: 26 | ``` 27 | $ cd $HOME/workspace/mikanos/kernel 28 | $ git checkout osbook_day03a 29 | ``` 30 | - 正: 31 | ``` 32 | $ cd $HOME/workspace/mikanos 33 | $ git checkout osbook_day03a 34 | $ cd kernel 35 | ``` 36 | - p.108 表4.4タイトル 37 | - 誤:クラスのvtable 38 | - 正:`Base`クラスのvtable 39 | - p.119 第1段落の6行目 40 | - 誤:「1.2 結局何をやったのか」を参照 41 | - 正:「1.5 結局、何をやったのか?」を参照 42 | - p.140 第5段落の6行目 43 | - 誤:eXtended Host Controller Interface 44 | - 正:eXtensible Host Controller Interface 45 | - p.215 第3段落の1行目 46 | - 誤:**リスト 9.1** 1 に 47 | - 正:**リスト 9.11** に 48 | - p.255 第2段落の1行目 49 | - 誤:`Layer::Draw()` に対して描画範囲を指定 50 | - 正:`Layer::DrawTo()` に対して描画範囲を指定 51 | - p.255 第2段落の2行目 52 | - 誤:`Layer::Draw()` 側を改造 53 | - 正:`Layer::DrawTo()` 側を改造 54 | - p.442 図19.2の右から2つ目の枠 55 | - 誤:`PD[0]` … `PDP[511]` 56 | - 正:`PD[0]` … `PD[511]` 57 | - p.443 図19.3(図19.2と同様の修正) 58 | - 誤:`PD[0]` … `PDP[511]` 59 | - 正:`PD[0]` … `PD[511]` 60 | - p.443 図19.3中段 61 | - 誤:`PG` 62 | - 正:`PD` 63 | - p.468 第1段落の1行目 64 | - 誤:108バイト 65 | - 正:104バイト 66 | - p.490 リスト21.3 67 | - 誤:cconst 68 | - 正:const 69 | - p.586 リスト25.3タイトル 70 | - 誤:(terminal.cpp) 71 | - 正:(fat.cpp) 72 | - p.726 リストC.3の2行目 73 | - その他の行と字間を揃える(均等割付をやめ、左詰めにする) 74 | - 誤:`␣␣␣U e f i A p p ……` 75 | - 正:`␣␣UefiApp……` 76 | - 字間を揃えた結果、インデントが半角空白2個となり、3行目(`␣␣UefiLib`)と揃うのが正しい 77 | -------------------------------------------------------------------------------- /errata/first_3suri.md: -------------------------------------------------------------------------------- 1 | # 初版第3刷の正誤情報 2 | 3 | 重要な誤植が見つかり次第掲載していきます。些細な正誤情報も含めたリストは [初版第3刷の正誤情報(すべて)](first_3suri_all.md) をご覧ください。 4 | 5 | - p.73 第4段落直後のコマンド 6 | - 誤: 7 | ``` 8 | $ cd $HOME/workspace/mikanos/kernel 9 | $ git checkout osbook_day03a 10 | ``` 11 | - 正: 12 | ``` 13 | $ cd $HOME/workspace/mikanos 14 | $ git checkout osbook_day03a 15 | $ cd kernel 16 | ``` 17 | - p.228 第3段落の1行目 18 | - 誤:直後に `Initial Count` レジスタの値を読み出すことで 19 | - 正:直後に `Current Count` レジスタの値を読み出すことで 20 | - p.255 第2段落の1行目 21 | - 誤:`Layer::Draw()` に対して描画範囲を指定 22 | - 正:`Layer::DrawTo()` に対して描画範囲を指定 23 | - p.255 第2段落の2行目 24 | - 誤:`Layer::Draw()` 側を改造 25 | - 正:`Layer::DrawTo()` 側を改造 26 | -------------------------------------------------------------------------------- /errata/first_3suri_all.md: -------------------------------------------------------------------------------- 1 | # 初版第3刷の正誤情報(すべて) 2 | 3 | 重要な正誤情報だけをまとめたリストは [初版第3刷の正誤情報](first_3suri.md) にあります。 4 | 5 | - p.54 表2.2 0x00001000の行 6 | - 誤:`EfiConvensionalMemory` 7 | - 正:`EfiConventionalMemory` 8 | - p.54 表2.2 0x00100000の行 9 | - 誤:`EfiConvensionalMemory` 10 | - 正:`EfiConventionalMemory` 11 | - p.54 第5段落の5行目 12 | - 誤:4億程度 13 | - 正:43億程度 14 | - p.73 第4段落直後のコマンド 15 | - 誤: 16 | ``` 17 | $ cd $HOME/workspace/mikanos/kernel 18 | $ git checkout osbook_day03a 19 | ``` 20 | - 正: 21 | ``` 22 | $ cd $HOME/workspace/mikanos 23 | $ git checkout osbook_day03a 24 | $ cd kernel 25 | ``` 26 | - p.119 第1段落の6行目 27 | - 誤:「1.2 結局何をやったのか」を参照 28 | - 正:「1.5 結局、何をやったのか?」を参照 29 | - p.140 第5段落の6行目 30 | - 誤:eXtended Host Controller Interface 31 | - 正:eXtensible Host Controller Interface 32 | - p.228 第3段落の1行目 33 | - 誤:直後に `Initial Count` レジスタの値を読み出すことで 34 | - 正:直後に `Current Count` レジスタの値を読み出すことで 35 | - p.255 第2段落の1行目 36 | - 誤:`Layer::Draw()` に対して描画範囲を指定 37 | - 正:`Layer::DrawTo()` に対して描画範囲を指定 38 | - p.255 第2段落の2行目 39 | - 誤:`Layer::Draw()` 側を改造 40 | - 正:`Layer::DrawTo()` 側を改造 41 | - p.468 第1段落の1行目 42 | - 誤:108バイト 43 | - 正:104バイト 44 | - p.490 リスト21.3 45 | - 誤:cconst 46 | - 正:const 47 | - p.586 リスト25.3タイトル 48 | - 誤:(terminal.cpp) 49 | - 正:(fat.cpp) 50 | -------------------------------------------------------------------------------- /errata/first_4suri.md: -------------------------------------------------------------------------------- 1 | # 初版第4刷の正誤情報 2 | 3 | 重要な誤植が見つかり次第掲載していきます。些細な正誤情報も含めたリストは [初版第4刷の正誤情報(すべて)](first_4suri_all.md) をご覧ください。 4 | 5 | まだ重要な誤植は見つかっていません 6 | -------------------------------------------------------------------------------- /errata/first_4suri_all.md: -------------------------------------------------------------------------------- 1 | # 初版第4刷の正誤情報(すべて) 2 | 3 | 重要な正誤情報だけをまとめたリストは [初版第4刷の正誤情報](first_4suri.md) にあります。 4 | 5 | - p.490 リスト21.3 6 | - 誤:cconst 7 | - 正:const 8 | -------------------------------------------------------------------------------- /errata/first_5suri.md: -------------------------------------------------------------------------------- 1 | # 初版第5刷の正誤情報 2 | 3 | 重要な誤植が見つかり次第掲載していきます。些細な正誤情報も含めたリストは [初版第5刷の正誤情報(すべて)](first_5suri_all.md) をご覧ください。 4 | 5 | まだ重要な誤植は見つかっていません 6 | -------------------------------------------------------------------------------- /errata/first_5suri_all.md: -------------------------------------------------------------------------------- 1 | # 初版第5刷の正誤情報(すべて) 2 | 3 | 重要な正誤情報だけをまとめたリストは [初版第5刷の正誤情報](first_5suri.md) にあります。 4 | 5 | - p.490 リスト21.3 6 | - 誤:cconst 7 | - 正:const 8 | -------------------------------------------------------------------------------- /faq.md: -------------------------------------------------------------------------------- 1 | # FAQ(よくある質問とその回答) 2 | 3 | よく聞かれる質問とその回答をまとめます。読者の皆さんが質問するときは Issues にお願いします。 4 | 5 | ## 開発環境はなんですか? 6 | 7 | 本書が想定しているのは x86-64 版の Ubuntu です。Windows(WSL)上で動かした Ubuntu にも対応しています。ビルドに Nasm や LLVM を使うので、それらが動作する環境が必要です。Docker を使った開発は未検証です。 8 | 9 | 開発ツールを Ubuntu にインストールするためのスクリプトを https://github.com/uchan-nos/mikanos-build で公開しています。このスクリプトは Ansible で動作するようになっていて、中身は APT で Nasm や LLVM などをインストールしたり、EDK II をダウンロードしたり、設定ファイルに設定を追加したりします。Ansible を用いず、スクリプトの内容と同等の手順を手動で実行すれば Ubuntu 以外のディストリビューションにも開発環境を整えられるかもしれません。 10 | 11 | ## Mac でも開発できる? 12 | 13 | 筆者は未検証ですが、読者の方がやり方を調査してまとめてくださっています。Intel CPU でも Apple Silicon でも(少なくとも 2 章前半までは)動作するようです。 14 | Mac での開発環境の整え方は [いろんな環境でビルド、実行する方法に関するリンク集](https://github.com/uchan-nos/os-from-zero/wiki#%E3%81%84%E3%82%8D%E3%82%93%E3%81%AA%E7%92%B0%E5%A2%83%E3%81%A7%E3%83%93%E3%83%AB%E3%83%89%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%83%AA%E3%83%B3%E3%82%AF%E9%9B%86) を参考にしてください。 15 | 16 | ※筆者も、各記事の作者も、記事に記載された手順で絶対に動作するという保証はしていません。自己責任でお試しください。 17 | 18 | ## 自作 OS を動かすにはパソコンの初期化が必要? 19 | 20 | いいえ、そんなことはありません。自作 OS をエミュレータ(QEMU)で動かす場合も、USB メモリにインストールして起動する場合も、パソコンに元々入っている環境を壊すようなことは、原則としてありません。安心して試してください。 21 | 22 | 原則として、というのは、例えば USB メモリに自作 OS をインストールするつもりが、誤って内蔵 SSD を上書きしてしまうかもしれません。あるいは、自作 OS にデバイスドライバを追加しようとして、プログラムが暴走して周辺機器を壊してしまう、というようなことが無いとは言えませんからね。(ある意味、周辺機器を壊せるレベルのデバイスドライバを書ければ、OS 自作人としては誇って良いと思いますけども) 23 | 24 | ## 本書を読み進めるのに C++ の経験が必要? 25 | 26 | いいえ。C++ の経験や知識がなくても、他のプログラミング言語の経験、知識があれば十分だろうと思います。それほど C++ の込み入った機能をばりばり使っているわけではありません。また、C++ 固有の知識はある程度本書の中で解説するように心がけました。 27 | 28 | プログラミング経験が一切無いと、本書のコードを理解するのは難しいかもしれません。もし、本書が初めてのプログラミング経験だ、という方は、本書を読んだ感想を聞かせていただけると筆者が喜びます。 29 | 30 | ## アセンブリ言語の知識は必要? 31 | 32 | いいえ、前提としていません。 33 | アセンブリ言語は必要最小限の量だけ登場しますが、アセンブリ言語を知らない前提で解説を書いてあるので、心配しないでください。 34 | もし本書の解説だけでは分からない場合でも、必要に応じて調べていくのがお勧めです。 35 | 36 | ## 理解できるか不安です 37 | 38 | 本書は、ちょっとずつ解説&実装して実行するという流れで進んでいきます。 39 | とりあえず理解できるところまで進むということが可能です。 40 | 完成形がどーんと示され、その各部分を説明するという形式に比べて、全体がまったく分からないという可能性が低くなっています。 41 | 42 | ## Raspberry Pi でも動作する? 43 | 44 | いいえ、できません。 45 | 本書で作る OS は x86-64 アーキテクチャ専用の OS です。 46 | x86-64 を採用した Intel Core シリーズや AMD Ryzen などの CPU が搭載されたパソコンが必要です。 47 | 48 | Raspberry Pi は ARM という CPU が搭載されており、MikanOS は動作しません。 49 | 50 | ## FAT32 ではなく exFAT でフォーマットする理由は? 51 | 52 | 図1.8 で exFAT を選んでいるのは、筆者の環境では FAT32 が選択肢に無かったからです。 53 | 54 | ここでの要旨は「NTFS を選ばない」ということであって、「FAT32 ではなく exFAT を選べ」ということではありません。 55 | exFAT でフォーマットすると起動できないけど、FAT32 では正常に起動した、という報告を複数いただいていますので、FAT32 を選ぶ方が安全かなと思います。 56 | 57 | Windows はどうやら、FAT32 でフォーマットできるサイズの上限を 32GB までとしているようで、筆者がその時使った 64GB の USB メモリでは FAT32 が選択肢に出ませんでした。 58 | 59 | ## ln -s コマンドでリンクの修正ができません 60 | 61 | 本書では $HOME/edk2 に MikanLoaderPkg という名前のシンボリックリンクを作ります。 62 | `ln -s` の引数を打ち間違うなど、意図しないリンクを作成してしまった場合、再度同じコマンドを実行してもエラーになってしまいます。 63 | 64 | 解決方法は [これだけは知っておきたい Linux コマンド の rm の節](https://github.com/uchan-nos/os-from-zero/wiki/Basic-Linux-Commands#rm) を読んでください。 65 | 66 | ## Linux の各種コマンドの意味は何ですか? 67 | 68 | ls や cd、ln など、本書で使用するコマンドや相対パス、変数といった概念などの説明をまとめていますので、確認してください。 [これだけは知っておきたい Linux コマンド](https://github.com/uchan-nos/os-from-zero/wiki/Basic-Linux-Commands) 69 | 70 | ## RegisterFilterLib 関係のエラーで MikanLoaderPkg がビルドできません 71 | 72 | EDK II で MikanLoaderPkg をビルドしようとしても次のようなエラーが出ることがあります。 73 | 74 | /home/uchan/edk2/MikanLoaderPkg/MikanLoaderPkg.dsc(...): error 4000: Instance of library class [RegisterFilterLib] is not found 75 | in [/home/uchan/edk2/MdePkg/Library/BaseLib/BaseLib.inf] [X64] 76 | consumed by module [/home/uchan/edk2/MikanLoaderPkg/Loader.inf] 77 | 78 | エラーの解消方法は主に 2 つあります。 79 | 80 | 1. 古い EDK II を使う方法 81 | - 2021/04/08 にエラーの原因となる変更が EDK II に導入されたので、それ以前のバージョンを使うことでエラーを回避できます。 82 | - 具体的には次のコマンドを実行します。 83 | ``` 84 | $ cd $HOME/edk2 85 | $ git checkout 38c8be123aced4cc8ad5c7e0da9121a181b94251 86 | ``` 87 | 2. MikanLoaderPkg.dsc に RegisterFilterLib を追加する方法 88 | - MikanLoaderPkg.dsc を修正すれば最新の EDK II でビルドできるようになります。 89 | - 変更の内容 https://github.com/uchan-nos/mikanos/commit/b5f7740c04002e67a95af16a5c6e073b664bf3f5 90 | - kernel/Makefile の修正は Clang 14 に対応するための記述であり、RegisterFilterLib のエラーとは関係ありません。 91 | -------------------------------------------------------------------------------- /mikanos-bugs.md: -------------------------------------------------------------------------------- 1 | ## MikanOS のバグ修正方針 2 | 3 | MikanOS の特定のタグ(osdook_dayX)に存在するバグは修正されません。その代わり、バグ報告の中で重要なものはこのページに掲載されます。 4 | タグに対して修正を行うと、Git のコミット履歴を修正する必要が生じ、すでに mikanos リポジトリを clone した人に悪影響が出るからです。 5 | 6 | master ブランチの最新コミットに存在するバグは、修正される可能性があります。 7 | master ブランチに対するバグ報告は、サポートサイトの Issues ではなく、できるだけ mikanos リポジトリの Issues に投稿してください。 8 | 9 | ## MikanOS に存在する既知のバグ 10 | 11 | - osbook_day15b ~ osbook_day16f: [osbook_day15b で実行後すぐにTaskBウィンドウが消える](https://github.com/uchan-nos/os-from-zero/issues/42) 12 | - osbook_day06b: [ScanAllBus() で function=0 から探索すべき](https://github.com/uchan-nos/os-from-zero/issues/58) 13 | -------------------------------------------------------------------------------- /ref-latest.md: -------------------------------------------------------------------------------- 1 | # 最新の文献 URL 2 | 3 | 本書の参考文献ページ(p.736、p.737)に記載されている URL の変更をトラッキングするページです。 4 | 誤植ではありませんので本文を修正するのではなく、このページにて最新の URL を記録することとします。 5 | 6 | 1. 30 日でできる! OS 自作入門 7 | - https://book.mynavi.jp/ec/products/detail/id=22078 8 | 2. Unified Extensible Firmware Interface Specification Version 2.8 9 | - https://www.uefi.org/specifications 10 | 3. Intel 64 and IA-32 Architectures Software Developer's Manual 11 | - https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html 12 | 4. QEMU/Monitor 13 | - https://en.wikibooks.org/wiki/QEMU/Monitor 14 | 5. System V Application Binary Interface - DRAFT 15 | - https://refspecs.linuxfoundation.org/elf/gabi4+/contents.html 16 | 6. System V Application Binary Interface AMD64 Architecture Processor Supplement 17 | - https://software.intel.com/content/dam/develop/external/us/en/documents/mpx-linux64-abi.pdf 18 | 7. GNU Make 第3 版 19 | - https://www.oreilly.co.jp/library/4873112699/ 20 | 8. リンカ・ローダ実践開発テクニック 21 | - https://shop.cqpub.co.jp/hanbai/books/38/38071.html 22 | 9. Intel 7 Series / C216 Chipset Family Platform Controller Hub Datasheet 23 | - https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/7-series-chipset-pch-datasheet.pdf 24 | 10. The PCI ID Repository 25 | - https://pci-ids.ucw.cz/ 26 | 11. C++ Concurrency in Action, Second Edition 27 | - https://www.manning.com/books/c-plus-plus-concurrency-in-action-second-edition 28 | 12. Advanced Configuration and Power Interface Specification Version 6.3 29 | - https://www.uefi.org/specifications 30 | 13. Universal Serial Bus HID Usage Tables Version 1.12 31 | - https://www.usb.org/sites/default/files/hut1_21_0.pdf 32 | 14. Universal Serial Bus Device Class Definition for Human Interface Devices Version 1.11 33 | - https://www.usb.org/sites/default/files/hid1_11.pdf 34 | 15. Microsoft Extensible Firmware Initiative FAT32 File System Specification 35 | - http://download.microsoft.com/download/0/8/4/084C452B-B772-4FE5-89BB-A0CBF082286A/fatgen103.doc 36 | 16. EDK II Platform Description (DSC) File Specification 37 | - https://edk2-docs.gitbook.io/edk-ii-dsc-specification/ 38 | 17. EDK II Module Information (INF) File Specification 39 | - https://edk2-docs.gitbook.io/edk-ii-inf-specification/ 40 | -------------------------------------------------------------------------------- /toc.md: -------------------------------------------------------------------------------- 1 | # 「ゼロからのOS自作入門」の目次 2 | 3 | ## はじめに 4 | 5 | ## 第0章 OSって個人で作れるの? 6 | 7 | - 0.1 OS の作り方 8 | - 0.2 そもそもOSって何? 9 | - コラム0.1 OSの仕様とPOSIX 10 | - 0.3 OS自作の手順 11 | - 0.4 OS自作の楽しみ方 12 | - 0.5 OS 自作の全体像 13 | 14 | ## 第1章 PCの仕組みとハローワールド 15 | 16 | - 1.1 ハローワールド 17 | - 1.2 USBメモリのデバイス名の探し方 18 | - 1.3 WSLでのやり方 19 | - 1.4 エミュレータでのやり方 20 | - 1.5 結局、何をやったのか? 21 | - 1.6 とにかく手を動かそう 22 | - 1.7 UEFI BIOSによる起動 23 | - 1.8 OSを作る道具 24 | - 1.9 C言語でハローワールド 25 | - コラム1.1 PEとCOFFとELF 26 | 27 | ## 第2章 EDK II入門とメモリマップ 28 | 29 | - 2.1 EDK II入門 30 | - 2.2 EDK IIでハローワールド(osbook_day02a) 31 | - コラム2.1 インクルード 32 | - 2.3 メインメモリ 33 | - 2.4 メモリマップ 34 | - 2.5 メモリマップの取得(osbook_day02b) 35 | - 2.6 メモリマップのファイルへの保存 36 | - 2.7 メモリマップの確認 37 | - 2.8 ポインタ入門(1):アドレスとポインタ 38 | - 2.9 ポインタとアロー演算子 39 | - コラム2.2 ポインタのポインタ 40 | 41 | ## 第3章 画面表示の練習とブートローダ 42 | 43 | - 3.1 QEMU モニタ 44 | - 3.2 レジスタ 45 | - 3.3 初めてのカーネル(osbook_day03a) 46 | - コラム3.1 レッドゾーン 47 | - 3.4 ブートローダからピクセルを描く(osbook_day03b) 48 | - 3.5 カーネルからピクセルを描く(osbook_day03c) 49 | - 3.6 エラー処理をしよう(osbook_day03d) 50 | - コラム3.2 ポインタのキャスト 51 | - 3.7 ポインタ入門(2):ポインタとアセンブリ言語 52 | 53 | ## 第4章 ピクセル描画とmake入門 54 | 55 | - 4.1 make 入門(osbook_day04a) 56 | - 4.2 ピクセルを自在に描く(osbook_day04b) 57 | - コラム4.1 ABI 58 | - 4.3 C++の機能を使って書き直す(osbook_day04c) 59 | - コラム4.2 コンパイルエラーはお友達 60 | - 4.4 vtable 61 | - 4.5 ローダを改良する(osbook_day04d) 62 | 63 | ## 第5章 文字表示とコンソールクラス 64 | 65 | - 5.1 文字を書いてみる(osbook_day05a) 66 | - コラム5.1 参照とポインタ 67 | - 5.2 分割コンパイル(osbook_day05b) 68 | - 5.3 フォントを増やそう(osbook_day05c) 69 | - 5.4 文字列描画と`sprintf()`(osbook_day05d) 70 | - 5.5 コンソールクラス(osbook_day05e) 71 | - 5.6 `printk()`(osbook_day05f) 72 | 73 | ## 第6章 マウス入力とPCI 74 | 75 | - 6.1 マウスカーソル(osbook_day06a) 76 | - 6.2 USBホストドライバ 77 | - 6.3 PCIデバイスの探索(osbook_day06b) 78 | - 6.4 ポーリングでマウス入力(osbook_day06c) 79 | - コラム6.1 ログ関数 80 | - コラム6.2 `static_cast(0xf)`の謎 81 | 82 | ## 第7章 割り込みとFIFO 83 | 84 | - 7.1 割り込み(osbook_day07a) 85 | - 7.2 割り込みハンドラ 86 | - 7.3 割り込みベクタ 87 | - 7.4 割り込み記述子の設定 88 | - 7.5 MSI割り込み 89 | - 7.6 割り込みのまとめ 90 | - 7.7 割り込みハンドラの高速化(osbook_day07b) 91 | - 7.8 FIFOとFILO 92 | - 7.9 キューの実装 93 | - 7.10 キューを使った割り込み高速化 94 | 95 | ## 第8章 メモリ管理 96 | 97 | - 8.1 メモリ管理 98 | - 8.2 UEFIメモリマップ(osbook_day08a) 99 | - 8.3 データ構造の移動(osbook_day08b) 100 | - 8.4 スタック領域の移動 101 | - 8.5 セグメンテーションの設定 102 | - 8.6 ページングの設定 103 | - 8.7 メモリ管理に挑戦(osbook_day08c) 104 | 105 | ## 第9章 重ね合わせ処理 106 | 107 | - 9.1 重ね合わせ処理(osbook_day09a) 108 | - 9.2 new演算子 109 | - 9.3 重ね合わせ処理の原理 110 | - コラム9.1 スマートポインタ 111 | - 9.4 重ね合わせ処理の時間計測(osbook_day09b) 112 | - 9.5 重ね合わせ処理の高速化(osbook_day09c) 113 | - 9.6 スクロール処理の時間計測(osbook_day09d) 114 | - 9.7 スクロール処理の高速化(osbook_day09e) 115 | 116 | ## 第10章 ウィンドウ 117 | 118 | - 10.1 もっとマウス(osbook_day10a) 119 | - 10.2 はじめてのウィンドウ(osbook_day10b) 120 | - 10.3 高速カウンタ(osbook_day10c) 121 | - 10.4 チラチラ解消(osbook_day10d) 122 | - 10.5 バックバッファ(osbook_day10e) 123 | - 10.6 ウィンドウのドラッグ移動(osbook_day10f) 124 | - 10.7 ウィンドウだけドラッグ移動(osbook_day10g) 125 | 126 | ## 第11章 タイマとACPI 127 | 128 | - 11.1 ソースコード整理(osbook_day11a) 129 | - 11.2 タイマ割り込み(osbook_day11b) 130 | - 11.3 細かく時間を計る(osbook_day11c) 131 | - コラム11.1 volatileの必要性 132 | - 11.4 複数のタイマとタイムアウト通知(osbook_day11d) 133 | - 11.5 ACPI PMタイマとRSDP(osbook_day11e) 134 | 135 | ## 第12章 キー入力 136 | 137 | - 12.1 FADTを探す(osbook_day12a) 138 | - 12.2 ACPI PMタイマを使う(osbook_day12b) 139 | - 12.3 USB キーボードドライバ(osbook_day12c) 140 | - 12.4 モディファイアキー(osbook_day12d) 141 | - 12.5 テキストボックス(osbook_day12e) 142 | - 12.6 カーソル(osbook_day12f) 143 | 144 | ## 第13章 マルチタスク(1) 145 | 146 | - 13.1 マルチタスクとコンテキスト 147 | - 13.2 コンテキストの切り替えに挑戦(osbook_day13a) 148 | - コラム13.1 x86-64アーキテクチャとスタックのアライメント制約 149 | - 13.3 コンテキストスイッチの自動化(osbook_day13b) 150 | - 13.4 マルチタスクの検証(osbook_day13c) 151 | - 13.5 タスクを増やす(osbook_day13d) 152 | 153 | ## 第14章 マルチタスク(2) 154 | 155 | - 14.1 スリープしてみる(osbook_day14a) 156 | - 14.2 イベントが来たら起床する(osbook_day14b) 157 | - 14.3 性能測定 158 | - 14.4 タスクに優先度を付ける(osbook_day14c) 159 | - 14.5 アイドルタスク(osbook_day14d) 160 | 161 | ## 第15章 ターミナル 162 | 163 | - 15.1 ウィンドウ描画はメインスレッドで(osbook_day15a) 164 | - 15.2 アクティブウィンドウ(osbook_day15b) 165 | - コラム15.1 タイトルに`std::string`を使う理由 166 | - 15.3 ターミナルウィンドウ(osbook_day15c) 167 | - 15.4 描画の高速化(osbook_day15d) 168 | 169 | ## 第16章 コマンド 170 | 171 | - 16.1 ターミナルでキー入力(osbook_day16a) 172 | - 16.2 echoコマンド(osbook_day16b) 173 | - 16.3 clearコマンド(osbook_day16c) 174 | - 16.4 lspciコマンド(osbook_day16d) 175 | - 16.5 コマンド履歴(osbook_day16e) 176 | - 16.6 省電力化(osbook_day16f) 177 | 178 | ## 第17章 ファイルシステム 179 | 180 | - 17.1 ファイルとファイルシステム 181 | - 17.2 BIOSパラメータブロック 182 | - 17.3 ディレクトリエントリ 183 | - 17.4 ボリュームを読み出す(osbook_day17a) 184 | - コラム17.1 ボリュームの読み込みは16MiBで足りるか 185 | - 17.5 lsコマンド(osbook_day17b) 186 | 187 | ## 第18章 アプリケーション 188 | 189 | - 18.1 ファイルアロケーションテーブル(osbook_day18a) 190 | - 18.2 初アプリ(osbook_day18b) 191 | - 18.3 C++で計算機(osbook_day18c) 192 | - 18.4 標準ライブラリ(osbook_day18d) 193 | 194 | ## 第19章 ページング 195 | 196 | - 19.1 実行ファイルとメモリアドレス 197 | - 19.2 アドレス変換 198 | - コラム19.1 事実上のアドレス 199 | - 19.3 アプリのロードと実行(osbook_day19a) 200 | - 19.4 仮想アドレスと4階層ページング 201 | - 19.5 アプリケーションを後半で動かす 202 | - 19.6 アプリケーションのロード 203 | - 19.7 階層ページング構造の設定 204 | - 19.8 階層ページング構造の片付け 205 | - コラム19.2 構造化束縛 206 | 207 | ## 第20章 システムコール 208 | 209 | - 20.1 アプリがOSの機能を使う方法(osbook_day20a) 210 | - 20.2 OSを守ろう(1)(osbook_day20b) 211 | - 20.3 TSSを設定しよう(osbook_day20c) 212 | - 20.4 バグ発見を手伝おう(osbook_day20d) 213 | - 20.5 システムコール(osbook_day20e) 214 | - 20.6 システムコールの登録処理 215 | - 20.7 システムコールの本体 216 | 217 | ## 第21章 アプリからウィンドウ 218 | 219 | - 21.1 IST を設定しよう(osbook_day21a) 220 | - 21.2 文字列表示システムコール(osbook_day21b) 221 | - 21.3 システムコールの作成 222 | - 21.4 `write()`の作成 223 | - 21.5 終了システムコール(osbook_day21c) 224 | - 21.6 スタックポインタの復帰 225 | - 21.7 コード整理(osbook_day21d) 226 | - 21.8 ウィンドウを開く(osbook_day21e) 227 | - 21.9 ウィンドウに文字を書く(osbook_day21f) 228 | 229 | ## 第22章 グラフィックとイベント(1) 230 | 231 | - 22.1 `exit()`を使う(osbook_day22a) 232 | - 22.2 点を描く(osbook_day22b) 233 | - 22.3 タイマ値の取得(osbook_day22c) 234 | - 22.4 ウィンドウ描画の最適化(osbook_day22d) 235 | - 22.5 線を引く(osbook_day22e) 236 | - 22.6 ウィンドウのクローズ(osbook_day22f) 237 | - 22.7 キー入力を待つ(osbook_day22g) 238 | 239 | ## 第23章 グラフィックとイベント(2) 240 | 241 | - 23.1 マウス入力(osbook_day23a) 242 | - 23.2 お絵描きソフト(osbook_day23b) 243 | - 23.3 タイマコマンド(osbook_day23c) 244 | - 23.4 アニメーション(osbook_day23d) 245 | - 23.5 ブロック崩しゲーム(osbook_day23e) 246 | 247 | ## 第24章 複数のターミナル 248 | 249 | - 24.1 ターミナルを増やす(osbook_day24a) 250 | - 24.2 カーソル点滅を自分で(osbook_day24b) 251 | - 24.3 複数アプリの同時起動(osbook_day24c) 252 | - 24.4 ウィンドウの重なりのバグ修正(osbook_day24d) 253 | - 24.5 ターミナル無しのアプリ起動(osbook_day24e) 254 | - 24.6 OSをフリーズさせるアプリ(osbook_day24f) 255 | - 24.7 OSを守ろう(2)(osbook_day24g) 256 | 257 | ## 第25章 アプリでファイル読み込み 258 | 259 | - 25.1 ディレクトリ対応(osbook_day25a) 260 | - 25.2 ファイル読み込み(osbook_day25b) 261 | - 25.3 正規表現検索(osbook_day25c) 262 | 263 | ## 第26章 アプリでファイル書き込み 264 | 265 | - 26.1 標準入力(osbook_day26a) 266 | - 26.2 ファイルディスクリプタの抽象化 267 | - 26.3 キーボード入力を受け取る 268 | - 26.4 EOFとEOT(osbook_day26b) 269 | - 26.5 ファイル書き込み(1)(osbook_day26c) 270 | - 26.6 ファイル書き込み(2)(osbook_day26d) 271 | 272 | ## 第27章 アプリのメモリ管理 273 | 274 | - 27.1 デマンドページング(osbook_day27a) 275 | - 27.2 メモリマップトファイル(osbook_day27b) 276 | - 27.3 メモリ使用量を測ろう(osbook_day27c) 277 | - 27.4 コピーオンライト(osbook_day27d) 278 | 279 | ## 第28章 日本語表示とリダイレクト 280 | 281 | - 28.1 日本語と文字コード(osbook_day28a) 282 | - 28.2 日本語フォント(osbook_day28b) 283 | - 28.3 リダイレクト(osbook_day28c) 284 | 285 | ## 第29章 アプリ間通信 286 | 287 | - 29.1 終了コード(osbook_day29a) 288 | - 29.2 パイプ(osbook_day29b) 289 | - 29.3 コマンドラインの解析とタスクの起動 290 | - 29.4 パイプ処理の本体PipeDescriptor 291 | - 29.5 ターミナルの起動と終了 292 | - 29.6 タスクの終了 293 | - 29.7 sortコマンド(osbook_day29c) 294 | - 29.8 ターミナルのバグ修正(osbook_day29d) 295 | - 29.9 共有メモリ 296 | 297 | ## 第30章 おまけアプリ 298 | 299 | - 30.1 アプリにパスを通す(osbook_day30a) 300 | - 30.2 moreコマンド(osbook_day30b) 301 | - 30.3 catを入力に対応させる(osbook_day30c) 302 | - 30.4 閉じるボタン(osbook_day30d) 303 | - 30.5 テキストビューア(osbook_day30e) 304 | - 30.6 画像ビューア(osbook_day30f) 305 | 306 | ## 第31章 これからの道 307 | 308 | ## 付録A 開発環境のインストール 309 | 310 | - A.1 WSLのインストール 311 | - A.2 WSLでQEMUを使う準備 312 | 313 | ## 付録B MikanOSの入手 314 | 315 | - B.01 MikanOSのバージョン間の差分確認 316 | - B.02 ソースコードの検索 317 | 318 | ## 付録C EDK IIのファイル説明 319 | 320 | ## 付録D C++のテンプレート 321 | 322 | ## 付録E iPXE 323 | 324 | - E.01 iPXEのビルドとインストール 325 | - E.02 HTTPサーバの起動 326 | - E.03 ネットワーク起動の実践 327 | 328 | ## 付録F ASCIIコード表 329 | 330 | ## 参考文献 331 | 332 | ## 謝辞 333 | --------------------------------------------------------------------------------