SlideShare a Scribd company logo
1 of 18
Download to read offline
12ステップで作る組込みOS自作入門
      6thステップ




                @sandai
【参考書籍】
12ステップで作る組込みOS自作入門
【内容】
1ステップずつ、実際に動かしながらプログラムを発展さ
せていく方式で無理なく学べる。OSやハードウェアに詳
しくない方にも理解できるよう
に十分な説明を提供

坂井 弘亮(著)
カットシステム(2010/5)

【税込価格】
4,410円

【サポートページ】
http://kozos.jp/books/makeos/
もくじ
1.エントリ・ポイント
2.ブートローダとOSの作成
3.まとめ
1.エントリ・ポイント
エントリ・ポイント
●   ELF形式のファイルのセグメント情報は読み取
    れるようになったので、これからセグメントを
    RAMに展開し処理を渡すことをする
    –   このときにどのアドレスから実行開始すれば良いか
        を指示しなければならない
●   この実行開始アドレスを、一般的にスタート・
    アドレス又はエントリ・ポイントと呼ぶ
    –   ELF形式ではエントリ・ポイントと言う
ELF形式のエントリ・ポイント
●   ELF形式のファイルはエントリ・ポイントの情
    報をヘッダに持っている
    –   ELFヘッダのうち、「Entry point address」の部分
    –   そのアドレスから実行開始するのが妥当
         ● アセンブリ的にはそのアドレスにジャンプする

           だけ。これを「実行を渡す」とか「処理を渡
           す」と表現したりする
2.ブートローダとOSの作成
開発の流れ
●   ここからブートローダとOSに分かれる
    –   ブートローダ
         ● ダウンロードしたOSを起動するプログラム


    –   OS
         ● 今回はHello Worldを表示するだけのプログラム


●   どっちもこれまで書いてきたプログラムをいじ
    るだけ
ブートローダのプログラム
●   追加ファイル
    –   なし
●   修正ファイル
    –   elf.h,elf.c...メモリ上へのコピーとエントリ・ポ
        イント対応
    –   main.c...エントリ・ポイントからの起動を追加
セグメントをRAMに展開する
●   そのままRAMにコピーするだけ
●   以前セグメント情報を表示していた部分を消し
    て以下のコードを追加
●   コピー先がVAではなくPAになってる。VAでも問
    題ないが、あくまで論理アドレスだからPAの方
    を利用すべしとのこと
memcpy((char *)phdr->physical_addr, (char *)header + phdr-
>offset, phdr->file_size);
memset((char *)phdr->physical_addr + phdr->file_size, 0,
phdr->memory_size - phdr->file_size);
エントリ・ポイントを取得
●   main.cで呼び出すエントリ・ポイントを返す関
    数。ELFファイルのチェックとロードも行われ
    ている
char *elf_load(char *buf)
{
    struct elf_header *header = (struct elf_header * )buf;

    if (elf_check(header) < 0)
        return NULL;

    if (elf_load_program(header) < 0)
        return NULL;

    return (char *)header->entry_point;
}
OSのプログラム
●   追加ファイル
    –   defines.h...ブートローダと同じ
    –   lib.h,lib.c...ブートローダと同じ
    –   serial.h,serial.c...ブートローダと同じ
    –   startup.s...ブートローダと同じ
    –   main.c...新しく作成。Hello Worldを表示
    –   ld.scr...OS側用のリンカ
    –   Makefile
●   これらのファイルは、~/12step/src/06/os以下
    に保存
プログラム修正
●   main.c
    –   初期化関数を全て削除
        ● データ領域のコピ、BSS領域のクリア、シリア

          ル・デバイスの初期化はブートローダ側でする
          ことになったので
●   ld.scr
    –   全てram上に配置されるように変更
●   Makefile
    –   不要な部分を削除
OS側のエントリ・ポイント
●   OS側のエントリ・ポイントは、ld.scrの
    ENTRY(“_start”)により、startup.sの_start
    ラベルの位置をエントリ・ポイントとしてELF
    ヘッダが作成
●   ブートローダのf()の呼び出しが、OS側の
    _startの位置から動作を開始することになる
●   ブートローダのld.scrにもENTRY(“_start”)
    はあるが、実はこれは特に意味はない
    –   リセット・ベクタから起動してるから
プログラム実行
●   osディレクトリでmakeして、それからbootload
    ディレクトリでmake、make image、make write
    してからのログ
/Users/sandai/12step/src/06/os% sudo cu -l /dev/tty.usbserial-FTG6PQ4H
Password:
Connected.
kzload (kozos boot loader) started.
kzload> load
~+lsx kozos
Sending kozos, 11 blocks: Give your local XMODEM receive command now.
Bytes Sent:   1536   BPS:220

