你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

嵌入式Linux底层系统包含哪些东西?

[复制链接]
gaosmile 发布时间:2020-8-7 21:20
嵌入式Linux里含有bootloader, 内核, 驱动程序、根文件系统这4大块。
一、bootloader
它就是一个稍微复杂的裸板程序。但是要把这裸板程序看懂写好一点都不容易。Windows下好用的工具弱化了我们的编程能力。很多人一玩嵌入式就用ADS、KEIL。能回答这几个问题吗?
Q:一上电,CPU从哪里取指令执行?
A:一般从Flash上指令。

Q:但是Flash一般是只能读不能直接写的,如果用到全局变量,这些全局变量在哪里?
A:全局变量应该在内存里。
Q:那么谁把全局变量放到内存里去?
A:长期用ADS、KEIL的朋友,你能回答吗?这需要"重定位"。在ADS或KEIL里,重定位的代码是制作这些工具的公司帮你写好了。你可曾去阅读过?

Q:内存那么大,我怎么知道把"原来存在Flash上的内容"读到内存的"哪个地址去"?
A:这个地址用"链接脚本"决定,在ADS里有scatter文件,KEIL里也有类似的文件。但是,你去研究过吗?
Q:你说重定位是把程序从Flash复制到内存,那么这个程序可以读Flash啊?
A:是的,要能操作Flash。当然不仅仅是这些,还有设置时钟让系统运行得更快等等。

先自问自答到这里吧,对于bootloader这一个裸板程序,其实有3部分要点:
①对硬件的操作

微信图片_20200807212022.jpg

对硬件的操作,需要看原理图、芯片手册。这需要一定的硬件知识,不要求能设计硬件,但是至少能看懂; 不求能看懂模拟电路,但是要能看懂数字电路。这方面的能力在学校里都可以学到,微机原理、数字电路这2本书就足够了。想速成的话,就先放掉这块吧,不懂就GOOGLE、发贴。另外,芯片手册是肯定要读的,别去找中文的,就看英文的。开始是非常痛苦,以后就会发现那些语法、词汇一旦熟悉后,读任何芯片手册都很容易。

②对ARM体系处理器的了解
对ARM体系处理器的了解,可以看杜春蕾的<ARM体系架构与编程>,里面讲有汇编指令,有异常模式、MMU等。也就这3块内容需要了解。
③程序的基本概念:重定位、栈、代码段数据段BSS段等
程序的基本概念,王道当然是去看编译原理了。可惜,这类书绝对是天书级别的。若非超级天才还是别去看了。可以看韦东山的<嵌入式Linux应用开发完全手册>。

对于bootloader,可以先看<ARM体系架构与编程>,然后自己写程序把各个硬件的实验都做一遍,比如GPIO、时钟、SDRAM、UART、NAND。把它们都弄清楚了,组台在一起就很容易看懂u-boot了 。
总结一下,看懂硬件原理图、看芯片手册,这都需要自己去找资料。

二、内核
想速成的人,先跨过内核的学习,直接学习怎么写驱动。

想成为高手,内核必须深刻了解。注意,是了解,要对里面的调度机制、内存管理机制、文件管理机制等等有所了解。
推荐两本书:

1. 通读<Linux内核完全注释>,请看薄的那本
2. 选读<Linux内核情景分析>, 想了解哪一块就读哪一节

三、驱动
驱动包含两部分:硬件本身的操作、驱动程序的框架。又是硬件,还是要看得懂原理图、读得懂芯片手册,多练吧。
①硬件本身的操作
说到驱动框架,有一些书介绍一下。LDD3,即<Linux设备驱动>,老外写的那本,里面介绍了不少概念,值得一读。但是,它的作用 也就限于介绍概念了。入门之前可以用它来熟悉一下概念。
②驱动程序的框架
驱动方面比较全的介绍,应该是宋宝华的<Linux设备驱动开发详解>了。要想深入了解某一块,<Linux内核情景分析>绝对是超5星级推荐。别指望把它读完,1800多页,上下两册呢。某一块不清楚时,就去翻一下它。任何一部分,这书都可以讲上2、3百页,非常详细。并且是以某个目标来带你分析内核源码。它以Linux2.4为例,但是原理相通,同样适用于其它版本的Linux。

把手上的开发板所涉及的硬件,都去尝试写一个驱动吧。有问题就先"痛苦地思考",思考的过程中会把很多不相关的知识串联起来,最终贯通。

四、根文件系统
大家有没有想过这2个问题:
Q:对于Linux做出来的产品,有些用作监控、有些做手机、有些做平板。那么内核启动后,挂载根文件系统后,应该启动哪一个应用程序呢?
A:内核不知道也不管应该启动哪一个用户程序。它只启动init这一个应用程序,它对应/sbin/init。

显然,这个应用程序就要读取配置文件,根据配置文件去启动用户程序(监控、手册界面、平板界面等等,这个问题提示我们,文件系统的内容是有一些约定的,比如要有/sbin/init,要有配置文件 。
Q:你写的hello,world程序,有没有想过里面用到的printf是谁实现的?
A:这个函数不是你实现的,是库函数实现的。它运行时,得找到库。

这个问题提示我们,文件系统里还要有库。

简单的自问自答到这里,要想深入了解,可以看一下busybox的init.c,就可以知道init进程做的事情了。
当然,也可以看<嵌入式Linux应用开发完全手册>里构建根文件系统那章。

收藏 1 评论2 发布时间:2020-8-7 21:20

举报

2个回答
sincomaster 回答时间:2020-8-8 14:05:46
谢谢分享
toofree 回答时间:2020-8-9 15:14:44
标记一下,适合有一定入门基础的

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版