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




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

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

【税込価格】
4,410円

【サポートページ】
http://kozos.jp/books/makeos/
もくじ
1.ELF形式
2.各種ヘッダ解説
3.プログラムの修正と追加と実行
4.まとめ
1.ELF形式
オブジェクト・ファイル・フォー
          マット
●   これまで作成してきた実行形式ファイルは単な
    るベタバイナリになっているわけではなく、内
    部は特定のフォーマットで記述されている
    –   これを一般にオブジェクト・ファイル・フォーマッ
        トと呼ぶ
●   オブジェクト・ファイル・フォーマットはいく
    つか種類があり、a.out形式やEXE形式、COFF形
    式など存在するが、一般的なのはELF形式
ELF形式
●   gccは標準でコンパイル・リンクで出力する
    ファイルはELF形式で作成する
●   ELF形式が一番扱いやすく問題ない形式らしい
リンクとリンカ
●   複数のオブジェクト・ファイルを結合して実行
    形式ファイルを生成するのをリンクと言う
    –   リンクはリンカによって行われる
●   個々のオブジェクト・ファイルもELF形式で内
    部のセクションの種類は実行形式ファイルと同
    じ。
    –   それぞれが.dataや.textを持っている
●   つまりリンクとは、そういった個々のオブジェ
    クト・ファイルのセクションをまとめてひとつ
    の実行形式ファイルにするやつ
セグメントとローダ
●   セグメントはリンク後に生成される
    –   実行形式ファイルになったときに生成される
●   セグメントはローダで利用
●   ローダとは、実行形式ファイルのイメージをメ
    モリ上に展開する作業を行うプログラム
●   ローダはメモリ上に展開するときに、セグメン
    情報を見てその通りにメモリ上に展開する
    –   展開するときはもちろんセグメント単位で行う
セクションとセグメントの違い
●   セクションは実行形式ファイルを作成するリン
    カのためにある
    –   個々のオブジェクト・ファイルを結合して実行形式
        ファイルを作成するために、といった方が良いかも
        しれない
●   セグメントはローダのためにある
    –   メモリ上に展開するときにセグメント情報の通りに
        行う
    –   あとメモリ管理の方式の1つとしても利用されてい
        ると思ったけどこれは汎用OSだけ?それともそれと
        は違うセグメントのことか?調べてもわからんかっ
        た
ELF形式の内部構造
●   ELF形式のファイルは先頭にELFヘッダを持ち、
    内部はセクションとセグメントでそれぞれ独立
    した単位で分割されている
●   セクションとセグメントの情報はセクション・
    ヘッダ、プログラム・ヘッダというヘッダで管
    理されている
    –   具体的なイメージ図は次ページを参照
ELF形式の内部構造の図




169頁 図5.1 ELF形式の内部構造 より
ELF形式のヘッダ情報
●   ファイルの先頭はELFヘッダ
    –   プログラム・ヘッダ・テーブルやセクション・ヘッ
        ダ・テーブルのアドレス位置やヘッダの個数などを
        知ることができる
●   その次にセグメントの情報を管理しているプロ
    グラム・ヘッダ・テーブル
●   終端にセクション情報を管理しているセクショ
    ン・ヘッダ・テーブル
セクション・ヘッダとプログラム・
      ヘッダ
●   ファイル内部ではセクション・ヘッダとプログ
    ラム・ヘッダによってセクションとセグメント
    はそれぞれ独立して区分けされ管理している
    –   当然ヘッダ同士も独立している
●   しかし先ほどの図を見る限りではセクションは
    セグメントに含まれる構成となっている
●   これは複数のセクションをひとつのセグメント
    に含めることで、似た役割をもつセクションを
    まとめてメモリ上に展開することができるから
    –   必ずしもセクションがセグメントに含まれる必要は
        ないが、こっちの方が便利ね
セクションとセグメントのまとめ
●   セクションはリンカが、セグメントはローダが
    参照するもの
●   リンク前のオブジェクト・ファイルはセグメン
    トを持たないし、プログラム・ヘッダもない
●   リンク後の実行形式ファイルではセクションも
    セグメントもあるが、この状態でセクションを
    削っても実行に問題はない
●   どっちも区分けしている感じが似ているけれ
    ど、それぞれ役割や目的が違う
