Speaker Deck
Sign in
Sign up
for free
Linuxカーネルクローンの作り方
Ren Kimura
September 11, 2016
Programming
3
710
Linuxカーネルクローンの作り方
OSもくもく会 LT 2016/9/11
Ren Kimura
September 11, 2016
Tweet
Share
More Decks by Ren Kimura
See All by Ren Kimura
rkx1209
5
2.3k
rkx1209
5
3.5k
rkx1209
9
4.4k
rkx1209
18
11k
rkx1209
3
1.7k
rkx1209
6
1.3k
rkx1209
13
5.8k
rkx1209
6
12k
rkx1209
2
1.1k
Other Decks in Programming
See All in Programming
manfredsteyer
1
200
mashabow
0
750
achimnol
0
120
ushisantoasobu
5
150
madai0517
3
270
ikkou
5
690
uakihir0
1
110
hironytic
4
500
objectiveaudio
1
100
oracle4engineer
0
260
leocavalcante
2
230
miyasakakazutoshi
4
560
Featured
See All Featured
myddelton
104
10k
chrislema
170
14k
rocio
154
11k
jnunemaker
PRO
40
4.3k
brianwarren
82
4.6k
zakiwarfel
86
3.2k
jonrohan
1020
360k
gr2m
82
11k
jrom
113
7k
colly
65
2.9k
chrislema
231
16k
mojombo
356
62k
Transcript
Linuxカーネルクローン の作り方 @RKX1209 自作OSもくもく会 LT 2016/9/11
自己紹介 @RKX1209 神戸大学工学部4年生 (インターンで関東に...) OS, 仮想マシン(VMM), コンパイラ, セキュリティ seccamp 14,15,16,
未踏16
Linuxカーネルクローン Linuxカーネル(2.6)を解読し、必要最低限の機能のみを自力で実装しなおす あくまでカーネルのみの開発 シェルやウィンドウマネージャは未実装 「30日でできない 自作Linuxクローン開発」 http://rkx1209.hatenablog.com/entry/2014/12/25/225138
Motivation Linuxカーネルのクローンを開発する意義 ❏ メジャーなOSのアーキテクチャに習うことでカーネル開発への理解を深める ❏ Linuxのコア部分のみ実装しているためLinux自体の解読にも役立つ https://github.com/RKX1209/Abyon
Linuxブートのおおまかな流れ 1. ブートローダー stage1 (MBR) a. BIOSを使ってカーネル本体とstage2をメモリ上にロード 2. ブートローダー stage2
a. GDTの仮設定, カーネル本体へのジャンプ 3. startup_32 (arch/i386/kernel/head.S) a. IDTの仮設定(割り込み割り込みは無視) 4. kernel_main (kernel/main.c) a. 本格的な初期化の開始 5. rest_init(kernel/main.c) a. カーネルスレッド起動
メモリマップ <16-bit:real mode> 0x7c00 - 0x7e00 Boot Loader(loaderS1) 0x7000 -
0x???? Boot alloc bit map 0x8000 - 0x8200 Boot Loader[2](loaderS1) <= Copy 0x8200 - 0xA0000 Kernel Image(temporary) <32-bit:protected mode> 0x00100000 - 0x???????? kernel body 0x???????? - 0x???????? init page table ~ init_pg_tables_end ~ 0x00300000 - 0x???????? root disk(mounted on /)
4. kernel_main • e820, early_bootメモリシステムの初期化(setup_arch) • プロセススケジューラの初期化(sched_init) • トラップの初期化(trap_init) •
割り込みの初期化(init_IRQ) • タイマーの初期化(init_timers) • ソフトウェア割り込みの初期化(softirq_init) • スラブアロケータの初期化(kmem_cache_init) • ファイルシステムの初期化(vfs_caches_init)
5. rest_init • initカーネルスレッドの作成(kernel_thread) • スケジュールの開始(schedule) • idle状態に突入(cpu_idle) カーネルは初期化が終わるとアイドル状態 後はイベント駆動(タイマー割り込み,
ハードウェア割り込み)