3

我已经开始为我的 z80 系统编写引导加载程序。到目前为止,程序可以通过串行接受十六进制并将其加载到内存中的某个位置。

我遇到的问题是引导加载程序位于内存的开头并使用中断,如何在不覆盖引导加载程序的情况下加载新程序?

(加载的程序也可能想要使用中断)

4

2 回答 2

2

最好和最广泛使用的方法是将您的应用程序拆分为永远不会更新的稳定引导加载程序,以及您可以不时替换的应用程序。

AFAIK,在 Z80 中只有中断向量,不支持在 CPU 本身中替换它们。你需要在你的硬件中有一些东西来替换你的内存块。

否则,您需要具有引导加载程序在下载期间不使用应用程序部分中的任何内容的功能,并阻止任何可以调用应用程序中任何内容的中断。

于 2012-10-06T02:42:09.350 回答
2

Wrt位置,您可以将引导加载程序放在地址空间的顶部,并在地址空间的开头加载程序。

您还可以在协议中包含程序的位置和大小,以便引导加载程序能够检查这对值是否与引导加载程序的位置和大小兼容(IOW,如果加载,程序是否会覆盖引导加载程序) .

另一种选择是在程序中包含重定位信息,并在引导加载程序中包含一个简单的重定位器。这样,如果有足够的可用内存,您就可以在任何位置加载程序。这就是许多操作系统在加载程序时所做的事情。

至于中断,我认为没有问题。谁或什么不允许程序使用中断?或者您是否希望引导加载程序说常驻并继续在后台执行某些操作或能够从程序返回到它?如果您不需要任何这些,只需让程序使用中断(您可能甚至不需要做任何事情来允许它)。

如果,OTOH,您确实希望引导加载程序保持功能,您可以通过维护一个额外的中断向量表来引入一个额外的间接层。主要 ISR 将从该中断向量表中提取次要 ISR 并跳转到那里。然后,您的引导加载程序和程序需要执行此操作才能添加新 ISR 或覆盖现有 ISR:

  1. 禁用中断
  2. 从附加中断向量表中获取旧的 ISR 地址
  3. 将新的 ISR 地址放入表中
  4. 启用中断

删除 ISR 很明显,与上述类似。

然后,新的 ISR 可以:

  1. 在工作之前调用旧的 ISR(地址保存在上面的步骤 2 中)
  2. 在完成工作后调用旧的 ISR
  3. 只做它的工作而不调用旧的 ISR

您需要要求程序和引导加载程序使用此表并在不再需要在其中包含自己的 ISR 时恢复它。

如果您通过在新 ISR 之前/之后执行旧 ISR 来链接 ISR,我不知道您可能需要解决哪些问题。但在某些系统中,这是一种可能的设计。许多 x86 PC 程序和驱动程序都是在 MSDOS 中完成的。

于 2012-10-06T06:29:00.190 回答