本人初学者,以下仅为个人理解
引导过程(不包含bootloader的其他工作)
sdk加载spiflash的第0个扇区(bootloader从0x0000开始烧,还有bootloader的大小要控制小于4096字节,否则会造成越到第1个扇区,第1个扇区里默认是放用户配置数据的),接着sdk将bootloader中代码数据映射回dram和iram,接着进入bootloader的入口函数,接着bootloader找到第2个扇区开始的应用rom,接着bootloader完成将应用rom对应的要放在iram和dram的代码和数据映射回去,接着bootloader找到应用rom的入口函数地址,然后调用入口函数,此时bootloader工作完成,用户的应用程序开始启动
输出输入段分布
dram0_0_seg : org = 0x3FFE8000, len = 0x14000 : 输出.data(输入.data等段),输出.rodata(输入.rodata等段),输出.bss(输入.bss等段)
iram1_0_seg : org = 0x40100000, len = 0x8000 : 输出 .text(输入.text等段,这里和应用rom不同,应用rom将输入的.text段放在了irom0_0_seg中,这里做是因为操作flash的代码必须放在iram中)
irom0_0_seg : org = 0x40240000, len = 0x3C000 : 输出.irom0.text(输入.irom.text等段,.irom.text段在代码中除非明确指出否则不会代码默认是编译在.text段的) 注意 : 在别的地方看到有说操作flash的代码不能放在irom中,否则会造成 crash.[DH] ,这能解释为什么bootloader的连接脚本中将代码放在iram中的原因
用size命令查看如下 :
rboot.elf :
section size addr
.rodata 0x418 0x3ffe8000
.bss 0x0 0x3ffe8418
.text 0xac8 0x40100000
没有.data 和 .irom0.text 段 , 即源代码中没有变量(bootloader主要是选择rom,要操作spiflash,所以在输出段中没有.irom