exfat驱动源码linux_怎么学好Linux内核?
我觉得学习内核驱动时,最开始只需要 ‘Know what, not know how ’。 不⽤去探究细节,只需要知道整体的框架,知道有哪些需要我们重视的内容即可。
何为 Linux 内核开发?
⾸先,初步认识下 Linux kernel
Linux 内核的框架如上图。
设备⼦系统负责和硬件打交道。
⼤部分⼯作集中在设备⼦系统部分。
内核开发是什么?
⼴义上讲,新增或修改上图中内核部分的所有⼦系统。
⾮ Linux 源码贡献者,⼀般来说只修改设备⼦系统部分。
接下来,简单聊聊初学者需要重点关注的三个部分:设备树,字符设备,平台设备驱动。
设备树(DTS)
设备树相当于⼀份软件中描述硬件结构的配置框图。假设下图为硬件框图:
那么其软件描述的代码⽚段如下:
/ { // root node
model = "Qualcomm Technologies, Inc. SDM xxx"; compatible = "qcom,sdmxxx";
cpus {
...
cpu@0 {
...
};
cpu@1 {
...
};
};
usb@<address> {
.
..
};
serial@<address> {
...
};
gpio@<address> {
...
};
intc: interrupt-controller@<address> {
...
};
external-bus {
...
i2c@0,0 {
...
xxx@<address> { // I2C Dev
....
};
};
flash@1,0 {
...
};
};
};
字符设备驱动
字符设备驱动是理解设备驱动的基础。
⼤多数设备都可以归于字符设备。
平台设备驱动模型
设备(或驱动)注册时,会通过总线去匹配对应的驱动(或设备)。
设备和驱动通常需要挂在⼀种实际总线上,除带有 I2C、SPI、USB 等的设备外,内核为没有实际总线的外设实现了虚拟的平台总线。
平台设备驱动是独⽴于字符设备、⽹络设备等的⼀种抽象概念 。
kernel 开发需要什么样的知识储备?
C 语⾔
良好的 C 语⾔能⼒是必要条件, Linux 官⽅推荐了如下书籍。
The C Programming Language
Practical C Programming
C: A Reference Manual
不过我觉得结合如下书籍⼀步步学习会更适合学习:
1. 《啊哈 C 语⾔》⼊门书籍,号称马桶上看的 C 语⾔,通俗易懂。
2. 《The C Programming Language》的中⽂版 《C 程序设计语⾔》,英⽂版也是很好⼀个选择的,⼀书两⽤,技术和英语都学习
了。我觉得这⼀本是学习 C 语⾔的朋友们,必读的⼀本。
3. 《C 专家编程》,这本书主要讲语法特性,告诉我们 C 语⾔是怎么设计出来的,看了这本书,我们可以更深刻的理解每⼀⾏代码。
4. 《C 缺陷与陷阱》,《C 专家编程 》的延续,针对性更强,告诉我们 C 语⾔这个⼯具的缺陷与陷阱,让我们使⽤ c 语⾔时更加游刃有余。
5.《数据结构与算法分析 : C语⾔描述》,⼊门数据结构与算法,也是⼀本经典书籍,⽐《算法导论》那边砖头厚的书友好得多。GNU
这个也可以归为 C 语⾔⾥⾯,内核由 GNU C 和 GNU toolchain 实现,所以如下两⽅⾯的知识是需要的。
GNU C 的编码规则
GNU ⼯具链的使⽤
Linux 基本命令
学习 Linux 前,我们需要先熟悉 Linux 的“命令⾏ + ⽂件”的使⽤模式,要想学好⼀个东西,开始肯定需要⽤好这个东西。《鸟哥的Linux 私房菜》应该是最适合初学者的⼀本书了。
如果想深⼊的话,推荐 《Linux 系统管理技术⼿册》,这本书很厚,算是 Linux 运维必备的⼿册。
应⽤程序设计
通过系统调⽤或者 glibc,学会⾃⼰进⾏程序设计。如果每个系统调⽤都深⼊地学习、看书看⽂档、做实验,这样坚持⼀段时间,啃下这些东西,就很接近操作系统的原理了,就能看到另⼀番风景,甚⾄在应⽤编程时会有⼀览宗⼭⼩的感觉。参考书籍⾸推《UNIX 环境⾼级编程》,有代码,有介绍,有原理,⾮常实⽤。
设备驱动相关知识
设备驱动⽅⾯的知识看下《Linux 设备驱动程序》应该就差不多了, 国内宋宝华写的《Linux 设备驱动开发详解》也还可以。
内核原理
学习内核原理的话,推荐《Linux 内核设计与实现》,《Linux 内核完全注释》,《深⼊理解 Linux 内核 》三本书,当然也可以只买《深⼊理解 Linux 内核 》, 本书⾔简意赅地讲述了主要的内核机制。
阅读源码
⼀开始阅读代码不要纠结⼀城⼀池的得失,不要每⼀⾏都⼀定要搞清楚它是⼲嘛的,⽽要聚焦于核⼼逻辑和使⽤场景。
《Linux 内核源代码情景分析》是⼀本很适合参考的书,这本书最⼤的优点是结合场景进⾏分析,看得见、摸得着,⾮常直观,唯⼀的缺点还是内核版本⽐较⽼
实践
实现⼀个设备驱动程序,重新实现⼀些系统调⽤,或者重新实现⼀个⽂件系统或其他⼦系统等等。这部分难度会⽐较⼤,需要⾃⼰搞清楚所有细节,但是只要熬出来了,进步的愉悦是难以⾔说的。
总结
C 语⾔, Linux 命令⾏,应⽤程序设计,设备驱动,内核原理,阅读源码, 实践, 只要我们踏实地把这样七个步骤⾛完,基本就C 语⾔, Linux 命令⾏,应⽤程序设计,设备驱动,内核原理,阅读源码, 实践, 只要我们踏实地把这样七个步骤⾛完
已经领先绝⼤多数⼈了(甚⾄可以说 98% 以上,我也还在路上^_^),⼯作中的绝⼤多数问题也难不倒你了,接下来就是在实战中不停地被捶打,最后成为⼀代宗师。
在常见的底层⼯作中,kernel 开发⼀般怎么做?
因为我主要做⾼通平台的的底层开发,所以这⾥以⾼通举例。
因为我主要做⾼通平台的的底层开发,所以这⾥以⾼通举例。
Android 设备通常的开发周期
网站源码在线在我们的⼯作中,kernel 开发主要集中在 Bringup、Integrate、Verify 三个阶段 。
源码获取
⾼通的代码分两部分:⼀部分是开源的,可以从 下载,还有⼀部分是⾼通产权的,需要从⾼通的⽹站上下载。
⾼通产权的代码存放路径:vendor/qcom/proprietary 。
实际⼯作中,SCM ⼀般会帮忙准备好 Base 代码。可以通过 repo init -u lesource/platform/manifest -b android-4.0.1_r1 在 Source.android 下载 Google 官⽅源码。
Bringup
根据需求实现各种外设模块的基本功能。
LCD、TP 、Sensor 、Charger 等功能正常,⼿机能进⼊ Launcher 界⾯,能正常使⽤,USB 连接正常。
这样 Bringup ⼯作就基本完成了。
Porting 和编写各种外设的驱动(需求的具体实现)
Porting 硬件相关配置,即实现 DTS 。
Porting 并实现相关驱动 。
Sensor 和其他外设有⼀点差异 。
其分为 AP 侧驱动(⼚商提供)和 ADSP 侧驱动(⾼通和⼚商协同)两种⽅式 。
主要配置总线、 GPIO 及 Sensor 的属性 。
系统维护(解 BUG)
对⽐机
阅读源码
善⽤调试⼯具
Createpoint + QCOM Case (⾼通⽂档⼯具下载,及向⾼通在线寻求帮助。)
搜索引擎
GTD (主动性)
⽂档(Read + Write)
kernel 调试的常⽤⽅式有哪些?
硬件调试
⽰波器
程控电源
万⽤表
Power monitor
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论