12Stepで作る組み込みOS自作入門 3rdStep

今日は「12Stepで作る組み込みOS自作入門」の3rdStepをやってみた。

「12Stepで作る組み込みOS自作入門」はこの本。
下回りの知識つけたいけど何から手つけていいかわからなかったので、
少し触れたことのあるH8を使っていて、内容的にも面白そうなこの本使って勉強している。

今回の3rd Stepは主にリンカスクリプト、メモリの割り当てとは何かといった内容。
Step2までで作成したプログラムだと、次のような状態になっている。

  • プログラムはすべてROMに書き込んでいる状態
    ->後から書き換えができない。
    ->静的変数(global変数、static修飾子をつけた変数)は上書きできない。
    ->Cの文法に則っていても、期待動作しない!!
  • Stack領域はRAMに割り当てている
    ->auto変数はstack領域を使用するので問題なく使用可。

そのため、リンカスクリプトを何かを通して上記を修正していく。
ポイントは3つ

  • メモリ上に展開されたプログラムは以下の領域から構成される。
    • テキスト領域
      機械語コードが配置される
    • データ領域
      初期値を持つ静的変数などが置かれる
    • BSS領域
      初期値を持たない静的変数などが置かれる
  • 実行ファイル(ELFファイル)の内部はSection,Segment二種類の管理単位を持つ。

    • Section
      リンク時に、各objectファイルが持つ同じ領域の内容をリンカがまとめるためのもの
    • Segment
      プログラムの実行時にloaderが参照し、メモリ上に展開する際に使用されるもの
  • 初期値を持つ静的変数は最初はROMに値を記しておき、main関数に行く前にramにコピーすることで実現されている。

ポイントまとめるのむずいわ
まぁ文章書き、情報整理の練習の意味合いも含めてるので頑張る

あれ。。。初期値未指定の静的変数のゼロクリア処理したはずなのに、0ではない値が入っている。。。
どこ間違えてるか探さないと。
->ゼロクリア処理の関数名を間違えてました。。。

ついに次はブートローダー作成!!!