2.各種ヘッダ解説
ELFヘッダ
●   readelf -a kzload.elfで解析した結果を次の
    ページに掲載
    –   「ELF Header:」の部分がヘッダ領域
●   ELFファイルの先頭に付加されるヘッダなので
    ELFヘッダと呼ぶ
ELFヘッダ解析部分
ELF Header:
  Magic: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, big endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Renesas H8/300
  Version:                           0x1
  Entry point address:               0x282
  Start of program headers:          52 (bytes into file)
  Start of section headers:          2352 (bytes into file)
  Flags:                             0x810000
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         3
  Size of section headers:           40 (bytes)
  Number of section headers:         10
  Section header string table index: 7
マジック・ナンバ
●   ヘッダの先頭にある16バイトの識別領域である
    Magicは、ELFフォーマットのバージョンやOSの
    種別などが格納されている
    –   ファイルやデータの種別するために先頭に付加され
        る数値データを一般にマジック・ナンバと呼ぶ
●   先頭4バイトには必ず「7f 45 4c 46」(0x7f
    'E' 'L' 'F')というデータが格納されていて、
    これを見ることでそのファイルがELF形式であ
    ると判断することができる
マジック・ナンバの識別情報
●   それぞれのバイトデータの意味は以下の通り




     171頁 図5.1 先頭16バイトの識別情報 より
マジック・ナンバがある理由
●   識別情報として最初に確認できるように先頭に
    バイト単位で配置している
    –   これらの情報を識別した後でないとデータを正しく
        読むことができないから
●   9~15のバイトは予約領域、リザーブ領域などと
    呼ぶ
    –   将来的にELF形式が拡張されて何か情報が追加され
        ても問題ないように用意されている
その他のELFヘッダの意味




172頁 表5.2 ELFヘッダの意味 より
セクション・ヘッダ・テーブル
 ●   セクションの情報を管理しているヘッダの配列
Section Headers:
  [Nr] Name              Type            Addr      Off   Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0 0
  [ 1] .vectors          PROGBITS        00000000 000094 000100 00 WA 0     0 4
  [ 2] .text             PROGBITS        00000100 000194 000654 00 AX 0     0 2
  [ 3] .rodata           PROGBITS        00000754 0007e8 0000a4 00   A 0    0 4
  [ 4] .data             PROGBITS        00fffc20 00088c 000004 00 WA 0     0 4
  [ 5] .bss              NOBITS          00fffc24 000890 000014 00 WA 0     0 4
  [ 6] .comment          PROGBITS        00000000 000890 00005a 00      0   0 1
  [ 7] .shstrtab         STRTAB          00000000 0008ea 000046 00      0   0 1
  [ 8] .symtab           SYMTAB          00000000 000ac0 0006c0 10      9 76 4
  [ 9] .strtab           STRTAB          00000000 001180 000250 00      0   0 1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)
セクション・ヘッダの項目




174頁 表5.3 セクション・ヘッダの意味 より
セクション・ヘッダ解説
●   セクション名は可変長なのでヘッダにそのまま
    格納されていない
    –   .shstrtabセクションにまとめて格納
●   重要なのはアドレス(Addr)、セクションの位置
    (Off)、セクションのサイズ(size)
●   アドレスはセクションが配置されている位置
    –   いわゆるVAにあたる。.dataや.bssはRAM上に配置さ
        れているアドレス
●   セクションの位置やサイズは、ELFファイル内
    でどの部分がそのセクションとなるかを表して
    いる
プログラム・ヘッダ・テーブル
 ●   セグメントの情報を管理しているヘッダの配列
Program Headers:
  Type           Offset     VirtAddr     PhysAddr     FileSiz   MemSiz    Flg   Align
  LOAD           0x000094   0x00000000   0x00000000   0x00100   0x00100   RW    0x1
  LOAD           0x000194   0x00000100   0x00000100   0x006f8   0x006f8   R E   0x1
  LOAD           0x00088c   0x00fffc20   0x000007f8   0x00004   0x00018   RW    0x1

 Section to Segment mapping:
  Segment Sections...
   00     .vectors
   01     .text .rodata
   02     .data .bss
プログラム・ヘッダの項目




