kernel bootstrap

23
Kernel Bootstrap Kai Sasaki(@Lewuathe)

Upload: kai-sasaki

Post on 15-Jul-2015

193 views

Category:

Software


2 download

TRANSCRIPT

Kernel BootstrapKai Sasaki(@Lewuathe)

今日のお話

• BIOS

• Bootloader

• header.S

• main.c

※アーキテクチャはx86

まず電源ボタンを押します

マザーボード1.マザーボードに十分な電力が与えられる

2.CPUを走らせるためにすべてのregisterを初期化

3.Real modeで起動を開始する

IP 0xfff0 CS base 0xffff0000

Real Mode

• x86互換のCPUでの起動時の動作モード

• メモリを20bit(1MB)の空間で分割

• すべてのプログラムが直接的にメモリにアクセス可能

Real Mode

Mem

メモリバスは20bit

CPU

register

registerは16bit

Real Mode

Mem

メモリバスは20bit

CPU

register

registerは16bit

メモリ空間は1MB(2^20)あるのに16bit registerしかない

Real Mode6553565535

…CP:IP

base address offset

Real Mode6553565535

…CP:IP

0x2000 0x0010

(0x2000 << 4) + 0x1000 対象のアドレスは

Reset VectorIP 0xfff0 CS base 0xffff0000

0xffff0000:0xfff0

Logical Address

Reset VectorIP 0xfff0 CS base 0xffff0000

0xffff0000:0xfff0

Logical Address

これをReset Vectorといい、すべての初期化が 終わった段階で最初に行う命令がこのアドレスに入っている

jump命令• Reset Vectorの先にはjump命令が入っている

• 多くはBIOSへと飛ぶ無条件分岐命令

.section ".reset" .code16 .globl reset_vector reset_vector: .byte 0xe9 .int _start - ( . + 2 ) ...

coreboot(http://www.coreboot.org/) より

BIOS

• ハードウェアの初期化、チェックを行い次にブート可能なデバイスを探す

• マザーボード毎に実装され、通常はROMなどの不揮発性メモリの上に乗っている

BIOS• ブートセクターを探す

• デバイス毎にブートプログラムを可能している

• 通常そのデバイスの先頭512byteに格納

P1 P2 P3BS

5120

Master Boot Record• ブートセクタにおいてあるプログラム

• BIOSは先頭512byteのロードのみ保証

• そのためこのプログラムが後続のプログラムを次々にロードしていく形になる

http://ja.wikipedia.org/wiki/マスターブートレコード

Bootloader• MBRにインストールされているソフトウェア

• GRUBやLILOが一般的

• BIOSはBootloaderを選択し処理を受け渡す

• このBootloaderとして利用可能なプログラムはKernelの を実装しているBoot Protocol

https://github.com/torvalds/linux/blob/master/Documentation/x86/boot.txt

GRUB

stage1(boot.img)

BIOS

stage2(diskboot.img)

grub_main

header• Boot Protocolでヘッダの設定が規定されている

• Bootloaderはこれらの設定を行う必要がある

https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S#L280-L288

kernel loading• Boot Protocolに従いカーネルをメモリにロードする

https://github.com/torvalds/linux/blob/master/Documentation/x86/boot.txt

kernel setup• loadが完了すると処理がkernelに移る

• kernelのsetupは_startからはじまる

• ここのメモリ上のoffsetはBootloaderは知っている

https://github.com/torvalds/linux/blob/master/arch/x86/boot/header.S#L293

header.S1. label 1へのjump

2. headerのsetup

3. start_of_setup

1. segment registerの検証 : dsとesの両segment registerを同じ箇所を指すようにする

2. スタックの設定 :

3. bssの設定 : 静的なデータ領域の設定を行う

4. main.cへのjump

.byte 0xeb

.byte start_of_setup-1f

main.c

https://github.com/torvalds/linux/blob/master/arch/x86/boot/main.c

ここからはC お疲れ様でした

Reference

• linux-internals

• http://0xax.gitbooks.io/linux-insides/content/index.html