├── 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.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 |
35 |
36 |
37 |
38 |
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 |
--------------------------------------------------------------------------------