176頁 表5.4 プログラム・ヘッダの意味 より
プログラム・ヘッダ解説
●   Type
    –   LOADはメモリ上にロードされるセグメントというこ
        と。他に、動的リンク情報やプログラム・ヘッダ自
        身がある
●   Offset
    –   ELFファイルの内部でのセグメント位置
●   FilSiz、MemSiz
    –   ファイル中のサイズと、メモリ上のサイズ
    –   必ずしも同じ大きさではない
3.プログラムの修正と追加と実行
プログラムの修正と追加
●   追加ファイル
    –   elf.h、elf.c...ELF形式の解析
●   修正ファイル
    –   main.c...ELF形式の解析コマンド追加
    –   Makefile...elf.oをコンパイル対象にする
●   修正部分はrunコマンド追加しただけ
    –   ELFファイルのうち、セグメント情報を表示するコ
        マンド
elf.c
●   今回はkzload.elfのセグメント情報をターミナ
    ルに表示するプログラムになっている
●   構造体が大きいのでわかりにくい
    –   構造体はELFヘッダの部分と、プログラムヘッダの
        部分を取得する感じになっている
    –   その構造体のデータを表示するだけ
●   たぶん次からELFファイルをメモリに展開する
    プログラムになるんだと思う
セクション・ヘッダが末尾の理由
●   プログラム・ヘッダがELFファイルの先頭付近
    にあるのは、ファイルをダウンロードしながら
    メモリにロードできるようにするため
    –   バッファ領域が小さいときはこういった形になる
●   メモリの配置先情報を最初に確認できるように
    してるわけ
●   セクション・ヘッダが末尾なのはロードに必要
    ないから。サイズ節約やメモリ節約のときに、
    セクション・ヘッダを捨てやすくしてる
    –   末尾にあったらオフセットを計算しなおしたり、面
        倒なことせずにすむ
4.まとめ
まとめ
●   ELF形式のファイルの内部構造を解析できるよ
    うになった
●   具体的には内部におけるそれぞれのヘッダを操
    作できるようになった
●   セグメント・ヘッダの取得はできるようになっ
    たので、それを元に内容をメモリ上に展開する
    プログラムを書くことになるのかな
●   あ、あと書籍では論理回路について解説してい
    るページがあるけど、ここでは省く

More Related Content

What's hot

プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチKazuki Onishi
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。Kazuki Onishi
 
あるコンテキストスイッチの話
あるコンテキストスイッチの話あるコンテキストスイッチの話
あるコンテキストスイッチの話nullnilaki
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめMakiko Konoshima
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設x86-64/Linuxに独自メモリ空間を勝手増設
x86-64/Linuxに独自メモリ空間を勝手増設Minoru Nakamura
 
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理Yuto Takei
 
[Basic 8] プロセスとスレッド / 入出力 / シェル
[Basic 8] プロセスとスレッド / 入出力 / シェル[Basic 8] プロセスとスレッド / 入出力 / シェル
[Basic 8] プロセスとスレッド / 入出力 / シェルYuto Takei
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズKazuhiro Takahashi
 
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会Hirotaka Kawata
 
X86opti01 nothingcosmos
X86opti01 nothingcosmosX86opti01 nothingcosmos
X86opti01 nothingcosmosnothingcosmos
 
0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきことmao999
 
シェル入門
シェル入門シェル入門
シェル入門ina job
 
[Basic 9] 並列処理 / 排他制御
[Basic 9] 並列処理 / 排他制御[Basic 9] 並列処理 / 排他制御
[Basic 9] 並列処理 / 排他制御Yuto Takei
 
とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)Kazuhiro Yoshikawa
 
core dumpでcode golf
core dumpでcode golfcore dumpでcode golf
core dumpでcode golfNomura Yusuke
 
とあるDBAの黒い画面(ターミナル)II
とあるDBAの黒い画面(ターミナル)IIとあるDBAの黒い画面(ターミナル)II
とあるDBAの黒い画面(ターミナル)IIKazuhiro Yoshikawa
 

What's hot (20)

プロセスとコンテキストスイッチ
プロセスとコンテキストスイッチプロセスとコンテキストスイッチ
プロセスとコンテキストスイッチ
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
あるコンテキストスイッチの話
あるコンテキストスイッチの話あるコンテキストスイッチの話
あるコンテキストスイッチの話
 
