何为 Linux 内核开发,怎么学好 Linux 内核?
此文包含 Linux 系统的学习路径和书籍推荐。
我觉得学习 Linux 系统,内核驱动时,最开始只需要 ‘Know what, not know how ’。 不用去探究细节,只需要知道整体的框架,知道有哪些需要我们重视的内容即可。
何为 Linux 内核开发?
首先,初步认识下 Linux kernel
- Linux 内核的框架如上图。
- 设备子系统负责和硬件打交道。
- 大部分工作集中在设备子系统部分。
内核开发是什么?
- 广义上讲,新增或修改上图中内核部分的所有子系统。
- 非 Linux 源码贡献者,一般来说只修改设备子系统部分。
接下来,简单聊聊初学者需要重点关注的三个部分:设备树,字符设备,平台设备驱动。
设备树(DTS)
设备树相当于一份软件中描述硬件结构的配置框图。假设下图为硬件框图:
那么其软件描述的代码片段如下:
/ { // root nodemodel = "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 {... };};
};
字符设备驱动
- 字符设备驱动是理解设备驱动的基础。
- 大多数设备都可以归于字符设备。
kernel 开发需要什么样的知识储备?
我觉得这部分可以当着 Linux 系统的学习路径了。
C 语言
良好的 C 语言能力是必要条件, Linux 官方推荐了如下书籍。
- The C Programming Language
- Practical C Programming
- C: A Reference Manual
不过我觉得结合如下书籍一步步学习会更适合学习:
《啊哈 C 语言》入门书籍,号称马桶上看的 C 语言,通俗易懂。
《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 内核源代码情景分析》是一本很适合参考的书,这本书最大的优点是结合场景进行分析,看得见、摸得着,非常直观,唯一的缺点还是内核版本比较老
Linux内核学习资料 教学视频 点击获取
Linux内核学习免费课程:https://ke.qq.com/course/3485817?flowToken=1036460
实践
实现一个设备驱动程序,重新实现一些系统调用,或者重新实现一个文件系统或其他子系统等等。这部分难度会比较大,需要自己搞清楚所有细节,但是只要熬出来了,进步的愉悦是难以言说的。
总结
其实这部分内容已经不仅仅是针对内核开发了,而是针对 Linux 系统。C 语言, Linux 命令行,应用程序设计,设备驱动,内核原理,阅读源码, 实践, 只要我们踏实地把这样七个步骤走完,基本就已经领先绝大多数人了(甚至可以说 98% 以上,我也还在路上_),工作中 Linux 系统相关的绝大多数问题也难不倒你了,接下来就是在实战中不停地被捶打,最后成为一代宗师。
当然如果只是对内核和驱动感兴趣,应用程序设计部分可以不用花太多时间。
C/C++Linux服务器开发/后台架构师免费学习课程:https://ke.qq.com/course/417774?flowToken=1031343
何为 Linux 内核开发,怎么学好 Linux 内核?相关推荐
- linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)
linux内核开发入门二(内核KO模块介绍.开发流程以及注意事项) 一.什么是内核模块 内核模块:ko模块(Kernel Object Module)是Linux内核中的可加载模块,它可以动态地向内核 ...
- 开源社区推广相关(七)|关于建立PostgreSQL内核开发交流群及内核开发资料分享git仓库的说明
目录结构 关于建立PostgreSQL内核开发交流群及内核开发资料分享git仓库的说明 PostgreSQL内核开发交流群 PostgreSQL内核开发的资料 PostgreSQL内核开发交流群 大家 ...
- windows内核开发笔记七:内核开发OVERLAPPED结构体详解
windows内核开发笔记七:内核开发OVERLAPPED结构体详解 typedef struct _OVERLAPPED { DWORD Internal; DWORD InternalHi ...
- linux c内核开发,嵌入式uClinux的内核结构和开发环境
1 引言 嵌入式操作系统是嵌入式系统的灵魂,而且在同一个硬件平台上可以嵌入不同的嵌入式操作系统.比如ARM7TDMI内核,可以嵌入Nucleus.VxWorks.uClinux等操作系统.在此主要对u ...
- linux 内核开发_25年Linux内核开发中的9课
linux 内核开发 由于Linux内核社区在2016年庆祝了25年的开发历史,因此许多人向我们询问了该项目的长寿和成功秘诀. 我通常会开玩笑,说我们真的不知道如何到达这里. 在此过程中,该项目面临许 ...
- Linux内核开发_1_编译LInux内核
目录 1. 准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2. Linux内核配置 2.1 配置选项 1. make config 2. ...
- 大连Linux内核开发,如何查看linux内核版本
如何得知自己正在使用的linux是什么版本 1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux version 2.6.9-22.EL ...
- linux内核开发基础(linux内核源码、树莓派源码编译、SD卡挂载)
首先下载树莓派linux内核源码: 下载网址:https://github.com/raspberrypi/linux 在树莓派使用指令:uname -r查看当前树莓派的版本号,然后选择对应的linu ...
- Linux 驱动开发 五:Linux LED驱动开发
Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器.所以本章的 LED 灯驱动最终也是对 I.MX6ULL 的 IO 口进行配置,与裸机实验不同的是,在 Linux 下编写驱动要符合 Lin ...
- Linux内核开发_将Linux内核打包成img文件
接着之前两个文章我们已经编译了Linux内核和制作了一个文件系统 这一步我们将它们打包成一个img软盘文件 1.使用DD命令创建一个镜像的img文件 sudo dd if=/dev/zero of=m ...
最新文章
- python相对路径库_如何最简单、通俗地理解Python的搜索路径、相对路径、绝对路径?...
- Mybatis的解析模块基础
- IDEA 2020.3.2控制台中文乱码分享(亲测二、下图中控制台的编码改为UTF-8)
- eclipse关闭tomcat服务器热部署
- yarn add webpack webpack-cli 报错
- python单用户登录_Django实现单用户登录的方法示例
- GIS实用小技巧(一)-如何将RTK测量数据导入CAD中?
- [转载] Python 迭代器 深入理解 与应用示例
- 三天学会HTML5 ——多媒体元素的使用
- [摘录]第2章 中场谈判技巧
- 【背包问题】基于matlab离散粒子群算法求解0-1背包问题【含Matlab源码 1342期】
- Git教程之局域网服务器搭建教程(Gitlab)
- AES-128 加解密算法实现
- oracle rman表空间传输,rman 实现在线传输表空间(=10g)
- 元宇宙时空——元宇宙是什么
- 爬虫+可视化——链家杭州二手房房源信息
- 人人都是钢铁侠,超级盔甲问世
- maven打包--同时将仓库依赖和本地依赖的jar包也打进去
- 微型计算机控制系统,微型计算机控制系统
- node修改服务器默认端口,用node+express搭建服务器,解决跨域问题,更改端口号...
热门文章
- 计算机用户删除怎么找回,电脑不小心删除的数据怎么找回
- 小清新风格的微信公众号图文这样排版,看过的都说好。
- php+js 五星评价,基于jquery实现五星好评
- 薄膜则是集成光学系统一个关键的组成部分,LN薄膜和SiOz层形成的高折射率差对光形成限制作用-供应流延聚丙烯蒸镀金属(MCP)/二氧化硅/氧化铝薄膜定制
- JAVA RSA算法加密实现 eclipse
- Handle的详细用法
- 联想集群超算LICO初次使用踩坑说明(遇到的错误,一些使用方法和singularity新建容器方法)
- 利用ArcGIS提取高光谱图像每个像素的光谱信息,再利用matlab显示每个像素的光谱信息
- 一经开源就爆了!谷歌这个脚本工具注定要火
- linux堆内存管理