Ofu*_*sJK 43 c c++ linker bootloader
我不是bootloader和系统SW的新手,但我不知道一般程序开始的原因0x8000.我已经知道该地址0x8000已被用作普通C/C++程序中的起始地址.
一般程序的引导加载程序的最小大小是否占用0x8000?或者是应该分配给32KB引导加载程序的ROM的最小块大小?还是有其他原因吗?
我想从历史或逻辑上以及从虚拟地址的角度来了解这一点.
我感谢所有人,你的时间和帮助.为了使问题更清楚,问题与虚拟地址有关,而与物理有关.
从物理内存地址的角度来看,我基本同意R的意见.
没有说一个多样化的特定系统,例如linux(甚至在android),一般RTOS(核心,以及其他,特别是ARM链接器部分),它们都使用地址0x8000作为起始地址通用程序.如此命名为crt_begin.o,crt.o等位于0x0的加载器存在于该区域.
因此,如果在启动时将其置于BootROM(冷启动),考虑到块大小,我猜一般程序的引导加载程序的最小大小为32KB.
嗯,但我不确定......
R..*_*R.. 19
通常,除了最小的嵌入式系统之外,平台ABI设计者希望避免使用最低的地址,以便可以捕获空指针解引用.如果使用数组或结构成员偏移取消引用空指针,则具有几KB永无有效的地址可为您提供额外的安全性,如null_ptr->some_member.
它取决于系统,程序从不同系统的不同地址开始.在Unix下,通常(或者甚至可能需要Posix)使用地址0作为空指针,并且不映射虚拟内存的第一页,因此取消引用空指针将导致段违规.我怀疑使用地址0作为空指针的其他系统表现相似(但它们保留多少可能会有所不同).(从历史上看,通常将第一页映射为只读,并用零填充,这样做空指针的行为就好像它是一个空字符串,指向它"".但是,这可以追溯到大约25年.)
我希望即使在今天,一些嵌入式系统也会从地址0开始加载程序.
| 归档时间: |
|
| 查看次数: |
12979 次 |
| 最近记录: |