レガシーフリーOS
に必要な要素技術
「はりぼてOS」との違い
2019/11/23 OSC Tokyo/Fall
@uchan_nos
自己紹介
• 内田公太 @uchan_nos
• サイボウズ株式会社 SREチーム
• 東京工業大学 特任助教
• 自作OSもくもく会コアメンバー
• 『30日でできる! OS自作入門』
の校正を担当
• 『自作エミュレータで学ぶ
x86アーキテクチャ』の著者
305 でブース展示中
MikanOS
• 2017年から作っているレガシーフリーOS
• 教育用OS
• 大学などの講義で採用たらいいなあ
• レガシーフリー
• UEFI,64bit,USBマウス,Local APICタイマー
• https://github.com/uchan-nos/mikanos
MikanOSデモ
xHCIに苦戦
2017年夏
~
2018年夏
https://twitter.com/uchan_nos/status/1143512289741398019?s=20
https://twitter.com/uchan_nos/status/895420177776467968?s=20
レイヤー
の導入
https://twitter.com/uchan_nos/status/1153654947671494656?s=20
ウィンドウ
とタイマー
https://twitter.com/uchan_nos/status/1166562041945120768?s=20
アクティブ
ウィンドウ
https://twitter.com/uchan_nos/status/1174314614202363905?s=20
cat & ls
https://twitter.com/uchan_nos/status/1183936387277410306?s=20
Paging &
Application
https://twitter.com/uchan_nos/status/1192614799370153984
OSとは
• Operating System
Microsoft Windows 10 のスクリーンショット
有名な
自作OSたち
http://z-slash.net/os/osask/osask.png
OSASK
Mona OS
https://a.fsdn.com/con/app/proj/monaos/screenshots/90657.jpg
はりぼてOS
http://hrb.osask.jp/figures.html
自作OSはほぼすべてレガシー
• 2000年代に作られた自作OS群はほとんどレガ
シーなハードウェア前提
• MITのxv6も例外ではない
• 今「OS自作」を始める人も大体レガシーOSか
ら始める
• 有名な教科書「30日でできる!OS自作入門」が解
説するのがレガシーOSだから
はりぼてOSの構成要素
機能名 規格
BIOS レガシー
記憶装置 フロッピーディスク
CPUアーキテクチャ x86 (32 ビットモード)
割り込み PIC (Intel 8259A)
キーボード・マウス KBC (Intel 8042)
メモリ管理 セグメンテーション
タイマー PIT (Intel 8254)
システムコール INT命令
レガシーOSが動かなくなる
• 2020年、ついにIntelのx86でDOSが動作しなくなる
~UEFIからレガシーBIOS互換を削除
• https://pc.watch.impress.co.jp/docs/news/1092273.html
• 現代のパソコンのBIOS:UEFI BIOS
• UEFIのCSM (Compatibility Support Module)により,
レガシーBIOS互換環境が提供されていた
• 2020年以降,CSMが消え去る
レガシーOSが動かなくなる
• 現代における自作OSの難しさ 〜自作OSのいまと昔
• https://knowledge.sakura.ad.jp/22963/
• 自作OS環境を取り巻く変化を紹介
• BIOS: レガシー → UEFI
• CPU: シングルコア → マルチコア
• 命令セット: x86 → x86-64
• 入力: PS/2 → USB HID
• タイマー: PIT → Local APICタイマー,HPET
有名な
自作OSたち
http://z-slash.net/os/osask/osask.png
OSASK
Mona OS
https://a.fsdn.com/con/app/proj/monaos/screenshots/90657.jpg
はりぼてOS
http://hrb.osask.jp/figures.html実機で
起動しなくなる!
osdev-jp の紹介
• http://osdev.jp/
• 自作OS,低レイヤ技術のコミュ
• 強力な人々が在籍
• x86-64の仕様に詳しい人
• USB(xHCI)の仕様に詳しい人
• マルチコアを制御して遊んでる人
• RustでOS書いてる人
• x86-64,USB(xHCI)の詳しさに関
しては日本一なのではないか?
セキュリティキャンプの紹介
• 第一線で活躍する講師が
• 全国から集まった学生に
• セキュリティとプログラミングを教育する
• 宿泊費&交通費&食費 すべて支給のイベント
• 全国大会2019の公式サイト
https://www.ipa.go.jp/jinzai/camp/2019/zenkoku2019_index.html
OS開発ゼミ
• フルスクラッチOSを書こう!
• 最先端OS談義
• Linux開発者を目指そう!
• Raspberry Pi向け組み込みOSを作ろう!
x86-64やRaspberry向け
のOSを開発します
定員8人程度
レガシーフリー
• 機能の動的な検出(PnP)ができる
• レガシーデバイスは検出不能なものもある
• 0x3F8にCOMポートがある「はず」
• 省電力モードをサポートする
• 現行バス規格に準拠
• Intel 8042(PS/2接続KBC)はISA
• xHCI(USBホスト)はPCI
MikanOSの構成要素
機能名 旧規格 レガシーフリー規格
BIOS レガシ UEFI
記憶装置 FD USBメモリ
CPUアーキテクチャ x86 x86-64 (64 ビットモード)
割り込み PIC APIC, MSI
キーボード・マウス KBC USB HID
メモリ管理 segment 4階層ページング
タイマー PIT Local APICタイマー
システムコール INT命令 未定(多分syscall)
UEFI BIOS
• UEFI仕様を満たしたBIOS
• BIOSの世界に仕様がある… 幸せ!
• UEFIアプリ=PEバイナリ
• アプリにサイズ制限はない
• レガシーBIOSでは最大512バイト
• アプリをC言語で作れる
• 始めから64ビットモードで起動する
• ビット遷移処理を書かなくて済む
UEFIアプリの作り方
• EDK II で UEFI アプリケーションを作る
• https://osdev-jp.readthedocs.io/ja/latest/2017/create-uefi-app-with-edk2.html
• clang + lld でお手軽!UEFIアプリ開発
• https://docs.google.com/presentation/d/1ssu7KQEt1SMqizLlf-
iP6URZWMw1HTHtmHIhHRyW06w/edit?usp=sharing
• gnu-efiでUEFI遊びをはじめよう
• https://qiita.com/tnishinaga/items/40755f414557faf45dcb
x86-64 64ビットモード
• 64ビット化だけなら難しいことはあまり無い
• コンパイラが適切な機械語を出してくれる
• 64ビットモードでは4階層ページング必須
• セグメンテーションがほぼ廃止
• タスク切り替えに伴うレジスタ保存・復帰は自
動化されなくなった
x86-64の参考資料
• Intel® 64 and IA-32 Architectures Software
Developer’s Manual
• https://software.intel.com/en-us/articles/intel-sdm
• いわゆる”Intel SDM”
• x86-64向けのOSを書くなら必携資料
ACPI
Advanced Configuration and Power Interface
• 各種デバイスの設定,電源制御の規格
• デバイスの種類,レジスタのアドレス
• ACPI PMタイマーやHPETの存在確認,レジスタ位置
の取得など
• 電源断,スリープモードへの移行
• レガシーフリーを謳うならACPI対応は必須
ACPIの参考資料
• ACPI Specification
• https://uefi.org/specifications
• ACPI規格書とっかかり教室
• https://booth.pm/ja/items/1577122
• ACPI規格の初心者向け解説本
• Local APICタイマー入門
• https://uchan.booth.pm/items/1319521
• ACPI PMタイマーの使い方
USB: Universal Serial Bus
• パソコンがUSBホスト
• デバイスがUSBターゲット
• USBはターゲット側が楽なように作られてる
• ホスト側がめっちゃ大変
• マウスとキーボードだけのしょぼい実装で3300行
• OHCI/UHCI,EHCI,xHCI
• xHCIはUSB1.1,2.0,3.xに対応。
xHCIの参考資料
• USB 3.0 ホストドライバ自作入門
• https://uchan.booth.pm/items/1056355
• xHCIドライバの作り方を解説
• xHCI for Universal Serial Bus: Specification
• https://www.intel.co.jp/content/www/jp/ja/products/docs/io/universal-
serial-bus/extensible-host-controler-interface-usb-xhci.html
• xHCIドライバを書くなら必携の書
ホストコントローラ層
USB層
クラスドライバ層
APIC
Advanced Programmable Interrupt Controller
• PITはマザボで1つ
• APIC = IO APIC + Local APIC
• IO APICはマザボで1つ
• Local APICは各CPUコアに内蔵
• Intel SDMに説明がある
• APICなら各コアに割り込みを分配できる
http://editmax.eu/jak-se-
vyrabi-procesory-cpu/
MSI: Message Signaled Interrupt
• CPUに割り込みを通知する方法の一種
• PCIバスの標準機能
• 従来:INTxピンの信号変化で割り込み
• IO APICを経由しLocal APICに通知
• MSI:メモリ書き込みサイクルで割り込み
• Local APICに直接通知
• IO APICを知らなくて良い。楽。
MSI: Message Signaled Interrupt
ハードウェア
CPU
IO APIC
Local APIC
バス
MSI割り込み
メモリ書き込み
サイクルにより
割り込む
#INTxの信号変化
により割り込む
#INTx割り込み
PCIバス
• 現代のパソコンの中核を担うバス規格
• PCI: パラレルバス規格
• PCIe: シリアルバス規格
• 現代の主流。PCIとソフトウェア互換。
• xHCIはPCIで接続する前提の規格
PCIバスの参考資料
• PCI Memo - osdev.jp
• https://github.com/osdev-jp/osdev-
jp.github.io/wiki/PCI-Memo
• PCIコンフィグレーション空間
• PCIデバイスの列挙方法
• PCIバス&PCI-Xバスの徹底研究
• CQ出版 Interface編集部

レガシーフリーOSに必要な要素技術 legacy free os