3

z80システム用のブートローダーを書き始めました。これまでのところ、プログラムはシリアル経由で16進数を受け入れ、メモリ内の場所にロードできます。

私が抱えている問題は、ブートローダーがメモリの先頭にあり、割り込みを使用していることです。ブートローダーを上書きせずに新しいプログラムをロードするにはどうすればよいですか?

(また、ロードされたプログラムは割り込みも使用したい場合があります)

4

2 に答える 2

2

最も広く使用されている最善のアプローチは、アプリを、更新されない安定したブートローダーと、随時交換できるアプリケーションに分割することです。

AFAIK、Z80には割り込みベクトルだけがあり、CPU自体でそれらを置き換えることはサポートされていません。あなたはあなたのメモリブロックを置き換える何かをあなたのハードウェアに持っている必要があります。

それ以外の場合は、ダウンロード中にブートローダーがアプリ部分で何も使用しないという機能を備え、アプリ内で何かを呼び出す可能性のある割り込みをブロックする必要があります。

于 2012-10-06T02:42:09.350 に答える
2

場所については、ブートローダーをアドレススペースの上部に配置し、プログラムをアドレススペースの先頭にロードできます。

プログラムの場所とサイズをプロトコルに含めることもできます。これにより、ブートローダーは、値のペアがブートローダーの場所とサイズと互換性があるかどうかを確認できます(IOW、プログラムがロードされた場合にブートローダーを上書きするかどうか) 。

もう1つのオプションは、プログラムに再配置情報を含め、ブートローダーに単純な再配置子を含めることです。そうすれば、十分な空きメモリがあれば、どの場所でもプログラムをロードできます。これは、多くのOSがプログラムをロードするときに行うことです。

割り込みに関しては、問題はありません。プログラムが割り込みを使用することを許可しないのは誰または何ですか?または、ブートローダーに常駐と言って、バックグラウンドで何かを続行するか、プログラムからそれに戻ることができるようにしますか?これらのいずれも必要ない場合は、プログラムに割り込みを使用させるだけです(おそらく、それを許可するために何もする必要はありません)。

OTOHで、ブートローダーの機能を維持したい場合は、追加の割り込みベクトルテーブルを維持することで、間接化の追加レイヤーを導入できます。プライマリISRは、この割り込みベクタテーブルからセカンダリISRを抽出し、そこにジャンプします。次に、ブートローダーとプログラムは、新しいISRを追加したり、既存のISRをオーバーライドしたりするために、これを行う必要があります。

  1. 割り込みを無効にする
  2. 追加の割り込みベクタテーブルから古いISRアドレスを取得します
  3. 新しいISRアドレスをテーブルに配置します
  4. 割り込みを有効にする

ISRの削除は明らかであり、上記と同様です。

新しいISRは、次のことができます。

  1. 作業を行う前に、古いISRを呼び出します(アドレスは上記の手順2で保持されます)
  2. その作業を行った後、古いISRを呼び出します
  3. 古いISRを呼び出さずに作業を行うだけです

プログラムとブートローダーがこのテーブルを使用し、独自のISRが不要になったときにテーブルを復元するように要求する必要があります。

新しいISRの前後に古いISRを実行してISRを連鎖させる場合、どのような問題を解決する必要があるのか​​わかりません。しかし、一部のシステムでは、それが可能な設計です。多くのx86PCプログラムとドライバーがMSDOSでそれを行いました。

于 2012-10-06T06:29:00.190 に答える