启动操作系统的Bootloader

用于启动操作系统的Bootloader,一般都需要将内核“搬移”到SDRAM中去运行,然而在逻辑系统下,
程序直接烧写到片内FLASH(应该是NorFlash吧)执行,不需要做什么搬移。

我有这样两个想法,请您指教:

1、之所以要“搬移”到SDRAM中运行,主要是因为NorFlash的价格和单片Flash的存储空间与NandFlash相比,
  劣势明显,一般都是使用NandFlash存储系统内核。然而,NandFlash不能够随机读写,只能按页读写,无法
  运行内核。这是想法(1),不知是否如此,请高手指点迷津...........

2、如果我的内核编译以后足够小,或者是我的片内Flash(比如单片机用于存储程序的闪存)足够大,使得我的内核
  可以放在这个片内Flash里面。这个时候我的bootloader是否就可以像单片机裸机程序上的“启动代码”那样,只做

  一些简单的系统初始化工作,之后跳转到内核需要执行的第一个C函数,内核开始运行。这是想法(2),请高手指点



引用 1 楼 flag_002 的回复:
看得有点糊涂,你是想直接从FLASH启动,不跳转内存吗,在FLASH中只做简单初始化,让系统跑起来,是这个意思吗?

注意启动映像不只是要让系统跑起来,更重要的是加载系统映像!


首先,非常感谢你的回复。
我说“系统跑起来”的意思就是“操作系统开始进行任务的调度”,也就是说操作系统的内核开始运行。你所说的这个“加载映像”本质应该还是属于代码的“搬移”吧,就是把他从永久性存储设备中“加载”(搬移)到SDRAM中。对吗?还是通过某种接口把“映像”装入这些永久性存储设备?

帖子目的主要是想探讨:操作系统的Bootloader和一般的裸机程序的“启动代码”有什么共性和区别,因为初学Bootloader和操作系统相关的东西,对很多东西比较陌生,想通过与熟悉的事物类比的方法加深一下认识。

我的理解是:前面所说的两点。

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,呵呵....





你可能感兴趣的:(启动操作系统的Bootloader)