嵌入式Linux系统= bootloader + linux内核 + 根文件系统(里面含有APP)
-
bootloader
它的目的是启动内核,去哪等读内核?读到哪里?去Flash等外设读内核,存到内存里去。所以需要有Flash里外设的驱动能力,为了调试方便还会有网络功能。
所以,可以认为 booloader = 裸机集合,它就是一个复杂的单片机程序。
要学习bootloader吗?Bootloader有很多种,常用的叫作u-boot。在实际工作中,对于u-boot基本上是修修改改,甚至不改。但是u-boot本身是很复杂的,比如为了便于调试,它支持网络功能;有些内核是保存在FAT32分区里,于是它要能解析FAT32分区,读FAT32分区的文件。花那么多精力去学习u-boot,但是工作中基本用不到,这对初学者很不友善。所以,对于初学者,我建议:理解u-boot的作用、会使用u-boot的命令,这就可以了。 -
Linux内核
Linux内核的最主要目的是去启动APP,APP保存在哪里?保存在“根文件系统”里。“根文件系统”又保存在哪里?在Flash、SD卡等设备里,甚至可能在网络上。所以Linux内核要有这些Flash、SD卡里设备的驱动能力。
不仅如此,Linux内核还有进程调度能力、内存管理等功能。
所以:Linux内核 = 驱动集合 + 进程调度 + 内存管理等。
人人都要学习Linux内核,但是人人都要学习Linux驱动吗?显然不是。
作为初学者,懂几个简单的驱动程序,有利于工作交流;理解中断、进程、线程的概念,无论是对驱动开发、应用程序开发,都是很有好处的。所以对于初学者,建议前期只学习这几个驱动:LED、按键、中断。
① LED驱动程序:这是最简单的驱动程序。
② 按键驱动程序:它也比较简单,从它引入“中断”。
③ 中断:从“中断”它可以引入:休眠-唤醒、进程/线程、POLL机制、异步通知等概念。
这些概念无论是对驱动开发,还是对应用开发,都很重要。所以,对于初学者,我建议必须学习这几个驱动:LED、按键、中断。
入门之后,如果你想从事内核开发、驱动开发,那么可以去钻研几个驱动程序(输入系统、I2C总线、SPI总线等),掌握若干个大型驱动程序后,你对内核的套路就有所了解了,再去研究其他部分(比如进程管理、文件系统)时你会发现套路是如此通用。摄像头(VL42)、声卡ALSA驱动是Linux中比较复杂的2类驱动,它们是很难的,如果工作与此相关再去研究。
要学习Linux应用程序吗?先学一些基础技能
要学,即使以后你只想研究内核,一些基本的应用开发编写能力也是需要的:
① 基本设备的访问,比如LCD、输入设备
② 进程、线程、进程通信、线程同步与互斥
③ 休眠-唤醒、POLL机制、信号
④ 网络编程
①②③部分的知识,跟驱动有密切的关系,它们是相辅相承的。 -
根文件系统
应用程序是怎么启动的?要了解一下根文件系统
你辛辛苦苦写出了应用程序,怎么把它放到板子上,让它开机就自动启动?你写的程序,它依赖于哪些库,这些库放到板子上哪个目录?怎么做一个可升级的系统?即使升级中途断电了,也要保证程序至少还可以运行老的版本?
这些都需要我们了解一下根文件系统。先了解一下init进程:它要读取配置文件,根据配置文件启动各个APP。了解了init进程,你就了解了根文件系统的组成,就可以随心所欲裁剪系统,为你的项目制作出最精简的系统。
总的来说
- 先理解bootloader (uboot),知道怎么使用
- 学习Linux内核,先学习几个简单的驱动程序,再学基本的应用编写
- 理解根文件系统,理解初始化进程