给你准备的Linux启动流程

读者朋友提问:

昨天在后台看到一个读者朋友跟我说,发哥,你能不能讲一下嵌入式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

微信扫描二维码,关注我的公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[linux]服务器apache配置vhost

官网示例: http://httpd.apache.org/docs/current/vhosts/examples.html转载于:https://www.cnblogs.com/oDoraemon/p/7650748.html

java dao 单元测试_Spring Service、Dao进行Junit单元测试

pring对Controller、Service、Dao进行Junit单元测试总结​ 所有用Junit进行单元测试,都需要下面的配置RunWith(SpringJUnit4ClassRunner.class)ContextConfiguration(locations {"classpath:applicationContext.xml"})​ applicationContext.xml 是整个项…

Linus Torvalds:我们都老了,但Linux维护者真的很难找

Linux 之父Linus Torvalds非常担忧没人继续维护内核「真的很难找到维护者!」在本周召开的Linux开源峰会与嵌入式大会上, VMware的首席开放源代码官Dirk Hohndel和Linux的创建者Linus Torvalds再次就Linux开发展开了远程对话讨论。左:Dirk Ho…

判断线程结束

判断线程结束 使用ExecutorService.isTerminated方式 public void executor() throws InterruptedException{ExecutorService executorService Executors.newFixedThreadPool(threadNum);List<Callable<Object>> calls new ArrayList<>();for (int i 0; …

java map扩容机制_java中ConcurrentHashMap的扩容机制是怎样的?详细解析

大家都知道java中有很多的基础知识&#xff0c;需要大家花费一定的时间去消化。关于java中ConcurrentHashMap的扩容机制不知道大家是否了解过&#xff0c;其实内容也是很好理解的&#xff0c;一起来看看吧。首先&#xff0c;我们需要知道的是&#xff1a;1. 计算每个线程可以处…

看printk引发的一点思考

在源码位置kernel/printk/函数原型asmlinkage __visible int printk(const char *fmt, ...) {printk_func_t vprintk_func;va_list args;int r;va_start(args, fmt);/** If a caller overrides the per_cpu printk_func, then it needs* to disable preemption when calling pr…

寄语

寄语&#xff1a; 前面漆黑一片&#xff0c;什么都看不到。 也不是&#xff0c;天亮后就会很美的。转载于:https://www.cnblogs.com/doudou-taste/p/7660997.html

我毕业时候写的简历

写简历这个事情&#xff0c;一直是一个非常让人头疼的&#xff0c;在我看来&#xff0c;写简历并不是一件简单的事情&#xff0c;所以&#xff0c;现在是晚上一点钟&#xff0c;我倒腾了一个晚上&#xff0c;才有了这篇文章。我认为写简历有几个需要注意的地方&#xff0c;不啰…

idea java 非法字符_解决IDEA显示非法字符 \ufeff 的问题

一、问题在txt文本中复制代码进入IDEA报错Error:(1, 1) java: 非法字符: ‘\ufeffError:(1, 10) java: 需要class, interface或enum二、解决办法用IDEA转换&#xff0c;先转换为GBK&#xff0c;再转回UTF-8()补充知识&#xff1a;Eurake问题Failed to bind properties under eu…

css 单行/多行文字垂直居中问题

例子可以直接看这里 http://www.zhangxinxu.com/study/200911/line-height-text-v-center.html 这篇文章中有一点点解释 http://blog.csdn.net/hdchangchang/article/details/47086565 这一篇提出了一个新想法 http://caibaojian.com/css-vertical-middle.html 总的来说&#x…

Linux 内核完成接口

Linux 内核里面有一个函数wait_for_completion&#xff0c;这是一个内核同步机制的函数&#xff0c;同步机制如果是早期的读者应该看过我发的文章&#xff0c;如果没有看过的可以看看Linux 专辑文章里面找找。既然是同步机制&#xff0c;主要的工作就是调用了这个函数&#xff…

java 换行符 常量_6.java常量

Java中常量的分类&#xff1a;整数常量 &#xff1a; 所有整数小数常量 &#xff1a; 所有小数布尔常量 &#xff1a; 只有true和false字符常量 &#xff1a;使用’’引起来的单个字符字符串常量 &#xff1a;使用“”引起来的字符序列&#xff0c;“” 、“a” 、” ”null常…

关于测试

这是5月份和公司同仁做的分享&#xff0c;分享主题是关于测试&#xff0c;是我自己对于测试的一些认知&#xff0c;以及态度的转变。 目录 以怎样的心态面对测试 安全测试贯穿整个软件生命周期 总结 以怎样的心态面对测试 提问大家几个小问题&#xff1a; 你喜欢测试吗&#…

涨疯了,历史总是如此相似

2015年的股市&#xff0c;如果你经历过&#xff0c;那你一定会记忆犹新。最近的股市太猛了&#xff0c;写一篇文章纪念一下~mark上周五&#xff0c;在一个炎热的晚上&#xff0c;我跟4个股神在深圳坪洲的某个火锅店相遇&#xff0c;虽然他们都是富甲一方的富豪&#xff0c;虽然…

java基础语句_【Java基础-Java语言基础】

知识点&#xff1a;1.关键字  2.标识符  3.变量和常量一、关键字1.Java中的关键字有很多一共53个关键字有两个是保留字(java的关键字都是小写的&#xff01;&#xff01;)2.Java中的保留字(1)const  常量&#xff0c;数量(2)goto   转到3.Java的关键字(1)访问修饰符的关…

【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树

【BZOJ3514】Codechef MARCH14 GERALD07加强版 Description N个点M条边的无向图&#xff0c;询问保留图中编号在[l,r]的边的时候图中的联通块个数。 Input 第一行四个整数N、M、K、type&#xff0c;代表点数、边数、询问数以及询问是否加密。接下来M行&#xff0c;代表图中的每…

安卓9.0Sensor框架

前言本来如果只是给传感器写个驱动并提供能读取温湿度数据的节点&#xff0c;是一件比较轻松的事情&#xff0c;但是最近上层应用的同事要求我们按照安卓标准的流程来&#xff0c;这样他们就能通过注册一个服务直接读取传感器事件数据了。这样做的好处就是第三方的应用也能正常…

java ognl表达式_java -------ognl表达式入门

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼------------------------------------------------------------------------------------ognl:对象表达式语言&#xff0c;可以用一个表达式快速地访问一个对象的属性&#xff0c;还可以调用对象的方法--------------------------…

Theano 更多示例

Logistic函数 logistic函数的图&#xff0c;其中x在x轴上&#xff0c;s(x)在y轴上。 如果你想对双精度矩阵上的每个元素计算这个函数&#xff0c;这表示你想将这个函数应用到矩阵的每个元素上。 嗯&#xff0c;你是这样做的&#xff1a; xT.dmatrix(x) s1/(1T.exp(-x)) logisti…

SensorKernel层框架分析

接上文安卓9.0Sensor框架前言前面我们已经讲解了sensor框架中的framework到vendor层&#xff0c;这篇文章我们将会讲解kernel层的内容。不过不同的芯片平台&#xff0c;kernel层中的sensor框架是不同的&#xff0c;这里针对的是mt8167s平台。不过这里提醒一下&#xff0c;MTK平…