从上图我们可以知道:①组成:嵌入式Linux系统=bootloader+linux内核+根文件系统(包括APP)。②bootloader:它的作用是启动内核,从哪里读取内核?你在哪里读到的?去Flash等外设读取内核,存入内存。因此需要具备Flash中外设的驱动能力,同时还要具备网络功能,方便调试。因此,可以认为booloader=baremetalcollection,是一个复杂的单片机程序。③Linux内核Linux内核的主要作用是启动APP。APP保存在哪里?存放在“根文件系统”中。“根文件系统”保存在哪里?在闪存、SD卡等设备中,甚至在网络上。所以Linux内核必须具备这些Flash和SD卡设备的驱动能力。不仅如此,Linux内核还具有进程调度能力和内存管理等功能。所以:Linux内核=驱动集+进程调度+内存管理等。1.学习bootloaderbootloader有很多种,常用的叫u-boot。实际工作中,u-boot基本上是修改或者不修改。但是u-boot本身就很复杂。例如,它支持用于调试的网络功能;一些内核存储在FAT32分区,所以它必须能够解析FAT32分区并读取FAT32分区中的文件。学习u-boot耗费了那么多精力,但是在工作中基本用不到,对初学者很不友好。所以,对于初学者,我建议:了解u-boot的功能,知道如何使用u-boot命令,就可以了。如果你的工作是修改和完善bootloader,那就去研究吧。2、学习Linux内核,是不是要学习驱动?之前我们说过Linux内核=驱动集+进程调度+内存管理等等,想要学习Linux内核,从驱动入手是个不错的途径。但是是不是每个人都需要学习linux内核,每个人都需要学习linux驱动呢?很明显不是。作为初学者,了解一些简单的驱动程序,有利于工作交流;了解中断、进程、线程的概念,对驱动开发和应用程序开发非常有益。所以对于初学者来说,建议前期只学习这几个驱动:LED、按键、中断。①LEDDriver:这是最简单的驱动。②Buttondriver:也比较简单,“interrupt”就是从中引入的。③中断:从“中断”出发,可以引入睡眠-唤醒、进程/线程、POLL机制、异步通知等概念。这些概念对于驱动程序开发和应用程序开发都很重要。因此,对于初学者,我建议你一定要学习这几个驱动:LED、按钮、中断。入门之后如果想从事内核开发和驱动开发,可以研究几个驱动(输入系统、I2C总线、SPI总线等)。掌握了几个大的驱动程序,你就会对内核例程有一个很好的理解。现在,当你研究其他部分(如进程管理,文件系统)时,你会发现例程是如此常见。摄像头(VL42)和声卡ALSA驱动是Linux中比较复杂的type2驱动,难度很大,如果工作涉及到这个,那就去研究下。3.你想学习Linux应用吗?要学习,即使以后只想研究内核,也需要一些基本的应用程序开发和编写能力:①基本的设备访问,如LCD、输入设备②进程、线程、进程通信、线程同步和相互排除③sleep-wake、POLL机制、信号④网络编程①②③部分知识与驱动密切相关,相辅相成。掌握了基本的驱动开发能力和基本的应用程序开发能力后,在工作中就可以和别人友好交流,不会一头雾水。4.学习根文件系统当然,根文件系统与应用程序的运行有关。你辛苦写了应用程序。怎么放到板子上,让它一开机就自动启动呢?你写的程序依赖哪些库,这些库放在板子的哪个目录下?如何制作可升级的系统?即使升级中途断电,也要保证程序至少能运行老版本?这些都需要我们了解根文件系统。先了解init进程:需要读取配置文件,根据配置文件启动各个APP。了解了init进程,也就了解了根文件系统的组成,可以随心所欲地裁剪系统,为自己的项目打造最精简的系统。
