前段时间有个刚开始学习ArmLinux的朋友问我:对于还处于入门阶段的菜鸟,有哪些建议。并让我推荐一些好的书籍。
嵌入式Linux是一个庞大的系统,涉及到硬件和计算机科学,是横贯电子和计算机的综合学科。好多从电子相关专业切入的中学生对计算机原理和操作系统不了解,而从计算机相关专业切入的朋友对硬件、电路也很蒙蔽,所以入门确实是有一定的难度的。
之后我告诉那位朋友:首先得有兴趣,兴趣是克服一切困难的源动力。之后要擅于借助网路和身边的资源,多尝试、多搜索、多讨论。
我本人也是电子相关专业(手动化)结业的,大四找工作之前在实验室仍然玩51单片机和Cortex-M3,但是机缘巧合却笔试进了一家做Android的公司——面试之前,我看急聘要求上只写了要熟悉Arm体系结构,Cortex-M3也是Arm啊,所以我就去笔试了linux嵌入式开发书籍,最后居然领到了offer。签三方的时侯HR说:你回来后要开始学Linux,这是你进来后工作的重点技术。我点头说:好的、好的……
下来后我就蒙了——Linux!WTF!我要是听到急聘要求上有写Linux中国linux,再给我个胆量我也不敢去笔试啊!
回去后去实验室,老师晓得我签了这家公司,还是很高兴的!说你先学会如何在Linux系统下工作吧,不然你连门的入不了。
于是老师给我找了一台台式机,装了Ubuntu,之后又从实验室库房的最上面翻下来了一块S3C2410的开发板——没错,我没弄错,就是2410。由于我们是手动化院系,大部份老师的项目都是和各类厂矿、车间的控制相关,这儿面大部份都是用PLC、单片机、MCU来做控制,跑Linux,那是不存在的!老师说,一个控制不当,机毁人亡,那是要去入狱的。所以院系里也没人玩Linux、这块开发板还是好几年前一家公司来做推广的时侯送的。我会玩儿Ubuntu早已是比较新潮的了。
于是前面的几个月我就在这块S3C2410的板子上开始了ArmLinux的入门学习:不停的重复实验、不停的上网搜索……
前面就结业,顺利入职。工作后蛮顺利,在各类芯片上折腾Android、Linux,乐此不疲。
得益于入门时期的特殊经历,我对业内的相关书籍仍然比较关注,见到哪位大牛出版了好书,就忍不住要买回去,见到网上有对应的PDF版本,也一定会想办法下出来。
所以正好这几天有空,我就把这种我看过的书单整理了下来,希望对你们有所帮助:
这种书籍我根据ArmLinux系统所须要的知识结构,做了分类:
Linux系统环境Git版本管理C语言和汇编Arm体系结构Linux应用编程Linux内核基础原理Linux内核开发与实践操作系统理论与基础
前三类是基础,无论从事那个方向的开发,这种都是必需要熟练把握的基本功。前面五类是相辅相成的,理论基础相当于心法剑法,开发实践相当于剑法,要互相结合互相印证。剑法好上手,使上去也漂亮,可以让你快速在江湖上闯出一定的名子头,而且要想走的更远、飞的更高、跻身真正的前辈行列,还是离不开深厚的外功武学。
1、Linux系统环境
熟悉Linux系统环境是一切的前提——Linux系统环境中,最强悍的开发装备是命令行和Shell脚本。
为何?由于大量(几乎所有)的开源项目的编译、配置、都是通过命令行实现;在涉及海量源码的工程下,命令行的find、grep命令可以提供强悍、高效的搜索功能,能帮忙快速的定位、理解源码;通过Shell脚本才能让大量重复的工作手动化,节约时间和生命。我当初向U-Boot和LinuxKernelmainline递交过两个补丁,涉及到大几十个文件中雷同代码的更改,假若一步步手工更改,可能要几天时间,我花了大半天的时间写了个脚本借助sed命令来处理,跑一把就搞定了。
我看到过好多还处在入门阶段的朋友说:之后的趋势是桌面化、图形化、所以我不须要命令行。虽然这些想法是不对的,起码在可以看见的将来,命令行没有被替代的趋势。起码我如今还常常听到有朋友问:我照着教程敲的这个命令,为何报错了?我问他:你明白这个命令是哪些意思吗?你搞懂它报错的提示信息了吗?他说不晓得。所以你要熟悉命令行,起码你要晓得你敲下去的每位命令是哪些意思,能读懂它的错误提示信息。能会用help命令行去查阅相关工具的用法。
所以这部份我推荐了四本书(资料):
2、Git版本管理
我把Git版本管理放到了第二位、是想展现它的重要性,在现今这些团队化、快速迭代的开发模式中,用不好版本管理,开发工作也很难做的干净高效。我如今写文档都是用Git+Markdown+Github做版本管理,发觉错误随时迭代更改。
据传说,中国的第一代的程序员——求伯君、王瑞星,她们下午上班之前会把主机上储存自己写的程序的软件盘拆出来,带回去——怕发生意外,自己写的程序丢了。现今依托Git这些版本管理工具,虽然再也没有人有这些担忧了。
虽然版本管理工具好多,推荐Git是由于它用的广泛,Android项目用的是Git做版本管理,Linux内核、U-Boot那些著名的开源项目都是用Git做版本管理,还有Github、Gitlab、Gitee这些代码托管网站都是以Git作为基石,可见在版本管理上,Git以及产生了一种生态级别的存在。所以你应当毫不迟疑的拥抱它。
对了,Git的原型是Linus高手(就是写出Linuxkernel的这位)在一个礼拜内写下来的。
我推荐了两本书,对,两本:
3、C语言和汇编
做嵌入式开发、C语言的重要性就不用多说了,从U-Boot到Linuxkernel,早已各类基础组件,基本都是用C语言写的,所以要做一个好的嵌入式Hacker,C语言是必须会的。
不像C这些跨平台的语言,汇编是和CPU体系结构强相关的一门语言,不同的构架汇编都不一样,例如32位的Armv7和64位的Armv8汇编就不一样,比较无法把握。
对于入门者来说,刚开始不会汇编也没关系,对你的工作影响不大,由于绝大部份场景都用不到。
并且当你的技能提升的一定层次,把握了汇编都会让你更能深入系统内部,认清程序运行的内部机理。
U-Boot和LinuxKernel中的第一段启动代码,基本都是汇编撰的,Cache、MMU相关的控制,也只能通过汇编实现。
有时侯一段C代码运行异常,或则效率低下,或则你的Linux系统跑崩溃了,这时侯把对应的代码反汇编,从汇编级别的去剖析,更容易发觉问题之所在。我平常时常的一部份工作就是通过汇编去发觉或则剖析前线部门或则顾客报过来的各类疑难杂症。
其实了,汇编不用把每一句都看懂,只要能大约读懂常用的指令就行,具体碰到问题的时侯再去查对应的汇编指南,之后就是熟能生巧的问题了。
这儿我推荐了三本C语言的书和三份Arm64的汇编指令简介:
4、Arm体系结构
要想把Arm嵌入式玩的溜,尤其是想了解整个系统的,对Arm体系结构还是要有一定的学习。假如深入到一定的层次,Arm体系结构相关的,也是必需要熟悉的,由于好多优化做到极至都是和体系结构紧密相关的。
里面是《奔跑吧LinuxKernel》的作者笨哥哥前三天在同学圈帮国外手机大厂打的急聘信息,上面有对Arm体系结构的要求,你们可以自行体会下。
现阶段的Arm处理器,应用最广泛的大约分为三类:定位于MCU的Cortex-M系列,定位于应用处理器的Cortex-A系列:Armv7-A和Armv8-A,Armv7-A是32位的CPU,包括Cortex-A7/A9/A15/A17这种,例如你们常见的i.MX6ULL芯片就属于ArmCortex-A7,Armv8-A是32位的CPU,包括Cortex-A35/A53/A57/A72/A73市面上在售的i.MX8,RK3399、以及现今的主流手机CPU,都属于Armv8-A。
这部份我推荐了两本书,剩下的都是Arm官方发布的文档:
技术参考指南(trm)trm是TechnicalReferenceManual的简写,它是针对特定CPU的单独文档,例如Cortex-A7/A9/A53/A72技术参考指南,内容主要包括对CPU上重要模块的介绍,例如Cache、Timer、系统控制,性能监控、Debug这种模块,多则300页,少的只有100多页,当你领到特具体的开发板芯片,可以有针对性的去阅读。构架参考指南(arm)这儿的arm是ArchitectureReferenceManual,Arm官方称这份文档为Armarm。这份文档详尽描述具体构架的内部细节,例如《Armv7-AR构架指南》是针对32位的ArmCortex-A/R系列处理器构架的详尽描述,《Armv8-A构架指南》是针对64位ArmCortex-A系列处理器的构架详尽描述,这份文档主要适用于SOC设计工程师和进行底层芯片开发的软件工程师,Armv7-AR的构架文档2000多页,Armv8-A的构架文档将近9000页,可谓宏篇专著。了解大约结构后,我通常把它当成工具书,要用到相关模块的知识就去找下来瞧瞧。5、Linux应用编程从应用编程的角度切入Linux世界,是一个挺好的形式。相比内核开发,应用编程容易上手好多,甚至都不须要开发板,也不用害怕弄错程序把整个系统弄崩溃。并且透过应用程序的各类机制,我们也能感知到LinuxKernel在背后运行的机理,虽然Kernel还是为应用服务的,每一个产品都要靠应拿来实现和终端用户交互的插口。应用程序写好了,再来开发Linuxkernel,你会更容易理解,它为何要如此实现。关于应用编程我推荐了五本书:《Linux环境编程:从应用到内核》《GNULinux编程手册》《Linux程序设计》《Linux系统编程》《UNIX环境中级编程》
不仅第一本是中国人写的,剩下的四本都是鬼佬写的,但是部头都比较大,所以选一本你自己喜欢的认真去实践即可。
6、Linux内核基础原理
好多学习嵌入式Linux开发的朋友一上来就呆住一个驱动就开始较劲,之后发觉看着像天书一样,各类奇怪的API完全不晓得为何须要这样写,这时侯你须要了解一些Linux内核的基础原理。
这些书通常不是上来就给你剖析某个驱动时如何写的linux软件下载,它着重于描述Linux内核的基础框架,基础数据结构,基本驱动模型,CPU调度、内存管理这种机制。
我推荐了五本书:
其实,你不用希望一上来能够通读她们,第一遍你可能只能看个大约,而且看的很容易疲倦。没关系,困倦了就去睡着,或则去找个简单的驱动写一写,过几天碰到疑惑了再返回来看一看。这样周而复始,总会有看明白的三天。
这儿面的前两本我从大四就开始看,最开始看着就犯迷糊,到后来工作了,结合平常写的一些驱动,再返回去看,终于不再见打困倦。现今时常都会拿上去翻一翻。
我晓得有的同学会说《Linux设备驱动程序》这本书太老了,它是针对2.6内核的,连设备树都没有。虽然在技术里边,也有一个道和术的问题,这本书讲的是驱动的基础原理,尽管Linuxkernel仍然在发展,现今5.4都快发布了,而且这些基本的内在逻辑还是一致的,驱动最底层的结构和原理都还没有变化。LinuxKernel开发的哲学就是这样的,不容许你上来就直接推到之前的设计重新搞一套,你必须在原有的基础上做持续性的改进,对于一个拥有庞大用户群体的系统,前向兼容性比哪些都重要。至于设备树(dts)这种东西,只是技术实现上的细枝末节,找到规律很快能够把握。
《深入Linux内核构架》这本书是一个美国人写的,虽然我没看过,而且我晓得这本书很出名,讲的很深入,在我的阅读计划之内。
《深入Linux设备驱动程序内核机制》这本书是一个中国人写的,基于Linux2.6.39,也是讲Linux设备驱动的基本原理和组件,对于做驱动开发来说,还是值得一读,并且中国人写的书在思维也和你们更接近。
《MasteringLinuxKernelDevelopment》这本书比较新,基于Linux4.9linux嵌入式开发书籍,所以这本书也只有英语版本。
7、Linux内核开发与实战
第六部份给你们推荐的书都比较偏理论,这部份推荐到是比较偏实践的,基本就是告诉你开发环境如何搭建,内核如何编译,文件系统如何建立,驱动如何编撰,所以建议六、七两部份要结合上去看。
还是五本书:
8、操作系统理论与基础
LinuxKernel是一个综合性的工程,是大量科学理论的具体实现。对这种基础理论有个基础的认识,会让我们学的更好。其实,短时间内不了解这种知识,也不会影响到你去调试一个驱动,Bringup一块板子,而且要想让更深入的去研究一些问题,这种知识还是要补充的。尤其是对于电子相关专业的中学生,可能连计算机基本原理,进程、线程、虚拟显存、Cache这种概念都没有,那下面这两本书可以挺好的帮到你。
写在最后
这份书单十分的长,53份!
几乎不可能全部读完!
虽然你也用不着把她们详尽的读完!
倘若从这篇介绍文章中,你能分辨出什么是要精读的,什么是当成工具书来须要的时侯查阅的,它们都会对你有一定的帮助了。
我也会倍感很高兴。
另外,写作不宜,这儿面提及的大部份书,都已出版,假如可能,去买一本,支持下作者,也算是对知识的一种尊重。
我每年还会买好多书,有些书买来都没来得及看,而且看着就觉得是好书,买回去,摆在案头,看着就开心。
假如你想先睹为快,急着拜读那些大作,可以扫码关注公众号:HackforFun,之后发送关键字linux获取下载链接。