eTakazawa / makeos

0 stars 0 forks source link

ELFフォーマットの展開(5章) #5

Open eTakazawa opened 4 years ago

eTakazawa commented 4 years ago

ELF形式について

gccのデフォルトの出力ファイル形式はELF形式
基本これで十分らしい

やりたいのはセグメントの情報をメモリにロードする

セクションとセグメント

セクション

機械語コードや静的変数のデータをそれぞれ一箇所にまとめておく.
基本同じセクションを同じセクションにリンクでこれをまとめる

セグメント

リンク後に生成

「ローダ」がセグメント情報を見てメモリ上へ展開

ELF形式の内部構造

- ELFヘッダ
- プログラムヘッダテーブル
  - プログラムヘッダ
- セグメント
  - セクション
- セグメント
  -セクション
- セクションヘッダテーブル
  - セクションヘッダ
eTakazawa commented 4 years ago

セクションヘッダ

セクションヘッダ:
  [番] 名前              タイプ          アドレス Off    サイズ 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 00009c 00   A  0   0  1
  [ 4] .data             PROGBITS        00fffc20 000884 000014 00  WA  0   0  4
  [ 5] .bss              NOBITS          00fffc34 000898 00001a 00  WA  0   0  4
  [ 6] .shstrtab         STRTAB          00000000 000898 00003d 00      0   0  1
  [ 7] .symtab           SYMTAB          00000000 000a40 0007b0 10      8  89  4
  [ 8] .strtab           STRTAB          00000000 0011f0 0002d9 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  p (processor specific)

PROGBITS がプログラム本体

アドレスは「VA」.そのセクションが動作するアドレス.

プログラムヘッダテーブル(セグメント情報)

プログラムヘッダ:
  タイプ       オフセット 仮想Addr   物理Addr   FileSiz MemSiz  Flg Align
  LOAD           0x000094 0x00000000 0x00000000 0x00100 0x00100 RW  0x1
  LOAD           0x000194 0x00000100 0x00000100 0x006f0 0x006f0 R E 0x1
  LOAD           0x000884 0x00fffc20 0x000007f0 0x00014 0x0002e RW  0x1

 セグメントマッピングへのセクション:
  セグメントセクション...
   00     .vectors
   01     .text .rodata
   02     .data .bss

3章のissueと同じ.
仮想Addr がVAで,物理Addrが PA.

eTakazawa commented 4 years ago

実行結果

kzload> load
~+ lsx kzload.elf
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
Sending kzload.elf, 46 blocks: Give your local XMODEM receive command now.
Bytes Sent:   6016   BPS:658

Transfer complete

XMODEM receive succeeded.
kzload> dump
size: 1780
7f 45 4c 46 01 02 01 00  00 00 00 00 00 00 00 00
00 02 00 2e 00 00 00 01  00 00 01 00 00 00 00 34
eTakazawa commented 4 years ago

6章

エントリポイント

セグメントをRAM上に展開 → 処理を渡す(エントリポイント,スタートアドレス)

[takazawa@tk2-231-25262 os]$ readelf -a kozos.elf
ELF ヘッダ:
  マジック:  7f 45 4c 46 01 02 01 00 00 00 00 00 00 00 00 00
  クラス:                            ELF32
  データ:                            2 の補数、ビッグエンディアン
  バージョン:                        1 (current)
  OS/ABI:                            UNIX - System V
  ABI バージョン:                    0
  型:                                EXEC (実行可能ファイル)
  マシン:                            Renesas H8/300
  バージョン:                        0x1
  エントリポイントアドレス:          0xffc020   ←エントリポイント
  プログラムの開始ヘッダ:            52 (バイト)
  セクションヘッダ始点:              1232 (バイト)
  フラグ:                            0x810000
  このヘッダのサイズ:                52 (バイト)
  プログラムヘッダサイズ:            32 (バイト)
  プログラムヘッダ数:                2
  セクションヘッダ:                  40 (バイト)
  セクションヘッダサイズ:            8
  セクションヘッダ文字列表索引:      5

セクションヘッダ:
  [番] 名前              タイプ          アドレス Off    サイズ ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        00ffc020 000074 0003e4 00  AX  0   0  2 ← すべてRAMに配置されている(0x00ffc***)
  [ 2] .rodata           PROGBITS        00ffc404 000458 000038 00   A  0   0  1
  [ 3] .data             PROGBITS        00ffc43c 000490 00000c 00  WA  0   0  4
  [ 4] .bss              NOBITS          00ffc448 00049c 000020 00  WA  0   0  1
  [ 5] .shstrtab         STRTAB          00000000 00049c 000034 00      0   0  1
  [ 6] .symtab           SYMTAB          00000000 000610 000570 10      7  58  4
  [ 7] .strtab           STRTAB          00000000 000b80 000223 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  p (processor specific)