【組込OS自作入門】4thステップのメモ

このステップはブートローダ作成のための準備。

基本概念の勉強

ブートローダの必要性

今までのステップでは、直接フラッシュROMへ書き込みを行っていた。
しかし、フラッシュROMへの書き込み回数には上限がある。
これを避けるために使うのがブートローダ

ブートローダの機能

  • シリアル経由でOSの実行形式ファイルをダウンロードし、RAM上にいったん保存する
  • 保存した実行形式ファイルを、適切にRAM上に展開する。
  • RAM上に展開したOSを実行する

実行形式ファイルの転送にXMODEMプロトコルを使う。

ファイル転送プログラム

lrzszをインストール

apt-getでは入らなかったので,
ubuntuソフトウェアセンターからSynapticパッケージマネージャーをインストール.
そしてlrzszをインストール。

アセンブラの勉強

OS自作ではアセンブラは必須。
なぜならアセンブラでないと記述できない箇所があるから。

  • スタートアップ
  • 割り込みの入り口と出口
  • スレッドのディスパッチ
mov.l er6,@-er7
mov.l er7,er6
subs #4,er7
add.w r1,r0
mov.w r0,@(0xfffe:16,er6)
mov.w @(0xfffe:16,er6),r0
adds #4,er7
mov.l @er7+,er6
rts

一つ一つ見ていく。

mov.l er6,@-er7

movは第一変数を第二変数に格納する命令。
ER6はフレームポインタ。
ER7はスタックポインタ。
@er7とすると、レジスタの値をアドレス値として、そのアドレスが指すメモリを指している。
@-er7とすると、レジスタの値をデクリメントしてから、そのアドレスが指すメモリを指すことになる。

つまりスタックポインタを減算してから、レジスタの値(アドレス)の指すメモリに、er6の値を格納している。

mov.l er7,er6

スタックポインタであるER7の値をフレームポインタER6に代入している。

subs #4,er7

スタックポインタER7を4byte減算する
4byte文の領域をスタック上に確保。
#は即値を表す。

add.w r1,r0

R0とR1の値を加算する。
加算後の値はR0に代入される。

mov.w r0,@(0xfffe:16,er6)

ROの加算結果をスタック上の自動変数に格納する。
@(0xfffe:16,er6)は、ディスプレースメント付きレジスタ関節。

mov.w @(0xfffe:16,er6),r0

関数の戻り値はR0によって返される。
ムダ処理。

adds #4,er7

スタックポインタを4byte加算。

mov.l @er7+,er6

スタック上に退避されていたer6の値をER6に読み込む。
ロード後にER7は4byte加算される。

rts

関数呼び出しに戻る。