割込みハンドラを配置するアドレスを特定のアドレスに記述しておくというものです。この「ハンドラのアドレスを記述しておく特定のアドレス」を割込みベクタと呼び、この方法をベクタ割込み方式と呼びます。
割込みが発生すると、CPUは割込みベクタを参照してハンドラの配置場所を知り、そこに強制的に処理が飛びます。

H8はベクタ割込み方式で、割込みベクタは割込みの種類に応じて、アドレスが0x000000~0x0000ffのメモリ上に配置されています。割込みにはいくつか種類がありますが、まず知らなければならないのはリセット・ベクタです。

電源ONやリセットも割込みの一種です。H8は、リセットが発生するとリセット・ベクタを参照してそこから動作を開始します。

H8では、割込みベクタの先頭がリセット・ベクタになっています。

ここで注目は、vector.cのvector[]という配列を定義しています。
vector[0]にはstart関数のアドレスが設定されており、それはstartup.sで記述したラベルのことです。

4thステップでファイルをRAMにおくことまでしたが、そこからプログラム・ヘッダ・テーブルを抽出する作業を実施した。

プログラム・ヘッダ・テーブルはセグメント情報でメモリにロードされるもの。

とりあえず、H8でもしっかりプログラム・ヘッダ・テーブルをコントロールできそうかの確認。

プログラム・ヘッダ・テーブルに関して、送信前のファイルと送信後にメモリに置かれたファイルのダンプをを比較した。

問題なさそうだ。

H8のダンプから
$OS自作してみる。-run

ELFファイルの中身から
$OS自作してみる。-elf_ph
Program Headers:
Type Offset VirtAddr PhysAddr 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

Section to Segment mapping:
Segment Sections...
00 .vectors
01 .text .rodata
02 .data .bss


項目内容は以下になります。
|表記|サイズ(byte)|意味|
------------------------------------
|Type|4|セグメントの種別|
|Offset|4|セグメントのファイル中の位置|
|VirtAddr|4|セグメントの論理アドレス(VA)|
|PhysAddr|4|セグメントの物理アドレス(PA)|
|FileSiz|4|セグメントのファイル中のサイズ|
|MemSiz|4|セグメントのメモリ上でのサイズ|
|Flg|4|各種フラグ|
|Align |4|セグメントのアラインメント|

TypeはすべてLOADです。これはメモリ上にロードされるセグメントということです。
種別はこのほかに「動的リンク情報」「プログラム・ヘッダ自身」というものがあるようです。

OffsetはELFファイルのセグメントの位置情報でファイルの先頭から何バイト目に位置するものかを示しています。

VirtAddr(仮想アドレス)とPhysAddr(物理アドレス)はVA≠PAになっています。

FileSizはファイル中のサイズでMemSizはメモリ上のサイズです。bssがあるかないかの違いです。

FlgはR,E,Wなどが表示されています。Eは実行可能、Rはリード可能、Wは書き込み可能という意味です。H8はメモリ保護機能を持たないためあまり意味はないのですが、メモリ保護機能を持つCPUの場合は、たとえば書き込み不可のセグメントはロード時にローダが書き込み不可の設定を行ってから機動することで、メモリ保護を行うことができます。