对于新技术不应该畏惧,相反应该抱着一种好奇心去探索新的知识,为学到新东西而欢喜。为啥要开始学Linux驱动?
对我来说,尤其是多年来都是做单片机相关工作。从单片机转入更高阶的 Linux 驱动开发,无疑是职业生涯的“重生”。在 Linux 下驱动开发,再也没有各种 IDE 隐藏的细节,需要自己通过 Makefile 来组织工程文件,自己写链接脚本,能够更加了解各种背后的技术细节。曾经那些原本困惑不已的问题,也会因为一切变成透明的而豁然开朗。
站在应用层的角度来看,通过学习Linux 驱动开发,来了解底层的知识,在此基础上向上发展,进一步学习系统编程相关知识,能够更加具有系统设计的思维。基于此不管是继续从事嵌入式底层开发,还是进而从事应用层 APP 开发,都是不错的职业发展路线。
从嵌入式 Linux 技术发展来说,大部分服务器运行的操作系统都是 Linux。随着AI,AR/VR的发展,边缘计算的落地,新能源汽车的普及,对于处理器的处理能力要求越来越高,单片机的性能可能某些场景不一定合适,产生Linux 越来越多应用需求。
说了这么多,是不是应该先来一波劝退自己。毕竟上了年纪再加上技术上菜的抠脚,再加上最近脑袋记忆力也变得迟钝,哈哈啊哈哈哈
。
“纸上得来终觉浅,绝知此事要躬行”。出于对Linux驱动的向往,所以,要慢慢,从最初开始,一步步去学习,坚持坚持看,最后说不定有意想不到的惊喜?
打算写一个 Linux 驱动开发的系列流水账,一方面记录下自己的学习过程,形成知识体系,便于以后回顾备查。另一方面,以此倒逼自己跨入新的技术领域。系列的名字就叫 “真真没啥技术的我学 Linux 驱动” 吧。
就以这篇开篇词作为引子,从此刻开始,我来迈出第一步。
学习过程使用NXP 的i.MX.6ULL(为啥选择它,几年前就买了正点原子的Linux开发板一直吃灰,这次搬家翻出来了,不想花钱买新的,再者遇到问题应该也能搜到,毕竟芯片好几年了)。换个学习的方式,参考资料以官方SDK为主,一步步来学习,这样哪怕切换到新的硬件平台,也能够依靠新芯片的官方资料得心应手,快速适应新平台。
既然是一个系列,那么就按照下面三个部分展开,一步步展开,前后衔接。
第一部分 万事开头难之入门篇
这一部分是为后续两个部分打好基础知识,既然是入门,这里面会包含 ARM 架构、指令集、新的开发方式、新的芯片外设、新的思维方式。这些都会在这一阶段循序渐进的一步步展开。
以外设为例,会在通过 makefile 组织工程文件驱动外设的过程中,度过没有 IDE 开发的不适,进一步了解原先隐藏在 IDE 背后的技术细节,曾经那些困惑不已的编译、链接、程序是如何被加载的?等问题,在这一阶段可能都会豁然开朗。
其次,也会在熟练的掌握芯片外设的基础上,让后续 Linux 驱动开发更加的得心应手,在第三部分重点只关注驱动的框架开发思想,不被外设所阻挠。
第二部分 我只是个搬运工之bootloader
从名字也可以看出来,这一部分主要讲的是 bootloader 相关的内容,上电后bootloader 的启动流程是怎么样的?它又是如何为 Linux 内核准备好环境,并最终跳转到 Linux 内核。
从一个简单的自己写的 bootloader 到引出 u-boot 。看看它是如何作为bootloader ,而又如何不只只是 bootloader ,它又是怎么样被编译、链接出来的?是怎么样支持一系列调试命令?是怎么样以最简单粗暴却有效的方式传递参数给 Linux 内核?是怎么样...... ?
第三部分 Linux 驱动开发的世界
在前几个部分的基础上,经过层层铺垫,最终来到了 Linux 驱动开发的世界,进入了真正的主题。
驱动和设备是如何分层的?设备树是如何的解决内核冗余的?一切皆文件的思想是如何靠 open,close , read , write 等等抽象出来并在驱动里面优雅实现?
从一个最简单的 hello word 驱动开始,到操作系统的并发竞争,原子操作,再到掌握各种各样的 Linux 驱动框架。通过文件类型c、b、s对应的,字符设备,块设备,网络设备驱动的驱动框架思想,会对一切皆文件设计理念有更加深入的体会吧。达到最后可以熟练的使用不同的外设驱动框架驱动模块。
希望在整个过程中,能够加入自己的思考而不是整篇流水账。当然,如果能够做到有趣生动却不乏味,那也再好不过。
东一榔头,西一棒槌的说了这么多。好了,这就是这个系列的开篇词了。