Transfer complete

XMODEM receive succeeded!
kzload> run
starting from entry point: ffc020
Hello World!
> echo aaa
 aaa
補足
●   もしosのld.scrで.text.startupの部分を削除
    していなかったら、エントリ・ポイントのアド
    レス位置は違うので注意
●   なんなんだろうねこれ。よくわからんわ
3.まとめ
まとめ
●   ブートローダとOSを作成した
    –   OSというか、Hello Worldのプログラム
●   ブートローダ側とOS側でスタックとかかぶって
    るけどいいのかな?
    – ああ、あれか。スタックだもんな。関数抜け
      たら全部なくなるから、一緒のとこつかえば
      いいか
●   とりあえずブートローダの仕組みがわかったの
    でよかった
●   書籍ではまだCPUの動作原理という話が続く
    が、ここでは省略する

More Related Content

What's hot

リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズKazuhiro Takahashi
 
[Basic 8] プロセスとスレッド / 入出力 / シェル
[Basic 8] プロセスとスレッド / 入出力 / シェル[Basic 8] プロセスとスレッド / 入出力 / シェル
[Basic 8] プロセスとスレッド / 入出力 / シェルYuto Takei
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチKazuki Onishi
 
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介NSaitoNmiri
 
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理Yuto Takei
 
さわってみようTOPPERS/SSP
さわってみようTOPPERS/SSPさわってみようTOPPERS/SSP
さわってみようTOPPERS/SSPNSaitoNmiri
 
[Basic 9] 並列処理 / 排他制御
[Basic 9] 並列処理 / 排他制御[Basic 9] 並列処理 / 排他制御
[Basic 9] 並列処理 / 排他制御Yuto Takei
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。Kazuki Onishi
 
あるコンテキストスイッチの話
あるコンテキストスイッチの話あるコンテキストスイッチの話
あるコンテキストスイッチの話nullnilaki
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
X86opti01 nothingcosmos
X86opti01 nothingcosmosX86opti01 nothingcosmos
X86opti01 nothingcosmosnothingcosmos
 
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会Hirotaka Kawata
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設Minoru Nakamura
 
Read daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisanRead daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisanshinaisan
 
Intel TSX について x86opti
Intel TSX について x86optiIntel TSX について x86opti
Intel TSX について x86optiTakashi Hoshino
 

What's hot (20)

リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズ
 
[Basic 8] プロセスとスレッド / 入出力 / シェル
[Basic 8] プロセスとスレッド / 入出力 / シェル[Basic 8] プロセスとスレッド / 入出力 / シェル
[Basic 8] プロセスとスレッド / 入出力 / シェル
 
プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
 
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介
 
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
 
さわってみようTOPPERS/SSP
さわってみようTOPPERS/SSPさわってみようTOPPERS/SSP
さわってみようTOPPERS/SSP
 
[Basic 9] 並列処理 / 排他制御
[Basic 9] 並列処理 / 排他制御[Basic 9] 並列処理 / 排他制御
[Basic 9] 並列処理 / 排他制御
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
あるコンテキストスイッチの話
あるコンテキストスイッチの話あるコンテキストスイッチの話
あるコンテキストスイッチの話
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
X86opti01 nothingcosmos
X86opti01 nothingcosmosX86opti01 nothingcosmos
X86opti01 nothingcosmos
 
Minix Learning
Minix LearningMinix Learning
Minix Learning
 
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
 
systemd 再入門
systemd 再入門systemd 再入門
systemd 再入門
 
d-kami x86-2
d-kami x86-2d-kami x86-2
d-kami x86-2
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設
 
ぼくnmonです
ぼくnmonですぼくnmonです
ぼくnmonです
 
Altanative macro
Altanative macroAltanative macro
Altanative macro
 
Read daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisanRead daemon on 20121110 by shinaisan
Read daemon on 20121110 by shinaisan
 
Intel TSX について x86opti
Intel TSX について x86optiIntel TSX について x86opti
Intel TSX について x86opti
 

Viewers also liked

30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくばHirotaka Kawata
 
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -Kishi Shundo
 
QEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミングQEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミングYuma Ohgami
 
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)kozossakai
 
やってよかったOS作り
やってよかったOS作りやってよかったOS作り
やってよかったOS作りHidemi Kawai
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門demuyan
 
Railsチュートリアルの歩き方 (第3版)
Railsチュートリアルの歩き方 (第3版)Railsチュートリアルの歩き方 (第3版)
Railsチュートリアルの歩き方 (第3版)Yohei Yasukawa
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門Hirotaka Kawata
 
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介Yuma Ohgami
 
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめWeb系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめNisei Kimura
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門uchan_nos
 
