和规划网站如何,保险公司网站建设方案,网站改版销售话术,ui设计看重学历吗读者朋友提问#xff1a; 昨天在后台看到一个读者朋友跟我说#xff0c;发哥#xff0c;你能不能讲一下嵌入式Linux的开机流程#xff0c;然后我看了下#xff0c;我是没有写过这方面的文章#xff0c;所以#xff0c;就有了这篇文章。回答#xff1a;我们都知道pc指针… 读者朋友提问 昨天在后台看到一个读者朋友跟我说发哥你能不能讲一下嵌入式Linux的开机流程然后我看了下我是没有写过这方面的文章所以就有了这篇文章。回答我们都知道pc指针吧我之前推荐大家看一本书叫《Linux内核艺术》如果你们看了这本书那么对开机流程什么的就非常非常清楚了。我这里讲的内容也不过是九牛一毛跟书籍里面的内容完整性相比差距还是很大。不过我可以把原理给大家说明清楚看了我的文章后再去看书籍可能效果会更加好。按下电源键打开电源好了我们继续上面的内容我们知道pc指针是指向当前需要执行程序的位置的但是刚上电什么都没有CPU需要去哪里找到要执行的程序呢这就需要预设置我们需要固化一段代码在ROM里面然后预先设置CPU上电执行的第一条指令的地址在X86里面是 FFFF:0000h 。在嵌入式设备里面根据不同的芯片厂商可能会设置不同原理很简单这个地址跟他们的启动时序有关系和分区也有关系所以会做相对应的修改。引导bootloader最近在做mtk的相关平台还有一个preloader的概念不管是什么loader包括我们在x86上面说的BIOS也就是basic input output system。都是为了引导系统服务的系统起来的之前是内核所以这些东西都是为了引导内核服务的。我们上面不是说了第一条指令会指向一个固定的ROM地址吗这个地址里面执行的东西从某种意义上来说也是bootloader的一部分。这些是概念性的东西属于帮忙内核引导的都可以认为是bootloader的一部分。但是因为芯片设计系统设计的原因可能会细分一些。比如我现在做的MTK平台在里面会以因为在loader里面做插入USB的判断还有一些其他比较前期的开机判断比如SMPS用来判断AC转换车工DC的供电是否正常等等。bootloaer是干什么吃的上面提了一些bootloaer的作用是用来引导内核的正常bootloaer会分成两个阶段。第一个阶段就初始化一些基本的东西让第二阶段的bootloader能够正常运行。第二个阶段做的事情就比较多比如初始化一些外设正常我们需要初始化的外设是显示和串口显示可以让我们看到当前的界面串口可以让我们看到日志输出。在这之前我们还需要初始化中断向量初始化内存初始化定时器看门狗这些是比串口和现实屏更加重要的。这些做完后就要给内核造房子让内核住进去也就是说我们把内核的镜像加载进入内存然后解压准备运行内核。内核的运行环境准备好后就把pc指针指向内核执行地址之后就是内核在运行了。内核会做什么事情呢从start_kernel开始内核开始了它一生的漫长生涯~内核刚起来的第一件事情就是检查硬件了内核还需要接收bootloader里面传过来的东西比如内存信息中断向量表有了这些东西内核就没有必要再去检测一次了。还有一个比较重要的就是去挂载根文件系统根文件系统是内核启动的关键因素没有这个内核是不能正常运行了。然后就去执行一些内核模块我们写的一些驱动都是以内核模块的形式存在的这时候就去执行内核模块的init函数。上面之后还需要准备用户空间的东西内核的存在是为了应用服务的所以这里需要准备用户空间执行的一些条件。然后加载第一个init进程。分享一张Android平台的开机流程上电的第一时间跑的是Boot ROM 里面的代码然后再去执行pre-loader后面会到Little Kernel然后再到kernel。晚上跟同事讨论的时候提到一个问题为什么pre-loader和Lk不能做成一起在LK里面运行的是一个C代码编译出来的产物在pre-loader需要提前把这个环境搭建好。唉我还是画个图整体的流程图如下工作模式切换嵌入式跟X86有点不一样嵌入式Linux的平台很多很多芯片厂商跟ARM签约拿到ARM授权后就可以开始做自己的芯片。X86我们在学习的时候知道在bootloader下跑实模式然后到内核后就转到保护模式。ARM有7种工作方式我们在不同的阶段会处在不同的工作方式中。像一些成熟的手机方案会加上modem芯片开机的时候还需要和modem通信复杂度又会增加一个档次。说到这里又不得不提到嵌入式和平台强相关性的问题。上面提到的《Linux内核设计的艺术》有喜欢的同学在后台回复会有下载链接。分享一个小故事因为在朋友圈里真的太火了。 推荐阅读 专辑|Linux文章汇总 专辑|程序人生 专辑|C语言嵌入式Linux微信扫描二维码关注我的公众号