SlideShare a Scribd company logo
1 of 35
Download to read offline
レガシーフリー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編集部

More Related Content

What's hot

Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
 

What's hot (20)

KiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアルKiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアル
 
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
「龍が如くスタジオ」のQAエンジニアリング技術を結集した全自動バグ取りシステム
 
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたはりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみた
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
Protocol Buffers 入門
Protocol Buffers 入門Protocol Buffers 入門
Protocol Buffers 入門
 
モバイルアプリの高速で安定したビルドを支えるJenkins運用術
モバイルアプリの高速で安定したビルドを支えるJenkins運用術モバイルアプリの高速で安定したビルドを支えるJenkins運用術
モバイルアプリの高速で安定したビルドを支えるJenkins運用術
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくい
 
ctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリングctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリング
 
スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介
スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介
スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る Linuxのsemaphoreとmutexを見る 
Linuxのsemaphoreとmutexを見る 
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
MikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続するMikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続する
 

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

Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界
Hideki Takase
 

Similar to レガシーフリーOSに必要な要素技術 legacy free os (20)

Building libc++ for toy OS
Building libc++ for toy OSBuilding libc++ for toy OS
Building libc++ for toy OS
 
Getting a packet trace
Getting a packet traceGetting a packet trace
Getting a packet trace
 
20150118 firefoxos-handson-helloworld
20150118 firefoxos-handson-helloworld20150118 firefoxos-handson-helloworld
20150118 firefoxos-handson-helloworld
 
Master-Detail App を実装する
Master-Detail App を実装するMaster-Detail App を実装する
Master-Detail App を実装する
 
使い倒そう Visual Studio Code! ~クラウド連携や遠隔ペアプロ、  もちろん Git も便利に~
使い倒そう Visual Studio Code!~クラウド連携や遠隔ペアプロ、 もちろん Git も便利に~使い倒そう Visual Studio Code!~クラウド連携や遠隔ペアプロ、 もちろん Git も便利に~
使い倒そう Visual Studio Code! ~クラウド連携や遠隔ペアプロ、  もちろん Git も便利に~
 
Visual Studio Code のこれまでとこれから at OSC 2021 Online/Spring
Visual Studio Code のこれまでとこれから at OSC 2021 Online/SpringVisual Studio Code のこれまでとこれから at OSC 2021 Online/Spring
Visual Studio Code のこれまでとこれから at OSC 2021 Online/Spring
 
The Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKitThe Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKit
 
UEFIベアメタルプログラミング
UEFIベアメタルプログラミングUEFIベアメタルプログラミング
UEFIベアメタルプログラミング
 
ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦
 
サーバーレスアーキテクチャで悩んでます
サーバーレスアーキテクチャで悩んでますサーバーレスアーキテクチャで悩んでます
サーバーレスアーキテクチャで悩んでます
 
できる!スマホアプリ:Webからはじまるアプリ for CMU16
できる!スマホアプリ:Webからはじまるアプリ for CMU16できる!スマホアプリ:Webからはじまるアプリ for CMU16
できる!スマホアプリ:Webからはじまるアプリ for CMU16
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス
 
デザインパターン
デザインパターンデザインパターン
デザインパターン
 
Document based application
Document based applicationDocument based application
Document based application
 
RUDP
RUDPRUDP
RUDP
 
Time for Xcode Behavior
Time for Xcode BehaviorTime for Xcode Behavior
Time for Xcode Behavior
 
Remote Development with Visual Studio Code & A clean dev env, working every ...
Remote Development with Visual Studio Code &  A clean dev env, working every ...Remote Development with Visual Studio Code &  A clean dev env, working every ...
Remote Development with Visual Studio Code & A clean dev env, working every ...
 
20180822 ガチラボ vol.8
20180822 ガチラボ vol.820180822 ガチラボ vol.8
20180822 ガチラボ vol.8
 
Bukuro.makers
Bukuro.makersBukuro.makers
Bukuro.makers
 
Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界Nervesが開拓する「ElixirでIoT」の新世界
Nervesが開拓する「ElixirでIoT」の新世界
 

More from uchan_nos

More from uchan_nos (20)

小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器
 
トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路
 
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクトOpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
 
自作言語でお絵描き
自作言語でお絵描き自作言語でお絵描き
自作言語でお絵描き
 
OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会
 
サイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返るサイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返る
 
USB3.0ドライバ開発の道
USB3.0ドライバ開発の道USB3.0ドライバ開発の道
USB3.0ドライバ開発の道
 
Security Nextcamp remote mob programming
Security Nextcamp remote mob programmingSecurity Nextcamp remote mob programming
Security Nextcamp remote mob programming
 
Langsmith OpeLa handmade self-hosted OS and LPS
Langsmith OpeLa handmade self-hosted OS and LPSLangsmith OpeLa handmade self-hosted OS and LPS
Langsmith OpeLa handmade self-hosted OS and LPS
 
OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作
 
自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装自動でバグを見つける!プログラム解析と動的バイナリ計装
自動でバグを見つける!プログラム解析と動的バイナリ計装
 
1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG
 
プランクトンサミットの歴史2019
プランクトンサミットの歴史2019プランクトンサミットの歴史2019
プランクトンサミットの歴史2019
 
Introduction of security camp 2019
Introduction of security camp 2019Introduction of security camp 2019
Introduction of security camp 2019
 
Timers
TimersTimers
Timers
 
USB3 host driver program structure
USB3 host driver program structureUSB3 host driver program structure
USB3 host driver program structure
 
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
 
1TB/dayのログを収集・蓄積する技術
1TB/dayのログを収集・蓄積する技術1TB/dayのログを収集・蓄積する技術
1TB/dayのログを収集・蓄積する技術
 
WalB: Real-time and Incremental Backup System for Block Devices
WalB: Real-time and Incremental Backup System for Block DevicesWalB: Real-time and Incremental Backup System for Block Devices
WalB: Real-time and Incremental Backup System for Block Devices
 
5分で分かるサイボウズのSRE
5分で分かるサイボウズのSRE5分で分かるサイボウズのSRE
5分で分かるサイボウズのSRE
 

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