View
194
Download
2
Category
Preview:
Citation preview
マザーボード1.マザーボードに十分な電力が与えられる
2.CPUを走らせるためにすべてのregisterを初期化
3.Real modeで起動を開始する
IP 0xfff0 CS base 0xffff0000
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/) より
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
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
Recommended