2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ2011.09.18 v7から始めるunix まとめ
2011.09.18 v7から始めるunix まとめ
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
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に独自メモリ空間を勝手増設
 
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
[Basic 7] OS の基本 / 割り込み / システム コール / メモリ管理
 
[Basic 8] プロセスとスレッド / 入出力 / シェル
[Basic 8] プロセスとスレッド / 入出力 / シェル[Basic 8] プロセスとスレッド / 入出力 / シェル
[Basic 8] プロセスとスレッド / 入出力 / シェル
 
Altanative macro
Altanative macroAltanative macro
Altanative macro
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズ
 
d-kami x86-1
d-kami x86-1d-kami x86-1
d-kami x86-1
 
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
 
X86opti01 nothingcosmos
X86opti01 nothingcosmosX86opti01 nothingcosmos
X86opti01 nothingcosmos
 
0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと
 
シェル入門
シェル入門シェル入門
シェル入門
 
[Basic 9] 並列処理 / 排他制御
[Basic 9] 並列処理 / 排他制御[Basic 9] 並列処理 / 排他制御
[Basic 9] 並列処理 / 排他制御
 
とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)とあるDBAの黒い画面(ターミナル)
とあるDBAの黒い画面(ターミナル)
 
core dumpでcode golf
core dumpでcode golfcore dumpでcode golf
core dumpでcode golf
 
とあるDBAの黒い画面(ターミナル)II
とあるDBAの黒い画面(ターミナル)IIとあるDBAの黒い画面(ターミナル)II
とあるDBAの黒い画面(ターミナル)II
 

Viewers also liked

マイコンでマルチタスク
マイコンでマルチタスクマイコンでマルチタスク
マイコンでマルチタスクKatsuhiko Terawaki
 
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -Kishi Shundo
 
QEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミングQEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミングYuma Ohgami
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくばHirotaka Kawata
 
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)kozossakai
 
やってよかったOS作り
やってよかったOS作りやってよかったOS作り
やってよかったOS作りHidemi Kawai
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門demuyan
 
ゼロから始める自作 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)

マイコンでマルチタスク
マイコンでマルチタスクマイコンでマルチタスク
マイコンでマルチタスク
 
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
 
QEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミングQEMUでARM64bitベアメタルプログラミング
QEMUでARM64bitベアメタルプログラミング
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
 
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
組込みOSを作ってみよう!(オープンソースカンファレンス内セミナー資料)
 
やってよかったOS作り
やってよかったOS作りやってよかったOS作り
やってよかったOS作り
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門
 
人工知能概論 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 【学習メモ#5th】12ステップで作る組込みOS自作入門

ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク7shi
 
Hello world make
Hello world makeHello world make
Hello world makemitsu1119
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会Yuji Otani
 
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたはりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたuchan_nos
 
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」ericsagnes
 
OpenDocument interoperability test workshop
OpenDocument interoperability test workshopOpenDocument interoperability test workshop
OpenDocument interoperability test workshopMakoto Takizawa
 
Intalio Cloud Workshop
Intalio Cloud Workshop Intalio Cloud Workshop
Intalio Cloud Workshop Daisuke Sugai
 
Elf binary analysis_in_julia
Elf binary analysis_in_juliaElf binary analysis_in_julia
Elf binary analysis_in_juliaSinaiPearl
 
1st step LogicFlow
1st step LogicFlow1st step LogicFlow
1st step LogicFlowTomoyuki Obi
 
いいパブッ!! - よくわかるEPUB 3
いいパブッ!! - よくわかるEPUB 3いいパブッ!! - よくわかるEPUB 3
いいパブッ!! - よくわかるEPUB 3Hiroshi Takase
 
Plan of "File Authority Designer" Ver. 2
Plan of "File Authority Designer" Ver. 2 Plan of "File Authority Designer" Ver. 2
Plan of "File Authority Designer" Ver. 2 Seiji Noro
 
「文書管理システム-作成用キット」の紹介, Introduction of "Document management system-Creation Kit"
「文書管理システム-作成用キット」の紹介, Introduction of "Document management system-Creation Kit"「文書管理システム-作成用キット」の紹介, Introduction of "Document management system-Creation Kit"
「文書管理システム-作成用キット」の紹介, Introduction of "Document management system-Creation Kit"ssuser285ddb
 