Ctfのためのpython入門
Ctfのためのpython入門Ctfのためのpython入門
Ctfのためのpython入門shiracamus
 
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演Ken Ogura
 
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)kikuchan98
 

Viewers also liked (15)

30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
 
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
 
QEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミングQEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミング
 
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
 
やってよかったOS作り
やってよかったOS作りやってよかったOS作り
やってよかったOS作り
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門
 
Railsチュートリアルの歩き方 (第3版)
Railsチュートリアルの歩き方 (第3版)Railsチュートリアルの歩き方 (第3版)
Railsチュートリアルの歩き方 (第3版)
 
人工知能概論 1
人工知能概論 1人工知能概論 1
人工知能概論 1
 
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
 
【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介【2000行弱!】x86用自作カーネルの紹介
【2000行弱!】x86用自作カーネルの紹介
 
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめWeb系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門
 
Ctfのためのpython入門
Ctfのためのpython入門Ctfのためのpython入門
Ctfのためのpython入門
 
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演
 
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
 

Similar to 【学習メモ#6th】12ステップで作る組込みOS自作入門

2009年のPHPフレームワーク
2009年のPHPフレームワーク2009年のPHPフレームワーク
2009年のPHPフレームワークTakuya Sato
 
あるmmapの話
あるmmapの話あるmmapの話
あるmmapの話nullnilaki
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - FuncGosuke Miyashita
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス5mingame2
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...do_aki
 
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略祐司 伊藤
 
20121217 jawsug-yokohama
20121217 jawsug-yokohama20121217 jawsug-yokohama
20121217 jawsug-yokohamaTetsuya Chiba
 
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overviewRyo Sakamoto
 
2010年インストールマニアックス ~Javaアプリ編~
2010年インストールマニアックス ~Javaアプリ編~2010年インストールマニアックス ~Javaアプリ編~
2010年インストールマニアックス ~Javaアプリ編~normalian
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp CodereadingHiro Yoshioka
 
Zマイスターとの新たな価値探求 z/OS
Zマイスターとの新たな価値探求 z/OSZマイスターとの新たな価値探求 z/OS
Zマイスターとの新たな価値探求 z/OSIBMソリューション
 
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!Midori Oge
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方do_aki
 
CLRの基礎 - プログラミング .NET Framework 第3版 読書会
CLRの基礎 - プログラミング .NET Framework 第3版 読書会CLRの基礎 - プログラミング .NET Framework 第3版 読書会
CLRの基礎 - プログラミング .NET Framework 第3版 読書会Yoshihisa Ozaki
 

Similar to 【学習メモ#6th】12ステップで作る組込みOS自作入門 (20)

2009年のPHPフレームワーク
2009年のPHPフレームワーク2009年のPHPフレームワーク
2009年のPHPフレームワーク
 
あるmmapの話
あるmmapの話あるmmapの話
あるmmapの話
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - Func
 
どこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティスどこでも動くゲームを作るためのベタープラクティス
どこでも動くゲームを作るためのベタープラクティス
 
php and sapi and zendengine2 and...
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
 
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
 
20121217 jawsug-yokohama
20121217 jawsug-yokohama20121217 jawsug-yokohama
20121217 jawsug-yokohama
 
Ansible2.0と実用例
Ansible2.0と実用例Ansible2.0と実用例
Ansible2.0と実用例
 
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overview
 
2010年インストールマニアックス ~Javaアプリ編~
2010年インストールマニアックス ~Javaアプリ編~2010年インストールマニアックス ~Javaアプリ編~
2010年インストールマニアックス ~Javaアプリ編~
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
Gingerbread
GingerbreadGingerbread
Gingerbread
 
Php in ruby
Php in rubyPhp in ruby
Php in ruby
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp Codereading
 
Zマイスターとの新たな価値探求 z/OS
Zマイスターとの新たな価値探求 z/OSZマイスターとの新たな価値探求 z/OS
Zマイスターとの新たな価値探求 z/OS
 
What is chef
What is chefWhat is chef
What is chef
 
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
 
php-src の歩き方
php-src の歩き方php-src の歩き方
php-src の歩き方
 
CLRの基礎 - プログラミング .NET Framework 第3版 読書会
CLRの基礎 - プログラミング .NET Framework 第3版 読書会CLRの基礎 - プログラミング .NET Framework 第3版 読書会
CLRの基礎 - プログラミング .NET Framework 第3版 読書会
 

