Linux 系统环境是一切的前提 —— Linux 系统环境中,最强大的开发武器是命令行和 Shell 脚本。
为什么?因为大量(几乎所有)的开源项目的编译、配置、都是通过命令行实现;在涉及海量源码的工程下,命令行的 find、grep 命令可以提供强大、高效的搜索功能,能帮忙快速的定位、理解源码;通过 Shell 脚本能够让大量重复的工作自动化,节省时间和生命。我曾经向 U-Boot 和 Linux Kernel mainline 提交过两个补丁,涉及到大几十个文件中雷同代码的修改,如果一步步手工修改,可能要几天时间,我花了大半天的时间写了个脚本利用 sed 命令来处理,跑一把就搞定了。
我听到过很多还处在入门阶段的同学说:以后的趋势是桌面化、图形化、所以我不需要命令行。其实这种看法是不对的,至少在可以看到的将来,命令行没有被取代的趋势。至少我现在还经常看到有同学问:我照着教程敲的这个命令,为什么报错了?我问他:你明白这个命令是什么意思吗?你看懂它报错的提示信息了吗?他说不知道。所以你要熟悉命令行,至少你要知道你敲下去的每个命令是什么意思,能看懂它的错误提示信息。能会用 help 命令行去查阅相关工具的用法。
所以这部分我推荐了四本书(资料):
《LINUX命令行与SHELL脚本编程大全》第三版这本书是一个外国人写的,然后中国人翻译,是一本非常详细的书籍,详细的讲解了 Linux 系统中各种常用命令的使用,以及使用 Linux 系统的一些通用原理。可以先粗读一遍,后面当作工具书来用,需要的时候随时查阅。
另外三份 PDF 是关于 Arm64 指令集的,都很简短,最长的一份只有 135 页,适合做 Arm 汇编手册。用的时候拿来做参考,我没有加 Arm32 指令集相关的,Arm32 有更好的书籍推荐。
4、Arm 体系结构
要想把 Arm 嵌入式 玩的溜,尤其是想了解整个系统的,对 Arm 体系结构还是要有一定的学习。如果深入到一定的层次,Arm 体系结构相关的,也是必须要熟悉的,因为很多优化做到极致都是和体系结构紧密相关的。
上面是《奔跑吧 Linux Kernel》的作者笨叔叔前两天在朋友圈帮国内手机大厂打的招聘信息,里面有对 Arm 体系结构的要求,大家可以自行感受下。
《ARM 嵌入式系统开发-软件设计与优化》我印象中这本书的作者就是 Arm 公司的工程师,中文版是北航的一位老师翻译的,本书介绍了 Arm11 之前的历代经典架构,对 Arm 汇编指令,MPU、MMU、Cache、中断等关键模块的管理和应用介绍的十分详细,甚至还专门用了两章来介绍 Bootloader 和嵌入式操作系统的设计。因为这本书写作的时间比较早,所以没有设计 Cortex-A 系列的处理器,但是它任然是一本值得强烈推荐的书,因为对于 32 位的 Arm 来说,他们的架构和汇编指令保持了很大的延续性,把这本书看懂了,对 Arm 架构的理解也就不存在什么障碍了。
《ARM系列处理器应用技术完全手册》这本书是华清远见出的,主要内容是对 ARM 处理器的简介和 ARM 汇编程序设计,对学习ARM 指令还是很有帮助的。
ARM 官方文档Arm 官方文档主要分为三类:编程指南(pg),芯片的技术参考手册(trm),架构参考手册(ARM)。这三类文档,gp-》trm-》ARM,前面的更容易懂,越到后面越贴近芯片内部,越难懂。所以建议大家按顺序阅读。
编程指南:
《The_Definitive_Guide_to_ARM_Corte_M3&M4》
《Arm Cortex-A 编程指南》
《Armv8-A 编程指南》他们主要描述 Arm 处理器上各个模块的应用原理,和软件开发比较贴近,内容只有几百页,是最实用最 容易上手的文档。
技术参考手册(trm)trm 是 Technical Reference Manual 的缩写,它是针对特定 CPU 的单独文档,比如 Cortex-A7/A9/A53/A72 技术参考手册,内容主要包括对 CPU 上重要模块的介绍,比如 Cache、Timer、系统控制,性能监控、Debug 这些模块,多则 300 页,少的只有 100 多页,当你拿到特具体的开发板芯片,可以有针对性的去阅读。
架构参考手册(arm)这里的 arm 是 Architecture Reference Manual,Arm 官方称这份文档为 Arm arm。这份文档详细描述具体架构的内部细节,比如 《Armv7-AR 架构手册》是针对 32 位的 Arm Cortex-A/R 系列处理器架构的详细描述,《Armv8-A架构手册》是针对 64 位 Arm Cortex-A 系列处理器的架构详细描述,这份文档主要适用于 SOC 设计工程师和进行底层芯片开发的软件工程师,Armv7-AR 的架构文档 2000 多页,Armv8-A 的架构文档将近 9000 页,堪称宏篇巨著。了解大概结构后,我一般把它当作工具书,要用到相关模块的知识就去找出来看看。
5、Linux 应用编程
从应用编程的角度切入 Linux 世界,是一个很好的方式。相比内核开发,应用编程容易上手很多,甚至都不需要开发板,也不用担心写错程序把整个系统弄崩溃。而且透过应用程序的各种机制,我们也能感知到 Linux Kernel 在背后运行的机理,毕竟 Kernel 还是为应用服务的,每一个产品都要靠应用来实现和终端用户交互的接口。应用程序写好了,再来开发 Linux kernel,你会更容易理解,它为什么要这么实现。关于应用编程我推荐了五本书:
《Linux 设备驱动开发详解》业内大名鼎鼎的宋宝华老师写的,这本书我附了两个版本,第二版和第三版,第二版是基于 Linux 2.6,第三版是基于 Linux 4.x,两本书我都买了,第二版我看的比较多,两本书都很不错,比较注重理论和实践的结合。
《精通 Linux设备驱动开发》这是一本老外写的书,宋宝华老师参与了中文版的翻译,这本书也是基于 Linux 2.6,涵盖了 Linux 内核中重要模块的驱动编写,比如字符设备,块设备,网卡,串口,framebuffer,alsa,usb。
《嵌入式 Linux 基础教程》这本书讲是一个老外写的,华清远见翻译的,讲的比较泛,但是涉及到了一个嵌入式系统的方方面面,比如 U-Boot、Linux Kernel、文件系统、toolchain,GDB。对于了解整个嵌入式系统是如何构建的还是比较有价值的
《构建嵌入式 Linux 系统》这本书也是一个老外写的,目前已经出到第二版,但是我没找到,这本书和 《嵌入式 Linux 基础教程》比较类似,两本可以对照着看。
8、操作系统理论与基础
Linux Kernel 是一个综合性的工程,是大量科学理论的具体实现。对这些基础理论有个基础的认识,会让我们学的更好。当然,短时间内不了解这些知识,也不会影响到你去调试一个驱动,Bringup 一块板子,但是要想让更深入的去研究一些问题,这些知识还是要补充的。尤其是对于电子相关专业的学生,可能连计算机基本原理,进程、线程、虚拟内存、Cache这些概念都没有,那下边这两本书可以很好的帮到你。