20180630 data transformationusinglogicflow
20180630 data transformationusinglogicflow20180630 data transformationusinglogicflow
20180630 data transformationusinglogicflowTomoyuki Obi
 
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門Daiyu Hatakeyama
 
デブサミ2008 .NETの仕組み
デブサミ2008 .NETの仕組みデブサミ2008 .NETの仕組み
デブサミ2008 .NETの仕組みTakeshi Shinmura
 

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

ELFの動的リンク
ELFの動的リンクELFの動的リンク
ELFの動的リンク
 
Hello world make
Hello world makeHello world make
Hello world make
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会
 
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたはりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみた
 
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
eZ Publish勉強会2013年3月「eZ Publishの構築を簡単に!」
 
BBBBB
BBBBBBBBBB
BBBBB
 
1MB
1MB1MB
1MB
 
OpenDocument interoperability test workshop
OpenDocument interoperability test workshopOpenDocument interoperability test workshop
OpenDocument interoperability test workshop
 
eZ Publishのextension開発チュートリアル
eZ Publishのextension開発チュートリアルeZ Publishのextension開発チュートリアル
eZ Publishのextension開発チュートリアル
 
osc_tokyo20100226
osc_tokyo20100226osc_tokyo20100226
osc_tokyo20100226
 
Intalio Cloud Workshop
Intalio Cloud Workshop Intalio Cloud Workshop
Intalio Cloud Workshop
 
Elf binary analysis_in_julia
Elf binary analysis_in_juliaElf binary analysis_in_julia
Elf binary analysis_in_julia
 
1st step LogicFlow
1st step LogicFlow1st step LogicFlow
1st step LogicFlow
 
いいパブッ!! - よくわかるEPUB 3
いいパブッ!! - よくわかるEPUB 3いいパブッ!! - よくわかるEPUB 3
いいパブッ!! - よくわかるEPUB 3
 
Plan of "File Authority Designer" Ver. 2
Plan of "File Authority Designer" Ver. 2 Plan of "File Authority Designer" Ver. 2
Plan of "File Authority Designer" Ver. 2
 
「文書管理システム-作成用キット」の紹介, Introduction of "Document management system-Creation Kit"
「文書管理システム-作成用キット」の紹介, Introduction of "Document management system-Creation Kit"「文書管理システム-作成用キット」の紹介, Introduction of "Document management system-Creation Kit"
「文書管理システム-作成用キット」の紹介, Introduction of "Document management system-Creation Kit"
 
20180630 data transformationusinglogicflow
20180630 data transformationusinglogicflow20180630 data transformationusinglogicflow
20180630 data transformationusinglogicflow
 
[CEDEC2017] UE4プロファイリングツール総おさらい(グラフィクス編)
[CEDEC2017] UE4プロファイリングツール総おさらい(グラフィクス編)[CEDEC2017] UE4プロファイリングツール総おさらい(グラフィクス編)
[CEDEC2017] UE4プロファイリングツール総おさらい(グラフィクス編)
 
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
2020/11/19 Global AI on Tour - Toyama プログラマーのための機械学習入門
 
デブサミ2008 .NETの仕組み
デブサミ2008 .NETの仕組みデブサミ2008 .NETの仕組み
デブサミ2008 .NETの仕組み
 

Recently uploaded

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 

