Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
64bit UEFIからxv6を起動してみた
Search
VTb
August 21, 2018
Technology
0
460
64bit UEFIからxv6を起動してみた
セキュリティキャンプ2018 システムプログラミングトラック OS開発ゼミ フルスクラッチOSに参加したときの成果発表スライドです。
VTb
August 21, 2018
Tweet
Share
More Decks by VTb
See All by VTb
VSP専用プロセッサ設計と実行エンジンIyokanについて
pibvt
0
250
MR1を支えた Ethernet&ROS システム
pibvt
3
1.2k
3日間で作る フルスクラッチHTTPサーバー on STM32F767 Nucleo
pibvt
14
5.7k
Hello_UEFI_で学ぶC言語ポインタ.pdf
pibvt
0
140
Other Decks in Technology
See All in Technology
宇宙最速のランチRecap LT会(開発者ツール&運用監視編)
nnydtmg
1
190
ABEMA スマートテレビアプリケーションのパフォーマンス改善 〜業界トップクラスを目指して〜 / Performance Improvements on ABEMA Smart TV App
nodaguti
0
160
スパイクアクセス対策としての pitchfork 導入
riseshia
0
200
Replit Agent
kawaguti
PRO
2
210
Kaggleふりかえり会〜LLM 20 Questions & ISIC 2024
recruitengineers
PRO
2
190
Kubernetesを知る
logica0419
18
5.4k
ファインディの4年にわたる技術的負債の返済 / Repaying 4 Years of Technical Debt at Findy
ma3tk
7
3.8k
アジャイルテストの4象限で考える プロダクト開発の品質への向き合い方
nagano
1
960
JAWS-UG 横浜支部 #76 AWS re:Invent 2024 宇宙一早い Recap LT3Amazon EKS Auto Modeと遊び(パーティ)の話
tjotjo
0
150
テーブルが200以上あるSaaSでRSCとGraphQLを併用する理由
msickpaler
1
170
つくってあそぼ! ユビキタス言語作文の紹介
ndadayo
1
150
WernerVogelsのKeynoteで語られた6つの教訓とOps
hatahata021
1
160
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Facilitating Awesome Meetings
lara
50
6.1k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
160
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.8k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Making Projects Easy
brettharned
116
5.9k
Designing for Performance
lara
604
68k
Navigating Team Friction
lara
183
15k
Transcript
64bit UEFIからxv6を起動してみた YⅠ OS開発ゼミ フルスクラッチOS @PiBVT
xv6とは? UNIX V6をMITがx86向けに再実装したもの コンパクト(約1万行) x86で BIOSから起動できる マルチコア対応などの改良有
なぜUEFI? BIOSは2020年までに互換機能が削除される →2020年以降もxv6を実機で動かしたい。 →xv6を64bit UEFIから起動できた人はいない(当社調べ) →何か楽しそう
起動するまでの壁 1.64bitのプロセッサで32bitのバイナリを実行する →32bitバイナリのOSを実行するためにCPUのモードを変更する →バイナリの64bit対応は必要ないため、少しの変更で動かすことが出来る 2.BIOSに依存した部分をUEFI用に書き換える →CPUの情報を取得する部分がBIOS依存のため、UEFI対応にする
x86-64のCPUモード x86-64には大別して以下のモードがある。 ・Real mode (16bit) ・Protected mode (16/32bit) ・Long mode
(64bit) UEFI起動時にCPUはLong modeであるため、 Long mode → Protected mode の移行をして32bitカーネルを実行する。
CPUモードの変更 たった6ステップでモード変更が出来る! Intel® 64 and IA-32 Architectures Software Developer’s Manual
V3より
が、なぜかpagingが有効化できない Legacy paged-protected modeでないといけない。 →ん? QEMUで確認するとPAEのフラグが立っている。 →PAEを無効化すると動いた。 仕様書はしっかりと読もう! (1週間以上溶かしました。)
モード移行後、カーネルの初期化関数が走り始める! が...
mpinit()がBIOS依存 mpinit()は各プロセッサのLAPICやIOAPIC等の情報を取得する関数 →BIOSが作成するMP Floating Pointer Structureを利用。 MP構造体はプロセッサの情報やAPIC関連の情報を持つ。 →UEFIにはそんなものない。 詰み?
UEFI用にmpinit_uefi()を実装しました。
UEFIにはMP構造体に相当するものとして MADT(Multiple APIC Description Table)がある。 UEFI側でMADTのアドレスを取得 →mpinit_uefi()内でMADTのアドレスからLAPICやIOAPICの情報を取得 →mpinit()のUEFI版移植完成。
壁を乗り越え、シェルが起動
UEFIからxv6が起動した ・IDEやディスプレイのドライバが動かないが、ほとんどの機能は動いた。 ・シリアルポート経由で表示できる。 ・lsやmkdir,echoなどのコマンドが動く。 今後の目標 ・フレームバッファを利用してディスプレイ上で表示できるようにしたい。 ・NICのデバドラとTCP/IPのプロトコルスタック作って通信したい。
経験してみて分かったこと ・既存のOSを改造することには、新しいものを作る場合とは違う難しさがある。 ・まずは、Intel SDMやUEFIの仕様書を読もう。話はそれから。 ・QEMU monitor等でレジスタ・メモリーの様子を観察すれば問題の原因をつかめる ・段階的に初期化関数が動くようになるのは快感 ・地獄のデバッグ作業を乗り越えシェルが起動したときの感動は言葉にできない 自作OSは楽しい!