【001 uboot】什么是bootloader?

一、什么是bootloader?

芯片上电以后先运行一段bootloader程序,这段bootloader程序会先初始化时钟、看门狗、中断、SDRAM等外设,然后将Linux内核从flash(NAND、NOR FLASH、SD、MMC等)拷贝到SDRAM中,最后启动Linux内核。当然了, bootloader的实际工作要复杂的多,但是它最主要的工作就是启动 Linux内核。

bootloader和Linux内核的关系就跟PC上的BIOS和Windows的关系一样,bootloader就相当于BIOS。总得来说,Bootloader就是一小段程序,它在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后启动操作系统内核。


二、常见的bootloader

有很多现成的 bootloader 软件可以使用,比如U-Boot、vivi、RedBoot等等,其中以U-Boot使用最为广泛。


三、为什么需要bootloader? 

为什么一定要uboot引导内核,为什么不包含在内核里面做成一个整体?
 

好,就按你的思路,我们把 uboot 放进 kernel,看看行不行。

从 CPU 上电开始说起:

CPU 上电,BIOS(CPU 内置的一小段代码)自检,并企图让 kernel 运行起来;kernel 要运行,必须将 kernel 加载到内存才行,BIOS 便尝试将 kernel 从硬盘读入内存,这时麻烦来了,BIOS 发现内存并没有被初始化,不能用啊。

BIOS 想,既然内存未初始化,我就初始化它呗,不过 BIOS 自身并没有初始化内存的代码(因为BIOS太小了,而且代码是固定的),那谁有这段代码呢?答案是 kernel。可是要想运行 kernel,又必须把 kernel 加载到内存。这不就形成死结了吗。。。

BIOS 冥思苦想了半天,终于想出来了一个办法,CPU 内部有 SRAM 啊,并且 SRAM 无需初始化就能直接使用,我可以将 kernel 加载到 SRAM 中运行啊,说干就干,BIOS 便开始将 kernel 加载到 SRAM,结果发现 kernel 有 100MB,SRAM 只有 64KB,加载个屁呀!

看样子 SRAM 是无法运行 kernel 了,不过 BIOS 依稀记得:kernel 的前面 4K 空间存储着初始化内存的代码。那就先将这 4K 加载到 cache 运行,用这段代码将内存初始化好,不就可以把内核加载到内存运行了吗。我真是个小机灵鬼,BIOS 心想。说干就干,结果还真被它给干成了,kernel 成功跑起来了。

过了一段时间,客户改了需求,需要升级固件,kernel 便下载新的固件并覆盖自己,注意,是覆盖自己,结果一不小心中途某个字节写错了,再次开机时,已经变砖了,你说悲剧不悲剧

后来又想到了一个办法,能不能从 kernel 分离出一小段代码,这段代码只负责升级等一些基础工作,由于小,不容易出错,也更稳定。说干就干,把一些基础功能,如升级固件等单独提取出来,我们称它为 uboot

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部