Recently uploaded (8)

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 

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

  • 5. オブジェクト・ファイル・フォー マット ● これまで作成してきた実行形式ファイルは単な るベタバイナリになっているわけではなく、内 部は特定のフォーマットで記述されている – これを一般にオブジェクト・ファイル・フォーマッ トと呼ぶ ● オブジェクト・ファイル・フォーマットはいく つか種類があり、a.out形式やEXE形式、COFF形 式など存在するが、一般的なのはELF形式
  • 6. ELF形式 ● gccは標準でコンパイル・リンクで出力する ファイルはELF形式で作成する ● ELF形式が一番扱いやすく問題ない形式らしい
  • 7. リンクとリンカ ● 複数のオブジェクト・ファイルを結合して実行 形式ファイルを生成するのをリンクと言う – リンクはリンカによって行われる ● 個々のオブジェクト・ファイルもELF形式で内 部のセクションの種類は実行形式ファイルと同 じ。 – それぞれが.dataや.textを持っている ● つまりリンクとは、そういった個々のオブジェ クト・ファイルのセクションをまとめてひとつ の実行形式ファイルにするやつ
  • 8. セグメントとローダ ● セグメントはリンク後に生成される – 実行形式ファイルになったときに生成される ● セグメントはローダで利用 ● ローダとは、実行形式ファイルのイメージをメ モリ上に展開する作業を行うプログラム ● ローダはメモリ上に展開するときに、セグメン 情報を見てその通りにメモリ上に展開する – 展開するときはもちろんセグメント単位で行う
  • 9. セクションとセグメントの違い ● セクションは実行形式ファイルを作成するリン カのためにある – 個々のオブジェクト・ファイルを結合して実行形式 ファイルを作成するために、といった方が良いかも しれない ● セグメントはローダのためにある – メモリ上に展開するときにセグメント情報の通りに 行う – あとメモリ管理の方式の1つとしても利用されてい ると思ったけどこれは汎用OSだけ?それともそれと は違うセグメントのことか?調べてもわからんかっ た
  • 10. ELF形式の内部構造 ● ELF形式のファイルは先頭にELFヘッダを持ち、 内部はセクションとセグメントでそれぞれ独立 した単位で分割されている ● セクションとセグメントの情報はセクション・ ヘッダ、プログラム・ヘッダというヘッダで管 理されている – 具体的なイメージ図は次ページを参照
  • 12. ELF形式のヘッダ情報 ● ファイルの先頭はELFヘッダ – プログラム・ヘッダ・テーブルやセクション・ヘッ ダ・テーブルのアドレス位置やヘッダの個数などを 知ることができる ● その次にセグメントの情報を管理しているプロ グラム・ヘッダ・テーブル ● 終端にセクション情報を管理しているセクショ ン・ヘッダ・テーブル
  • 13. セクション・ヘッダとプログラム・ ヘッダ ● ファイル内部ではセクション・ヘッダとプログ ラム・ヘッダによってセクションとセグメント はそれぞれ独立して区分けされ管理している – 当然ヘッダ同士も独立している ● しかし先ほどの図を見る限りではセクションは セグメントに含まれる構成となっている ● これは複数のセクションをひとつのセグメント に含めることで、似た役割をもつセクションを まとめてメモリ上に展開することができるから – 必ずしもセクションがセグメントに含まれる必要は ないが、こっちの方が便利ね
  • 14. セクションとセグメントのまとめ ● セクションはリンカが、セグメントはローダが 参照するもの ● リンク前のオブジェクト・ファイルはセグメン トを持たないし、プログラム・ヘッダもない ● リンク後の実行形式ファイルではセクションも セグメントもあるが、この状態でセクションを 削っても実行に問題はない ● どっちも区分けしている感じが似ているけれ ど、それぞれ役割や目的が違う
  • 16. ELFヘッダ ● readelf -a kzload.elfで解析した結果を次の ページに掲載 – 「ELF Header:」の部分がヘッダ領域 ● ELFファイルの先頭に付加されるヘッダなので ELFヘッダと呼ぶ
  • 17. ELFヘッダ解析部分 ELF Header: Magic: 7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, big endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Renesas H8/300 Version: 0x1 Entry point address: 0x282 Start of program headers: 52 (bytes into file) Start of section headers: 2352 (bytes into file) Flags: 0x810000 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 3 Size of section headers: 40 (bytes) Number of section headers: 10 Section header string table index: 7
  • 18. マジック・ナンバ ● ヘッダの先頭にある16バイトの識別領域である Magicは、ELFフォーマットのバージョンやOSの 種別などが格納されている – ファイルやデータの種別するために先頭に付加され る数値データを一般にマジック・ナンバと呼ぶ ● 先頭4バイトには必ず「7f 45 4c 46」(0x7f 'E' 'L' 'F')というデータが格納されていて、 これを見ることでそのファイルがELF形式であ ると判断することができる
  • 19. マジック・ナンバの識別情報 ● それぞれのバイトデータの意味は以下の通り 171頁 図5.1 先頭16バイトの識別情報 より
  • 20. マジック・ナンバがある理由 ● 識別情報として最初に確認できるように先頭に バイト単位で配置している – これらの情報を識別した後でないとデータを正しく 読むことができないから ● 9~15のバイトは予約領域、リザーブ領域などと 呼ぶ – 将来的にELF形式が拡張されて何か情報が追加され ても問題ないように用意されている
  • 22. セクション・ヘッダ・テーブル ● セクションの情報を管理しているヘッダの配列 Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .vectors PROGBITS 00000000 000094 000100 00 WA 0 0 4 [ 2] .text PROGBITS 00000100 000194 000654 00 AX 0 0 2 [ 3] .rodata PROGBITS 00000754 0007e8 0000a4 00 A 0 0 4 [ 4] .data PROGBITS 00fffc20 00088c 000004 00 WA 0 0 4 [ 5] .bss NOBITS 00fffc24 000890 000014 00 WA 0 0 4 [ 6] .comment PROGBITS 00000000 000890 00005a 00 0 0 1 [ 7] .shstrtab STRTAB 00000000 0008ea 000046 00 0 0 1 [ 8] .symtab SYMTAB 00000000 000ac0 0006c0 10 9 76 4 [ 9] .strtab STRTAB 00000000 001180 000250 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings) I (info), L (link order), G (group), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific)
  • 24. セクション・ヘッダ解説 ● セクション名は可変長なのでヘッダにそのまま 格納されていない – .shstrtabセクションにまとめて格納 ● 重要なのはアドレス(Addr)、セクションの位置 (Off)、セクションのサイズ(size) ● アドレスはセクションが配置されている位置 – いわゆるVAにあたる。.dataや.bssはRAM上に配置さ れているアドレス ● セクションの位置やサイズは、ELFファイル内 でどの部分がそのセクションとなるかを表して いる
  • 25. プログラム・ヘッダ・テーブル ● セグメントの情報を管理しているヘッダの配列 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000094 0x00000000 0x00000000 0x00100 0x00100 RW 0x1 LOAD 0x000194 0x00000100 0x00000100 0x006f8 0x006f8 R E 0x1 LOAD 0x00088c 0x00fffc20 0x000007f8 0x00004 0x00018 RW 0x1 Section to Segment mapping: Segment Sections... 00 .vectors 01 .text .rodata 02 .data .bss
  • 27. プログラム・ヘッダ解説 ● Type – LOADはメモリ上にロードされるセグメントというこ と。他に、動的リンク情報やプログラム・ヘッダ自 身がある ● Offset – ELFファイルの内部でのセグメント位置 ● FilSiz、MemSiz – ファイル中のサイズと、メモリ上のサイズ – 必ずしも同じ大きさではない
  • 29. プログラムの修正と追加 ● 追加ファイル – elf.h、elf.c...ELF形式の解析 ● 修正ファイル – main.c...ELF形式の解析コマンド追加 – Makefile...elf.oをコンパイル対象にする ● 修正部分はrunコマンド追加しただけ – ELFファイルのうち、セグメント情報を表示するコ マンド
  • 30. elf.c ● 今回はkzload.elfのセグメント情報をターミナ ルに表示するプログラムになっている ● 構造体が大きいのでわかりにくい – 構造体はELFヘッダの部分と、プログラムヘッダの 部分を取得する感じになっている – その構造体のデータを表示するだけ ● たぶん次からELFファイルをメモリに展開する プログラムになるんだと思う
  • 31. セクション・ヘッダが末尾の理由 ● プログラム・ヘッダがELFファイルの先頭付近 にあるのは、ファイルをダウンロードしながら メモリにロードできるようにするため – バッファ領域が小さいときはこういった形になる ● メモリの配置先情報を最初に確認できるように してるわけ ● セクション・ヘッダが末尾なのはロードに必要 ないから。サイズ節約やメモリ節約のときに、 セクション・ヘッダを捨てやすくしてる – 末尾にあったらオフセットを計算しなおしたり、面 倒なことせずにすむ
  • 33. まとめ ● ELF形式のファイルの内部構造を解析できるよ うになった ● 具体的には内部におけるそれぞれのヘッダを操 作できるようになった ● セグメント・ヘッダの取得はできるようになっ たので、それを元に内容をメモリ上に展開する プログラムを書くことになるのかな ● あ、あと書籍では論理回路について解説してい るページがあるけど、ここでは省く