在s3c2440里,烧写内核镜像uImage时,通过tftp 或者 nand write烧写的地址都是0x30008000。
当时我有个疑问,为什么是这个地址?如果换成别的地址是否可行?
1,为什么是0x30008000这个地址?
在 arch/arm/kernel/head.S中有解释
此处说明在虚拟地址的前16k的空间存放着页表,建议内核ram的起始地址设置到0x8000的位置,也就是偏移32k。
或者在uboot的板级文件board/samsung/smdk2410/config.mk中也有解释:
只是这个解释不见得每一个板卡都会给写。
2,那么只能放这种 内存 + 偏移0x8000的地址么?
不见得必须,在Hi3516a烧写内核时, ddr的起始地址时0x80000000,而内核的烧写位置是0x82000000。
也就是放到一个不要和页表的冲突的位置,仍然以2410的板卡为例,2410的内存大小是64M,从0x300000000到0x34000000,
uboot的起始位置是0x33f80000,假如一个1M的内核烧写的位置覆盖了0x33f80000,那就死机。
3,地址0x33f80000。 (smdk2410板卡)
2410的内存大小是64M,从地址0x30000000到0x34000000,从0x33f80000到末尾的大小是512k,这个地址依然是在板级config.mk中定义的,一般这个文件也就这么一行定义:TEXT_BASE=0x33f80000; TEXT_BASE是uboot启动的重要参数,代表着uboot代码段的初始地址,也就是板卡上电后,从nand中拷贝uboot到这个位置进行执行。
以上的位置,都是板卡推荐的地址,而不是固定不变的,如果烧写的uboot大小超过了512k,那么就把33f80000h改一下。如果烧写的内核比较大,那也把内核的地址改一下,内核的位置只要不和页表冲突,就可以先计算大小,然后修改起始地址,当然如果是推荐的那种0x30008000,这相当于可烧写的0地址了,也就没改的必要了。