【学習メモ#6th】12ステップで作る組込みOS自作入門

  • 5. エントリ・ポイント ● ELF形式のファイルのセグメント情報は読み取 れるようになったので、これからセグメントを RAMに展開し処理を渡すことをする – このときにどのアドレスから実行開始すれば良いか を指示しなければならない ● この実行開始アドレスを、一般的にスタート・ アドレス又はエントリ・ポイントと呼ぶ – ELF形式ではエントリ・ポイントと言う
  • 6. ELF形式のエントリ・ポイント ● ELF形式のファイルはエントリ・ポイントの情 報をヘッダに持っている – ELFヘッダのうち、「Entry point address」の部分 – そのアドレスから実行開始するのが妥当 ● アセンブリ的にはそのアドレスにジャンプする だけ。これを「実行を渡す」とか「処理を渡 す」と表現したりする
  • 8. 開発の流れ ● ここからブートローダとOSに分かれる – ブートローダ ● ダウンロードしたOSを起動するプログラム – OS ● 今回はHello Worldを表示するだけのプログラム ● どっちもこれまで書いてきたプログラムをいじ るだけ
  • 9. ブートローダのプログラム ● 追加ファイル – なし ● 修正ファイル – elf.h,elf.c...メモリ上へのコピーとエントリ・ポ イント対応 – main.c...エントリ・ポイントからの起動を追加
  • 10. セグメントをRAMに展開する ● そのままRAMにコピーするだけ ● 以前セグメント情報を表示していた部分を消し て以下のコードを追加 ● コピー先がVAではなくPAになってる。VAでも問 題ないが、あくまで論理アドレスだからPAの方 を利用すべしとのこと memcpy((char *)phdr->physical_addr, (char *)header + phdr- >offset, phdr->file_size); memset((char *)phdr->physical_addr + phdr->file_size, 0, phdr->memory_size - phdr->file_size);
  • 11. エントリ・ポイントを取得 ● main.cで呼び出すエントリ・ポイントを返す関 数。ELFファイルのチェックとロードも行われ ている char *elf_load(char *buf) { struct elf_header *header = (struct elf_header * )buf; if (elf_check(header) < 0) return NULL; if (elf_load_program(header) < 0) return NULL; return (char *)header->entry_point; }
  • 12. OSのプログラム ● 追加ファイル – defines.h...ブートローダと同じ – lib.h,lib.c...ブートローダと同じ – serial.h,serial.c...ブートローダと同じ – startup.s...ブートローダと同じ – main.c...新しく作成。Hello Worldを表示 – ld.scr...OS側用のリンカ – Makefile ● これらのファイルは、~/12step/src/06/os以下 に保存
  • 13. プログラム修正 ● main.c – 初期化関数を全て削除 ● データ領域のコピ、BSS領域のクリア、シリア ル・デバイスの初期化はブートローダ側でする ことになったので ● ld.scr – 全てram上に配置されるように変更 ● Makefile – 不要な部分を削除
  • 14. OS側のエントリ・ポイント ● OS側のエントリ・ポイントは、ld.scrの ENTRY(“_start”)により、startup.sの_start ラベルの位置をエントリ・ポイントとしてELF ヘッダが作成 ● ブートローダのf()の呼び出しが、OS側の _startの位置から動作を開始することになる ● ブートローダのld.scrにもENTRY(“_start”) はあるが、実はこれは特に意味はない – リセット・ベクタから起動してるから
  • 15. プログラム実行 ● osディレクトリでmakeして、それからbootload ディレクトリでmake、make image、make write してからのログ /Users/sandai/12step/src/06/os% sudo cu -l /dev/tty.usbserial-FTG6PQ4H Password: Connected. kzload (kozos boot loader) started. kzload> load ~+lsx kozos Sending kozos, 11 blocks: Give your local XMODEM receive command now. Bytes Sent: 1536 BPS:220 Transfer complete XMODEM receive succeeded! kzload> run starting from entry point: ffc020 Hello World! > echo aaa aaa
  • 16. 補足 ● もしosのld.scrで.text.startupの部分を削除 していなかったら、エントリ・ポイントのアド レス位置は違うので注意 ● なんなんだろうねこれ。よくわからんわ
  • 18. まとめ ● ブートローダとOSを作成した – OSというか、Hello Worldのプログラム ● ブートローダ側とOS側でスタックとかかぶって るけどいいのかな? – ああ、あれか。スタックだもんな。関数抜け たら全部なくなるから、一緒のとこつかえば いいか ● とりあえずブートローダの仕組みがわかったの でよかった ● 書籍ではまだCPUの動作原理という話が続く が、ここでは省略する