このステップはブートローダ作成のための準備。
基本概念の勉強
ブートローダの機能
- シリアル経由で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
関数呼び出しに戻る。