bootloader的界说:
相当于pc机的BIOS,在操作体系发动内核运转之前运转的一段小程序,经过这段小程序咱们能够初始化cpu内部的硬件设备,树立内存空间映射规模,从而将体系的软硬件环境带到一个适宜的状况,以便终究调用os内核准备好正确的环境。
能够得出bootloader首要有2个使命,1是初始化cpu内部的硬件设备,2是将os kernel带到内存中去。
在讲bootloader之前,咱们先讲讲pc机的发动进程,
pc机中有bois,这个是固化在硬件的,当pc机一加电今后,bios就会自己发动,完结硬件检测和资源的分配,然后将硬盘中的引导程序调入内存,然后把控制权交给引导程序,引导程序首要的用处便是将操作体系的kernel调入内存,然后跳转到内核的开端地址,然后os就开端发动了。
就pc而言,发动的进程相对杂乱,从bios—>引导程序(grub等)—->os
可是嵌入式体系来说,他没有bios这样硬件,所以它的发动进程全部都是交给bootloader去完结的。
bootloader是放在flash的最前面的方位,原因是:
体系在加电或复位的时分,一切的cpu一般都从cpu制造商预先安排地址开端履行的,(一般是0x00000000方位),所以bootloader一般是放在flash中的最前面的方位。
这是一个简易的flash分布图,bootloader在flash的最前端。
关于bootloader的发动进程还能够分为两种,1是单阶段,2是多阶段的
现在许多的bootloader是2个阶段的
stage 1 的进程(用的是汇编)
1是初始化硬件设备(cpu内存的硬件设备)
2是初始化stage2 要运用的内存空间
3是把stage 2的代码copy到内存中去
4初始话仓库
5是跳转到c的进口函数
stage 2(c言语)
1.初始化本阶段的硬件设备(板载硬件设备)
2.将os kernel导入到内存中去
3.调用内核
stage 1是用汇编写,首要是是为了装备能让c言语运转环境。
这个是一个详细的flash的结构图,bootloader 在履行第一个部分的时分,也便是stage1的时分,会把bootloader stage2这部分copy到ram中去运转,为什么呢,我觉得一个在内存中运转总是比在flash中履行要好,第二我觉得能履行code的flash有必要是nor flash,这样的flash相对本钱也就高了。所以就会发生这个部分。当stage2的时分,会将kernel也copy到内存中,然后在完毕的阶段,让履行地址跳转到操作体系的进口地址,那样的话操作体系也就自己发动来了。
假如剖析过2440的官方代码的话,里边有一个start.s 这个汇编代码,这能够当作一个小型的bootloader,由于他也完结了自发动的进程,不过他发动的是你的程序而不是操作体系,不过效果很类似。
在上面咱们知道bootloader stage1这个阶段的代码是运转在flash中的,假如flash是nor flash的话也是能够的,不过假如你的开发板是不带nor flash的话则就不能了。nand flash是不能让代码运转在flash的,所以他的自发动进程是比较杂乱的。他的cpu有一个4k ram 在加电的时分是被当作垫脚石运用的,当板子加电今后,硬件会主动把flash最前面的code copy到这个内存中的,也便是bootloader stage1这个部分,在这4kB的空间中的代码有必要要完结讲代码copy的内存中去
关于bootloader的研讨我觉得能够看一下start.s这个源代码,你会知道的愈加清楚,不过是汇编的,了解起来会有点困难,要耐性看的…..
还有关于bootloader的移植,为什么要进行bootloader的移植呢,原因有2个
1是由于不同的板子之间的cpu体系结构不一样…
2是由于不同的板子之间的外围硬件设备不一样…