1K Views
November 24, 19
スライド概要
UEFI BIOSやACPI,APIC,USBなどのレガシーフリーデバイスに対応したレガシーフリーOSを作成するのに必要な要素技術を解説。OpenSource Conference 2019 tokyo fall
サイボウズ・ラボ株式会社で教育向けのOSやCPU、コンパイラなどの研究開発をしています。
レガシーフリー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に苦戦 https://twitter.com/uchan_nos/status/895420177776467968?s=20 2017年夏 ~ 2018年夏 https://twitter.com/uchan_nos/status/1143512289741398019?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たち はりぼてOS OSASK http://hrb.osask.jp/figures.html http://z-slash.net/os/osask/osask.png Mona OS https://a.fsdn.com/con/app/proj/monaos/screenshots/90657.jpg
自作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たち OSASK 実機で はりぼてOS 起動しなくなる! http://hrb.osask.jp/figures.html http://z-slash.net/os/osask/osask.png Mona OS https://a.fsdn.com/con/app/proj/monaos/screenshots/90657.jpg
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開発ゼミ x86-64やRaspberry向け のOSを開発します 定員8人程度 • フルスクラッチOSを書こう! • 最先端OS談義 • Linux開発者を目指そう! • Raspberry Pi向け組み込みOSを作ろう!
レガシーフリー • 機能の動的な検出(PnP)ができる • レガシーデバイスは検出不能なものもある • 0x3F8にCOMポートがある「はず」 • 省電力モードをサポートする • 現行バス規格に準拠 • Intel 8042(PS/2接続KBC)はISA • xHCI(USBホスト)はPCI
MikanOSの構成要素 機能名 BIOS 記憶装置 CPUアーキテクチャ 割り込み キーボード・マウス メモリ管理 タイマー システムコール 旧規格 レガシ FD x86 PIC KBC segment PIT INT命令 レガシーフリー規格 UEFI USBメモリ x86-64 (64 ビットモード) APIC, MSI USB HID 4階層ページング Local APICタイマー 未定(多分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/1ssu7KQEt1SMqizLlfiP6URZWMw1HTHtmHIhHRyW06w/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ドライバの作り方を解説 クラスドライバ層 USB層 ホストコントローラ層 • xHCI for Universal Serial Bus: Specification • https://www.intel.co.jp/content/www/jp/ja/products/docs/io/universalserial-bus/extensible-host-controler-interface-usb-xhci.html • xHCIドライバを書くなら必携の書
APIC Advanced Programmable Interrupt Controller • PITはマザボで1つ • APIC = IO APIC + Local APIC • IO APICはマザボで1つ • Local APICは各CPUコアに内蔵 • Intel SDMに説明がある http://editmax.eu/jak-sevyrabi-procesory-cpu/ • APICなら各コアに割り込みを分配できる
MSI: Message Signaled Interrupt • CPUに割り込みを通知する方法の一種 • PCIバスの標準機能 • 従来:INTxピンの信号変化で割り込み • IO APICを経由しLocal APICに通知 • MSI:メモリ書き込みサイクルで割り込み • Local APICに直接通知 • IO APICを知らなくて良い。楽。
MSI: Message Signaled Interrupt #INTx割り込み #INTxの信号変化 により割り込む MSI割り込み CPU Local APIC メモリ書き込み サイクルにより 割り込む バス IO APIC ハードウェア
PCIバス • 現代のパソコンの中核を担うバス規格 • PCI: パラレルバス規格 • PCIe: シリアルバス規格 • 現代の主流。PCIとソフトウェア互換。 • xHCIはPCIで接続する前提の規格
PCIバスの参考資料 • PCI Memo - osdev.jp • https://github.com/osdev-jp/osdevjp.github.io/wiki/PCI-Memo • PCIコンフィグレーション空間 • PCIデバイスの列挙方法 • PCIバス&PCI-Xバスの徹底研究 • CQ出版 Interface編集部