【发布时间】:2012-03-29 13:51:43
【问题描述】:
我对bootloader和system SW并不陌生,但是不知道一般程序为什么从0x8000开始的原因。我已经知道地址 0x8000 已被用作普通 C/C++ 程序中的起始地址。
一般程序的引导加载程序的最小大小是否达到0x8000?或者应该分配给引导加载程序的 ROM 的最小块大小是 32KB?还是有其他原因?
我想从历史或逻辑上以及从虚拟地址的角度了解这一点。
感谢您在这方面的时间和帮助。 为了让问题更清楚,这个问题与虚拟地址有关,而不是与物理地址有关。
从物理内存地址的角度来看,我基本同意R的观点。
不说具体的系统是否多样化,例如linux(甚至在android中),通用RTOS(nucleus等,尤其是ARM链接器部分),它们都使用地址0x8000作为起始地址通用程序。 如crt_begin.o、crt.o等,位于0x0,带loader的区域存在。
因此,如果在启动时(冷启动)位于 BootROM 中,考虑到块大小,我猜一般程序的引导加载程序的最小大小为 32KB。
嗯,但我不确定……
【问题讨论】:
-
你在说什么系统?
-
我没有任何可靠的来源,但我可以做出一个合格的猜测。从历史上看,许多处理器,尤其是 8 位处理器,都具有称为 zero page 的功能,这意味着地址 0x00 - 0xFF 的内存单元具有指令支持以更快地执行。我相信这是摩托罗拉在过去引入的,因为他们在 6800 等旧 MCU 上具有内存映射 I/O 寄存器。->
-
因此,您希望内存的第一个区域被 RAM 单元或特殊寄存器占用。然后,零页之后的地址空间部分具有相同的性质是有道理的:RAM 和/或寄存器。这将占用大量 kb,可能高达 0x6000 或类似的。然后我假设将 ROM(程序存储器)放在偶数地址很方便,而 0x8000 很方便。我相当肯定这个问题的答案可以在早期的摩托罗拉处理器设计中找到。
-
这可能是相关的:en.wikipedia.org/wiki/ELF_binary。也许大小是为了与以前的格式兼容?
标签: c++ c linker bootloader