一些简单的系统初始化工作,之后跳转到内核需要执行的第一个C函数,内核开始运行。这是想法(2),请高手指点
我的理解是:前面所说的两点。
Bootloader之所以要“搬运”代码,是不是跟芯片本身的启动过程有关(除了上述两点之外)。
低端的单片机程序直接在片上Flash里面逐条向下执行,但是像ARM7和ARM9架构的芯片,片上
Flash很小,甚至干脆就没有,这类芯片的启动机制一般就是从Flash“加载”到SDRAM,然后
在SDRAM中运行程序。
是不是正是因为芯片的这种启动过程使得Bootloader的做法如此,Bootloaer实质上是根据芯片
的启动流程具体而定的。
你的想法基本上是对的,可以让操作系统在flash中跑,链接操作系统的时候应该注意把data区和bss区还有sp都要指向ram空间。还有操作系统在flash中跑会慢很多
非常感谢您的指点,经过了解总结Bootloader代码“搬运”的主要原因如下:
1、内核运行速度的要求。NorFlash虽然有随机存取的能力但是速度毕竟无法与SDRAM相比。
2、主流芯片的启动流程。对于ARM7和ARM9架构的芯片片内Flash很小或者干脆没有,上电后程序是在片外NorFlash或者SDRAM中运行。
3、NorFlash不仅相对SDRAM速度慢,而且价格相对NandFlash较高,选用NandFlash加SDRAM的方案能够保证成本,也能够保证内核运行速度,用软件完成代码的“加载”即可。
楼上仁兄,所说的.bss区应该就是分配在“栈”空间中的局部变量变量了吧,data区域应该就是系统中用到的一些常数,对吗?还是data区域是分配在“静态存储区”中的全局变量?应该是后者的可能性较多一些吧,如果是常数就是只读了,应该没有必要放在RAM了吧。
有点差别,bss段是指那些未初始化的全局变量或者初始化为0的全局变量(这和具体的工具链有关),date是指那些初始化过的全局变量,常量我们一般说rodata段
data区域是分配在“静态存储区”中的全局变量,常数就是只读,没有必要放在RAM。你的想法很好,我想不出来有什么不行。你完全可以试一下。(如果你现在的系统用的NORFLASH的话)不花你很多时间。
非常感谢大家的回复!
通过交流,关于Bootloader的基本概念和最基本的使用方法已经明确!再次感谢各位。
关于GNU中“段”的定义,“#6楼”说的很对,也感谢“#7”楼的回复。先为方便有后来人清晰概念,少走曲折,
总结如下:
.text:代码段。(指令序列,一般为只读)
.rodata:只读数据段。(如同C语言中的CONST,就是常量了)
.data:有初始值的数据段。(在C语言中定义一个“全局变量”并且赋予初始值,就会存入该段)
.bss:无初始值的数据段。(没有赋初始值的“全局变量”)
那么,局部变量到底放到哪里去了哪?局部变量分配在“栈”当中,用时分配,不用时释放,不在“段”当中,“全局变量”才会放入“段”。
通过交流,问题基本明朗,非常感谢!!
.data、.bss还有.rodata,都是"段",“#6楼”说的很对,非常感谢各位!
常量放在.rodata,呵呵....