Bootloader 介绍
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语言运行环境。
对于bootloader的研究我觉得可以看一下start.s这个源代码,你会知道的更加清楚,不过是汇编的,理解起来会有点困难,要耐心看的..... 还有关于bootloader的移植,为什么要进行bootloader的移植呢,原因有2个 1是因为不同的板子之间的cpu体系结构不一样... 2是因为不同的板子之间的外围硬件设备不一样... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何编写代码以在C#中获取我的机器上的直接X版本?
- c – 为什么我必须将地址转换为整数以使其可分配?
- 使用Webpack进行React-Bootstrap和/或Bootstrap
- c# – 如何在crm之外的应用程序中从sql server获取选项集值
- SQLite数据库的upgrade方法
- c# – 为什么CastleWindsor的BeginScope超出范围?
- c# – 在使用正在回调的关闭连接时收到WCF异常
- c# – ApiController扩展方法 – 无法访问ResponseMessage
- 检测C源中枚举和#define同名的定义
- ruby-on-rails – 在Rails中创建可拖动可排序列表的最有效方