图解Linux内核 基于6.x
书籍作者:姜亚华 |
ISBN:9787111745471 |
书籍语言:简体中文 |
连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 |
下载次数:7470 |
创建日期:2024-06-27 |
发布日期:2024-06-27 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
内容简介
全书共五篇,以从易到难的顺序详细剖析了Linux内核开发的核心技术。“知识储备篇”介绍了Linux的数据结构、中断处理、内核同步和时间计算等内容,这些是理解后续章节的前提;之后通过“内存管理篇”“文件系统篇”“进程管理篇”详细介绍了Linux的三大核心模块;最后的“综合应用篇”则融合了前面诸多模块知识展示了Linux内核开发在操作系统、智能设备、驱动、通信、芯片、云计算和人工智能等热点领域的应用。书中的重点、难点均配有图表、代码和实战案例,力求直观、清晰。
学习本书的读者需要熟悉C语言,建议对Linux内核有一定了解。推荐初学者按照本书的编排顺序阅读,而熟悉Linux内核的读者可以跳过知识储备篇,直接从三大核心模块篇进行阅读。
本书深入浅出、配图丰富,可作为Linux初中级读者系统学习Linux内核开发的指导手册,也可作为从事嵌入式、操作系统、Linux编程、驱动/内核开发,以及智能设备开发的工程师的案头指南和进阶工具书。
作者简介
姜亚华
先后就职于华为、Intel、AMD、壁仞科技和曦智科技。
?就职于华为期间,负责华为手机的Touch和Sensor的驱动和软件优化,包括Viva、D1、Mate1、Mate2和P2等。
?就职于Intel期间,负责Intel安卓平台的Camera和Sensor的驱动,包括Baytrail、Cherrytrail、Cherrytrail CR和Sofia等。
?就职于AMD期间,负责DMA、Interrupt、Semaphore等模块的优化和验证,包括Vega系列、Navi系列和多款APU产品。
?在曦智科技负责多款产品的系统软件开发至今,包括PCIe驱动、设备固件和系统类库等。
一直从事与Linux内核和Linux系统编程相关的工作,研究内核代码十余年,对多数模块的细节如数家珍。
编辑推荐
适读人群 :从事嵌入式、操作系统、Linux编程、驱动/内核开发、智能设备开发的工程师,以及inux初中级读者
浓缩数百万行代码
308张图表深度解析
扫码观看教学视频
源代码及电子课件
前言
本人编写的《精通Linux内核:智能设备开发核心技术》出版已有多年了,这期间我读了很多书评,也跟行业内的工程师交流过多次,发现在编写该书的过程中有一点做得并不到位,那就是当时写作只站在阅读了几百万行内核代码之后做总结的角度叙述问题,而忽略了初学者学习新知识的思维过程,表现为其中的有些知识点,出于惯性思维我认为比较简单,但实际上可能对于初学者来说并不一定容易理解。同时,Linux的内核版本又更新到了6.x时代,因此就有了《图解Linux内核(基于6.x)》一书的写作想法,我希望用图来直观、清晰地阐述复杂的问题,让初学者更容易理解。
当前的Linux内核版本已经更新到6.x,本书随之更新至6.2版本。其中,有少数知识的讨论也涉及3.10版本,保留它们主要是希望可以让读者看到内核的更新和优化思路。建议读者在阅读本书时可以下载3.10和6.2两个版本的内核代码作为参考。
内容
全书分为5篇内容。
知识储备篇:包括常见的数据结构、时间和中断处理等内容,它们是后面几部分内容的学习基础,希望读者能够从中了解内核的概况,在后续的章节中见到相关的知识时不会感到陌生。尤其是2.1【图解】关系型数据结构一节,它是理解其他章节数据结构间关系的基础,以及2.2【图解】内核中常见的设计模式一节阐述了内核程序的设计思想,对理解复杂系统的设计思路很有帮助。
内存管理篇:包括内存寻址、物理内存、线性内存空间的管理和缺页异常等内容。希望读者能够从中学习到内存映射的原理,理解管理内存的过程,在调用内核提供的函数时明白内核为用户做了哪些操作。
文件系统篇:包括VFS的流程、sysfs和proc文件系统的实现、ext4文件系统的解析等内容。希望读者能够掌握文件系统的设计思路、文件操作的实现、sysfs等文件系统的特点以及ext4文件系统的原理。尤其是ext4文件系统,本书列举了大量的动手实例,希望读者可以理解它的精髓。
进程管理篇:包括进程原理、进程调度、进程通信和信号处理等内容。希望读者能够掌握进程间的关系、进程调度的过程、进程通信的原理和信号的处理过程等。理解进程的创建过程尤为重要,它涵盖了进程实现的原理。
综合应用篇:包括程序的执行、I/O多路复用、Binder通信、Linux设备驱动模型和V4L2架构等内容。本篇综合了前几部分的知识,希望读者可以灵活掌握它们的原理,在工作中使用起来得心应手。
从难易度角度来讲,这5篇是由浅入深的。本书仅罗列了关键或者复杂的代码,从它们包含的代码篇幅就可以知道难易程度。知识储备篇偏向工具和基础知识,以原理分析为主。内存管理篇、文件系统篇和进程管理篇是重点,代码量巨大,这些代码一方面可以帮助读者理解整体的软件架构,另一方面方便读者在学习的时候不会因为手头没有代码而感到无所适从,最重要的是代码才是结论背后的真相,直接给出结论无疑会让技术变成了死记硬背的工具。
特色
本书在搭建知识体系和配套学习资源的过程中进行了如下优化。
前言图解Linux内核(基于6.x) 基于新发布的Linux 6.x,包含前沿的技术(如近几年流行的CXL)和巨量的代码更新。
以【图解】【看图说话】等巧妙形式增强读者的阅读体验,涉及的复杂机制均配图表且提供下载,帮助读者快速厘清脉络。
重点案例和难点操作均制作了配套视频教学课程,读者在阅读过程中,只需拿出手机扫一扫页面相应位置的二维码,即可打开视频课程学习。
提供书中所有案例的完整源代码,帮助读者快速学习内核知识。
配备了授课用电子教案等教学服务,满足大中专院校及相关培训班教师授课所需。
致谢
首先,感谢机械工业出版社的编辑丁伦老师,丁老师与我写《图解Linux内核(基于6.x)》的思路不谋而合。从确定目录结构就开始耐心指导我,对知识的内容也提出了客观准确且专业严谨的修改意见。没有丁老师的认真负责,本书就无法得到升华。
感谢我的研究生导师芦鹏宇,芦老师待人平和耐心,工作一丝不苟,让我在校时就树立了正确的做人和做事的方向,使得对技术不懈追求的理念在我毕业时就已经深深烙在心里。同时还要感谢哈尔滨工业大学,“规格严格,功夫到家”的八字校训一直激励着我,无数个像芦老师一样的辛勤园丁用行动将其传授给一批又一批的学子。
感谢华为技术有限公司的陈栋,很幸运在我第一份工作中可以遇到一个对技术有信仰的前辈,他对技术不懈追求的态度让我在第一份工作中养成了良好的职业态度和习惯。
感谢英特尔(Intel)公司的刘骏、徐杰、黄卫强、王龙和Foster,刘骏将我招入Intel,开阔了我的视野,改变了我的人生轨迹。我曾经问他,他希望我在有余力的情况下学习些什么知识,他的回答是“只要是学习,就会有帮助,无论学什么知识”;徐杰在我的工作中,对我信任有加,处处委以重任,让我在很短的时间内快速成长;黄卫强和王龙是我在Intel的师傅(Buddy),在工作和生活中给了我很多建议,至今受用;Foster是BIOS和x86专家,帮助我快速地熟悉x86的原理。
感谢AMD公司的Winston、Gavin和Jennifer,让我在AMD学习到了很多芯片相关的知识,完成了本书的最后一环。Jennifer交给我挑战性的工作,让我在新的角
目录
序
前言
知识储备篇
第1章Linux内核概述
1.1基于Linux的操作系统生态
1.2【图解】Linux工程师技能和领域
1.3内核代码结构
1.4【看图说话】Android操作系统
第2章数据结构和设计模式
2.1【图解】关系型数据结构
2.1.1一对一关系
2.1.2一对多关系
2.1.3多对多关系
2.2【图解】内核中常见的设计模式
2.2.1模板方法设计模式
2.2.2观察者设计模式
2.3【看图说话】input子系统第3章中断
3.1【图解】中断处理的软硬件分工
3.2中断的处理
3.2.1注册中断服务例程
3.2.2中断处理和返回
3.3软中断
3.3.1tasklet小任务
3.3.2timer定时器
3.4【看图说话】系统调用与程序优化
第4章Linux的时间
4.1数据结构
4.2时间的衡量
4.2.1时钟芯片
4.2.2时间的计算
4.3【图解】时钟中断
4.4【看图说话】timer和hrtimer内存管理篇
第5章内存寻址
5.1DRAM和MMIO
5.2【图解】内存分页
5.2.1寻址
5.2.2内存映射
5.3【看图说话】访问GPU的
Framebuffer
第6章物理内存的管理
6.1【图解】物理内存的布局
6.1.1【图解】node
6.1.2【图解】node的管理
6.2物理内存申请的三个阶段
6.2.1启动程序
6.2.2memblock分配器
6.2.3伙伴系统
6.3【看图说话】搭建管理物理内存的
系统
第7章虚拟内存的管理
7.1线性空间的划分
7.2【图解】内核线性空间布局
7.2.1直接映射区
7.2.2动态映射区
7.2.3永久映射区
7.2.4固定映射区
7.3用户空间内存映射mmap
7.3.1数据结构
7.3.2mmap的实现
7.4【看图说话】/dev/mem的巧用和限制
第8章内存管理进阶
8.1内存申请
8.1.1申请连续物理内存
8.1.2vmalloc的使用
8.2缓存
8.2.1TLB缓存
8.2.2内存缓存
8.3【图解】缺页异常
8.3.1异常的处理
8.3.2COW的精髓
8.4【看图说话】看似简单的malloc
第9章内存回收
9.1【图解】内存回收调用栈
9.2扫描过程的控制
9.3选择扫描对象
9.4扫描inactive链表
9.4.1页隔离
9.4.2folio的原理
9.4.3回收隔离页
9.4.4扫尾
9.5扫描active链表
9.6【看图说话】反向映射
9.6.1匿名映射的mapping
9.6.2文件映射的mapping文件系统篇
第10章虚拟文件系统
10.1数据结构
10.2【图解】文件系统的挂载
10.3文件查找
10.4文件操作
10.4.1软链接和硬链接
10.4.2创建和删除目录
10.4.3打开和关闭文件
10.4.4创建节点
10.4.5删除文件
10.5文件的IO
10.5.1读写
10.5.2ioctl操作
10.6【看图说话】proc文件系统
第11章sysfs文件系统
11.1基本框架
11.2数据结构
11.3创建文件
11.4文件的IO
11.5【看图说话】sysfs和驱动
第12章ext4文件系统
12.1【图解】ext4布局
12.2数据结构
12.2.1ext4_super_block结构体
12.2.2ext4_group_desc结构体
12.2.3ext4_inode结构体
12.2.4ext4_sb_info结构体
12.2.5ext4_inode_info结构体
12.3ext4的挂载
12.4【图解】ext4目录结构
12.4.1线性目录
12.4.2哈希树目录
12.4.3硬链接
12.5【图解】ext4文件的IO
12.5.1映射
12.5.2区段树
12.6【看图说话】文件的恢复进程管理篇
第13章进程
13.1概述
13.1.1数据结构
13.1.2扩展讨论
13.2进程的创建
13.2.1dup_task_struct函数
13.2.2复制creds
13.2.3设置时间
13.2.4sched_fork函数
13.2.5复制资源
13.2.6申请pid
13.2.7重要的杂项
13.3创建进程
13.3.1fork/vfork系统调用
13.3.2创建线程
13.3.3创建内核线程
13.4进程“三巨头”
13.5进程退出
13.5.1退出方式
13.5.2退出过程
13.5.3使用wait等待子进程
13.6【看图说话】Android的thread
目录图解Linux内核(基于6.x)第14章进程调度
14.1数据结构
14.2进程调度的过程
14.2.1进程被创建
14.2.2唤醒进程
14.2.3时钟中断
14.2.4进程切换
14.3stop调度类
14.4实时调度类
14.4.1优先级和抢占
14.4.2task_tick_rt函数
14.4.3选择下一个进程
14.5【图解】完全公平调度类
14.5.1task_fork_fair函数
14.5.2enqueue_task和check_preempt
14.5.3task_tick_fair函数
14.5.4进程切换
14.6最后期限调度类
14.7idle调度类
14.8进程优先级
14.9【看图说话】idle进程
第15章进程通信
15.1经典的管道
15.1.1创建pipe
15.1.2pipe的操作
15.1.3命名管道
15.2POSIX通信
15.2.1POSIX信号量
15.2.2POSIX共享内存
15.2.3POSIX消息队列
15.3XSI通信
15.3.1IPC对象的key和id
15.3.2XSI信号量
15.3.3XSI消息队列
15.3.4XSI共享内存
15.4【看图说话】多线程和多进程
第16章信号
16.1数据结构
16.2捕捉信号
16.3发送信号
16.4【图解】信号处理的过程
16.4.1处理信号的时机和方式
16.4.2处理信号后如何返回
16.5【看图说话】监控文件的IO综合应用篇
第17章玩转操作系统——程序的
执行
17.1【图解】elf文件
17.1.1概述
17.1.2文件格式
17.2exec函数族
17.2.1数据结构
17.2.2系统调用
17.3【看图说话】main函数的来龙去脉
第18章玩转操作系统——IO多路
复用
18.1select机制
18.2poll机制
18.3【图解】epoll
18.3.1数据结构
18.3.2epoll的使用
18.4【看图说话】改良管道通信
第19章玩转操作系统—