通过UART设计用于简单Z80系统的引导加载程序,在何处加载程序

时间:2012-10-06 02:38:51

标签: c assembly embedded bootloader z80

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

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

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

2 个答案:

答案 0 :(得分:2)

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

AFAIK,在Z80中只有中断向量,并且不支持在CPU本身中替换它们。您需要在硬件中放置一些可以替换内存块的东西。

在其他情况下,您需要具备以下功能:在下载过程中,引导加载程序不会在应用程序部分中使用任何内容,并阻止可以调用应用程序中任何内容的任何中断。

答案 1 :(得分:2)

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

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

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

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

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

  1. 禁用中断
  2. 从附加中断向量表中获取旧的ISR地址
  3. 将新的ISR地址放入表格
  4. 启用中断
  5. 删除ISR是显而易见的,与上述类似。

    新的ISR可以:

    1. 在完成工作之前调用旧的ISR(地址在上面的步骤2中保留)
    2. 完成工作后调用旧的ISR
    3. 只需在不调用旧ISR的情况下完成工作
    4. 您需要要求程序和引导程序使用此表,并在它们不再需要拥有自己的ISR时进行恢复。

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