发在其他区没人理。。转发在这里,
为什么uboot里面出现很多字节对齐?
有的时候是5字节,有的时候是16字节?
比如下面这段cpu里的 start.s,最后有个16字节对齐,用无效的deadbeef填充,这起什么作用?
另外顺便问一下,这段代码里,为什么如果是nandflash启动,就要加上64字节的偏移?
再顺便问一下,abort stack 是什么意思?。。为什么代码前后要留12字节的abort stack
谢谢
- Assembly code
.globl _start_start: b reset#ifndef CONFIG_NAND_SPL ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq_pad: .word 0x12345678 /* now 16*4=64 */#else . = _start + 64#endif.global _end_vect_end_vect: .balignl 16,0xdeadbeef
------解决方案--------------------
我的个人理解,未必正确,供参考。
deadbeef填充就是一个标志,因为有些FLASH的默认值是全0或者全FF,所以一般用这两种之外的其它字节填充。通常要考虑不能全部用用一个字节,降低巧合的概率。deadbeef就是好记呗,恰好是两个单词。
字节对齐一般要看后面的程序是什么要求了。它要求在什么样格式的地址运行,前面的程序就填一些数据,把地址凑到满足要求。
NAND FLASH不支持随机读取,也就是说,代码不能直接跑在FLASH上。一般声称可以支持NAND FLASH启动的系统,是内置了NAND FLASH的驱动,启动时将NAND开头的一部分代码复制到内存里。所以我理解如果是NAND启动,前面一些程序是不需要的,但是为了保持和NOR启动的程序地址一样,不能直接删掉,所以就留空了64。