前段时间有个刚开始学习 Arm Linux 的同学问我:对于还处于入门阶段的新手,有什么建议。并让我推荐一些好的书籍。嵌入式 Linux 是一个庞大的系统,涉及到硬件和计算机科学,是横跨电子和计算机的综合学科。很多从电子相关专业切入的学生对计算机原理和操作系统不了解,而从计算机相关专业切入的同学对硬件、电路也很迷惑,所以入门确实是有一定的难度的。 然后我告诉这位同学:首先得有兴趣,兴趣是克服一切困难的源动力。然后要善于利用网络和身边的资源,多尝试、多搜索、多讨论。 我本人也是电子相关专业(自动化)毕业的,大四找工作之前在实验室一直玩 51 单片机 和 Cortex-M3,可是机缘巧合却面试进了一家做 Android 的公司——面试之前,我看招聘要求上只写了要熟悉 Arm 体系结构,Cortex-M3 也是 Arm 啊,所以我就去面试了,最后竟然拿到了 offer。签三方的时候 HR 说:你回去后要开始学 Linux,这是你进来后工作的重点技术。我点头说:好的、好的…… 出来后我就蒙了——Linux!WTF!我要是看到招聘要求上有写 Linux,再给我个胆子我也不敢去面试啊! 回来后去实验室,老师知道我签了这家公司,还是很高兴的!说你先学会怎么在 Linux 系统下工作吧,不然你连门的入不了。 于是老师给我找了一台台式机,装了 Ubuntu,然后又从实验室仓库的最里面翻出来了一块 S3C2410 的开发板—— 没错,我没写错,就是 2410。因为我们是自动化院系,大部分老师的项目都是和各种厂矿、车间的控制相关,这里面大部分都是用 PLC、单片机、MCU 来做控制,跑 Linux,那是不存在的!老师说,一个控制不当,机毁人亡,那是要去坐牢的。所以院系里也没人玩 Linux、这块开发板还是好几年前一家公司来做推广的时候送的。我会玩玩 Ubuntu 已经是比较潮流的了。 于是后面的几个月我就在这块 S3C2410 的板子上开始了 Arm Linux 的入门学习:不停的重复实验、不停的上网搜索…… 后面就毕业,顺利入职。工作后蛮顺利,在各种芯片上折腾 Android、Linux,乐此不疲。 得益于入门时期的特殊经历,我对业内的相关书籍一直比较关注,看到哪位大牛出版了好书,就忍不住要买回来,看到网上有对应的 PDF 版本,也一定会想办法下下来。 所以刚好这几天有空,我就把这些我看过的书单整理了出来,希望对大家有所帮助: 这些书籍我按照 Arm Linux 系统所需要的知识结构,做了分类:
前三类是基础,无论从事哪个方向的开发,这些都是必须要熟练掌握的基本功。后面五类是相辅相成的,理论基础相当于内功心法,开发实践相当于招式,要相互结合相互印证。招式好上手,使起来也漂亮,可以让你快速在江湖上闯出一定的小名头,但是要想走的更远、飞的更高、跻身真正的高手行列,还是离不开深厚的内功心法。 1、Linux 系统环境熟悉 Linux 系统环境是一切的前提 —— Linux 系统环境中,最强大的开发武器是命令行和 Shell 脚本。 为什么?因为大量(几乎所有)的开源项目的编译、配置、都是通过命令行实现;在涉及海量源码的工程下,命令行的 find、grep 命令可以提供强大、高效的搜索功能,能帮忙快速的定位、理解源码;通过 Shell 脚本能够让大量重复的工作自动化,节省时间和生命。我曾经向 U-Boot 和 Linux Kernel mainline 提交过两个补丁,涉及到大几十个文件中雷同代码的修改,如果一步步手工修改,可能要几天时间,我花了大半天的时间写了个脚本利用 我听到过很多还处在入门阶段的同学说:以后的趋势是桌面化、图形化、所以我不需要命令行。其实这种看法是不对的,至少在可以看到的将来,命令行没有被取代的趋势。至少我现在还经常看到有同学问:我照着教程敲的这个命令,为什么报错了?我问他:你明白这个命令是什么意思吗?你看懂它报错的提示信息了吗?他说不知道。所以你要熟悉命令行,至少你要知道你敲下去的每个命令是什么意思,能看懂它的错误提示信息。能会用 所以这部分我推荐了四本书(资料):
2、Git 版本管理我把 Git 版本管理放在了第二位、是想凸显它的重要性,在现在这种团队化、快速迭代的开发模式中,用不好版本管理,开发工作也很难做的干净高效。我现在写文档都是用 Git + Markdown + Github 做版本管理,发现错误随时迭代修改。 据传说,中国的第一代的程序员——求伯君、王江民,他们晚上下班之前会把主机上存储自己写的程序的软件盘拆下来,带回家——怕发生意外,自己写的程序丢了。现在依托 Git 这种版本管理工具,似乎再也没有人有这种忧虑了。 其实版本管理工具很多,推荐 Git 是因为它用的广泛,Android 项目用的是 Git做版本管理,Linux 内核、U-Boot 这些知名的开源项目都是用 Git 做版本管理,还有 Github、Gitlab、Gitee 这种代码托管网站都是以 Git 作为基石,可见在版本管理上,Git 以及形成了一种生态级别的存在。所以你应该毫不犹豫的拥抱它。 对了,Git 的原型是 Linus 大神(就是写出 Linux kernel 的那位)在一个星期内写出来的。 我推荐了两本书,对,两本:
3、C 语言和汇编做嵌入式开发、C 语言的重要性就不用多说了,从 U-Boot 到 Linux kernel,已经各种基础组件,基本都是用 C 语言写的,所以要做一个好的嵌入式 Hacker,C 语言是必须会的。 不像 C 这种跨平台的语言,汇编是和 CPU 体系结构强相关的一门语言,不同的架构 汇编都不一样,比如 32 位的 Armv7 和 64 位的 Armv8 汇编就不一样,比较难以掌握。 对于入门者来说,刚开始不会汇编也没关系,对你的工作影响不大,因为绝大部分场景都用不到。 但是当你的技能提高的一定层次,掌握了汇编就会让你更能深入系统内部,看清程序运行的内部机理。 U-Boot 和 Linux Kernel 中的第一段启动代码,基本都是汇编写的,Cache、MMU 相关的控制,也只能通过汇编实现。 有时候一段 C 代码运行异常,或者效率低下,或者你的 Linux 系统跑崩溃了,这时候把对应的代码反汇编,从汇编级别的去分析,更容易发现问题之所在。我平时经常的一部分工作就是通过汇编去发现或者分析前线部门或者客户报过来的各种疑难杂症。 当然了,汇编不用把每一句都搞懂,只要能大概看懂常用的指令就行,具体遇到问题的时候再去查对应的汇编手册,然后就是熟能生巧的问题了。 这里我推荐了三本 C 语言的书和 三份 Arm64 的汇编指令简介:
4、Arm 体系结构要想把 Arm 嵌入式 玩的溜,尤其是想了解整个系统的,对 Arm 体系结构还是要有一定的学习。如果深入到一定的层次,Arm 体系结构相关的,也是必须要熟悉的,因为很多优化做到极致都是和体系结构紧密相关的。 上面是《奔跑吧 Linux Kernel》的作者笨叔叔前两天在朋友圈帮国内手机大厂打的招聘信息,里面有对 Arm 体系结构的要求,大家可以自行感受下。 现阶段的 Arm 处理器,应用最广泛的大概分为三类:定位于 MCU 的 Cortex-M 系列,定位于应用处理器的 Cortex-A 系列:Armv7-A 和 Armv8-A,Armv7-A 是 32 位的 CPU,包括 Cortex-A7/A9/A15/A17 这些,比如大家常见的 i.MX6ULL 芯片就属于 Arm Cortex-A7,Armv8-A 是 32 位的 CPU,包括 Cortex-A35/A53/A57/A72/A73 市面上在售 的 i.MX8,RK3399、以及现在的主流手机 CPU,都属于 Armv8-A。 这部分我推荐了两本书,剩下的都是 Arm 官方发布的文档:
除了第一本是中国人写的,剩下的四本都是老外写的,而且部头都比较大,所以选一本你自己喜欢的认真去实践即可。 6、Linux 内核基础原理很多学习嵌入式 Linux 开发的同学一上来就呆住一个驱动就开始较劲,然后发现看着像天书一样,各种奇怪的 API 完全不知道为什么需要这样写,这时候你需要了解一些 Linux 内核的基础原理。 这种书一般不是上来就给你分析某个驱动时怎么写的,它侧重于描述 Linux 内核的基础框架,基础数据结构,基本驱动模型,CPU 调度、内存管理这些机制。 我推荐了五本书:
当然,你不用希望一上来就能熟读他们,第一遍你可能只能看个大概,而且看的很容易犯困。没关系,瞌睡了就去睡觉,或者去找个简单的驱动写一写,过几天遇到疑问了再返回来看一看。这样周而复始,总会有看明白的一天。 这里面的前两本我从大四就开始看,最开始看着就犯迷糊,到后来工作了,结合平时写的一些驱动,再返回去看,总算不再会打瞌睡。现在偶尔还会拿起来翻一翻。 我知道有的同学会说 《Linux 设备驱动程序》这本书太老了,它是针对 2.6 内核的,连设备树都没有。其实在技术里面,也有一个道和术的问题,这本书讲的是驱动的基础原理,虽然 Linux kernel 一直在发展,现在 5.4 都快发布了,但是那些基本的内在逻辑还是一致的,驱动最底层的结构和原理都还没有变化。Linux Kernel 开发的哲学就是这样的,不允许你上来就直接推到之前的设计重新搞一套,你必须在原有的基础上做持续性的改进,对于一个拥有庞大用户群体的系统,前向兼容性比什么都重要。至于设备树(dts)这些东西,只是技术实现上的细枝末节,找到规律很快就能掌握。 《深入 Linux 内核架构》这本书是一个德国人写的,其实我没看过,但是我知道这本书很出名,讲的很深入,在我的阅读计划之内。 《深入 Linux 设备驱动程序内核机制》这本书是一个中国人写的,基于 Linux 2.6.39,也是讲 Linux 设备驱动的基本原理和组件,对于做驱动开发来说,还是值得一读,而且中国人写的书在思维也和大家更接近。 《Mastering Linux Kernel Development》这本书比较新,基于 Linux 4.9 ,所以这本书也只有英文版本。 7、Linux 内核开发与实战第六部分给大家推荐的书都比较偏理论,这部分推荐到是比较偏实践的,基本就是告诉你开发环境怎么搭建,内核怎么编译,文件系统怎么构建,驱动怎么编写,所以建议六、七两部分要结合起来看。 还是五本书:
8、操作系统理论与基础Linux Kernel 是一个综合性的工程,是大量科学理论的具体实现。对这些基础理论有个基础的认识,会让我们学的更好。当然,短时间内不了解这些知识,也不会影响到你去调试一个驱动,Bringup 一块板子,但是要想让更深入的去研究一些问题,这些知识还是要补充的。尤其是对于电子相关专业的学生,可能连计算机基本原理,进程、线程、虚拟内存、Cache这些概念都没有,那下边这两本书可以很好的帮到你。
写在最后这份书单非常的长,53 份! 几乎不可能全部读完! 其实你也用不着把他们详细的读完! 如果从这篇介绍文章中,你能区分出哪些是要精读的,哪些是当作工具书来需要的时候查阅的,它们就会对你有一定的帮助了。 我也会感到很高兴。 另外,写作不宜,这里面提到的大部分书,都已出版,如果可能,去买一本,支持下作者,也算是对知识的一种尊重。 我每年都会买很多书,有些书买来都没来得及看,但是看着就感觉是好书,买回来,摆在案头,看着就开心。 |
|
来自: 西北望msm66g9f > 《编程》