科技>计算机>操作系统
深入Linux内核架构与底层原理(第2版)  

深入Linux内核架构与底层原理(第2版)  "

作者:刘京洋
ISBN:9787121436895
定价:¥139.0
字数:681千字
页数:568
出版时间:2022-06
开本:16开
版次:01-01
装帧:
出版社:电子工业出版社
简介

本书主要描述Linux系统的总体框架和设计思想,包含很多可以直接操作的实例。编写本书的目的是希望读者对Linux系统背后的逻辑有一个全面的了解。本书对比较核心且常用的技术点有更加深入的解释,对实际使用Linux系统工作大有裨益,同时,选择重点的方向进行源码级深度分析,包含大量的案例,而且增加了与Windows同类操作系统的对比,涉及Fuchsia?OS和Android系统的一些实现,对操作系统的描述更清晰。 本书适合Linux系统开发人员、嵌入式系统开发人员阅读,也可供计算机相关专业的师生阅读。

前言

推 荐 序 一 Linux操作系统在超级计算机、互联网服务、桌面系统、移动和嵌入式设备等领域使用广泛,相关的从业人员和兴趣爱好者一直对Linux的理论和实践有较大需求。本人作为互联网领域的从业人员,非常荣幸可以提前阅读书中的内容。本书内容从内核层面出发,结合作者多年的实践,对各个子系统的设计、实现和演化进行梳理。我认为本书具有以下特点。 第一个特点是解释透彻。Linux发展至今已经超过25年,源代码融合了不同时期的演进和变化,回顾当时的背景,有助于清晰了解源代码作者的意图和目标。 第二个特点是实践性强。在技术领域,实践往往能加深读者对相关概念的理解,本书中的很多案例都可以作为实验,感兴趣的读者可在单机环境或者虚拟机环境完成。 第三个特点是指路明灯。Linux内核的子系统和模块非常多,覆盖的应用范围也很广,面面俱到显然是不现实的。作者希望更多地展示代码背后的思想,以及对其思考后的理解,这比单纯的技术讲解更有营养价值,同时也鼓励读者在阅读时形成自己的见解,学会查阅相关的技术资料。 第四个特点是与时俱进。近几年,业界利用Linux构建很多热点应用,本书在很多方面覆盖了Linux的新功能,对从业者有较大帮助。 总的来讲,本人阅读本书后收获颇丰,对工作也有很大帮助,希望其他读者也能从中获取价值。本人也是一名开源爱好者,感谢作者的辛勤付出,编写出这本内容详尽的Linux著作,希望Linux和其他开源社区发展得越来越好。 李文俊 推 荐 序 二 在当今移动互联网和人工智能技术快速发展的时代,无论是服务器端程序还是智能终端(手机、手表、电视)程序,Linux操作系统都是主流的操作系统,应用非常广泛。基于Linux内核衍生的发行版众多,包括OpenSuse、RedHat、CentOS、Ubuntu、Android等,在如此广泛的应用下,熟悉和理解Linux内核原理对于广大的Linux操作系统研发工程师就显得尤为重要。理解Linux系统内核原理可以帮助操作系统研发工程师在结合Linux的系统原理,充分利用操作系统资源和机制的基础上,设计出更稳定、更可靠、更高效的应用程序。同时,学习Linux内核设计(负载均衡、内存管理、网络框架等)可以指导我们设计更复杂的互联网技术架构。本书作者拥有多年的Linux内核研发工作经验,对Linux内核各个模块的原理进行了深入剖析,通过畅读本书,我有以下几方面体会。 第一,数据结构和算法解释详尽。数据结构和算法是程序设计和开发的基础,本书可以作为参考学习Linux内核数据结构设计的参考书。比如,第2章2.2节关于Linux内核数据结构,链表、哈希表和动态数组等数据结构;第10章关于路由查找的算法、拥塞控制算法和一致性哈希算法等。本书详细介绍了Linux内核的数据结构和算法,同时提供了大量的示例代码。 第二,内核原理和设计剖析透彻。Linux内核有非常多的经典设计,本书都进行了详细解释,非常清晰易懂。比如第10章第10.4节关于内核网络四层负载均衡架构、Netfilter过滤框架都是Linux经典的技术框架,本书对此剖析得很透彻;第12章关于Linux ELF的格式,对Linux程序编译、加载和运行的原理,都写得很清晰。 第三,内容实践性强,与时俱进。书中很多内容都来自作者多年研发工作的总结和实践积累。比如第12章第12.5节关于二进制安全性、攻击方式的分析,以及罗列的很多常用的二进制分析工具;第10章关于内核处理TCP连接,以及连接的断开、四元组、窗口大小来判断网络攻击等,都来自作者实践工作的总结。 总体来说,这是一本Linux内核原理解读的经典之作。本书一定能够深受广大Linux爱好者的喜爱! 韩方 2022年3月 前 言 本书第1版在上市后,收到很多读者反馈的宝贵意见。本书第2版在第1版的基础上进行了大范围的修订和完善,特别感谢在这个过程中林奕、姚奕涛的勘误帮助。 本书第2版加入了Linux与其他操作系统的对比分析,因为不同的操作系统有着不同点和相同点,通过对比分析可以让读者更容易系统理解设计,甚至产生新的设计。 学习Linux内核最好的方法是阅读源码,但是只看源码往往会无从下手,或者很难理解其中的设计思路。本书与实现方式相结合,对案例所涉及的每个模块都提供了设计思路,可以帮助读者知其然并知其所以然。 我工作在与内核相关的应用领域,所以,本书的内容都是从实践中提炼出来的,希望所提炼的内容能够帮助读者,让读者更好地理解和实现系统设计。如果你是初学者,希望你能从本书中了解Linux从哪里来,要到哪里去的问题。如果你是产业实践者,希望你能通过内容与我共鸣。 欢迎读者提出任何形式的批评与意见,你们对本书的每一个观点都是我改进的动力和指引。

目录

第1章 操作系统总览 1 1.1 操作系统简介 1 1.2 如何形成一个内核 4 1.3 主要操作系统与Linux的对比 6 1.3.1 Linux和Android 6 1.3.2 Windows下Linux运行环境的发展 8 1.3.3 Fuchsia OS与Windows、Linux的对比 9 第2章 系统结构 15 2.1 Linux内核整体结构 15 2.1.1 内核模块 17 2.1.2 内核符号表 23 2.2 Linux内核数据结构 25 2.2.1 链表与哈希表 25 2.2.2 双向链表 26 2.3 hlist 28 2.3.1 llist 34 2.3.2 树与IDR 37 2.3.3 xarray 38 第3章 锁与系统调用 46 3.1 原子操作 47 3.1.1 内存一致性 51 3.1.2 原子类型定义 54 3.1.3 cmpxchg实现 56 3.2 引用计数 60 3.3 自旋锁 65 自旋锁的性能 77 3.4 读写锁与顺序锁 79 3.5 信号量 82 3.6 读写信号量 86 3.6.1 获得读锁 87 3.6.2 锁状态与锁交接 90 3.6.3 锁持有 92 3.6.4 等待链表 94 3.6.5 读锁慢速路径 99 3.7 互斥锁 103 3.8 RCU锁 110 3.8.1 RCU锁基本接口 114 3.8.2 grace period等待 115 3.8.3 SRCU 117 3.8.4 RCU锁、读写锁与顺序锁对比 118 3.8.5 hlist中的RCU锁 119 3.8.6 reuseport中的RCU锁 121 3.9 引用计数 123 percpu-ref 124 第4章 信号、中断与系统调用 129 4.1 信号 129 4.1.1 Linux信号处理机制的设计 129 4.1.2 Windows的Event语义设计 139 4.2 中断 141 4.2.1 IDT(中断描述符表) 141 4.2.2 IPI中断 148 4.3 系统调用 156 4.3.1 系统调用原理 156 4.3.2 vsyscall与VDSO 163 4.3.3 系统调用截断 168 第5章 Linux系统的启动与进程 171 5.1 Linux启动过程的组件 171 5.1.1 启动过程相关组件 171 5.1.2 最小系统的制作和启动 182 5.2 内核启动流程:EFI stub 183 5.3 进程 199 5.3.1 进程概述 199 5.3.2 进程内存和PID 201 5.3.3 进程生命周期 205 第6章 调度 220 6.1 任务调度 220 6.1.1 调度优先级 220 6.1.2 上下文切换 223 6.1.3 运行队列与调度类 228 6.1.4 调度域、调度组与调度实体 230 6.1.5 TTWU(唤醒) 239 6.2 时钟 244 6.2.1 时钟概念 244 6.2.2 计时器与定时器 248 6.3 Futex系统调用 256 6.4 C-State 263 第7章 内存管理 275 7.1 地址空间 275 7.1.1 64位Linux地址空间 275 7.1.2 32位Linux地址空间 276 7.2 寻址 280 7.2.1 64位下的寻址 280 7.2.2 Intel的硬件四级寻址过程 284 7.2.3 操作系统的页状态和权限控制 291 7.2.4 页框回收算法 293 7.2.5 段寄存器 301 7.3 堆内存管理 306 7.3.1 用户空间与内核空间的堆内存管理 306 7.3.2 Buddy思想与Slab思想 307 7.3.3 内存回收(PFRA) 314 7.3.4 BDI 316 第8章 存储 319 8.1 VFS 319 8.1.1 文件句柄与文件描述符表 319 8.1.2 _alloc_fd、fd_install、dup2与close_on_exec 322 8.1.3 open系统调用 325 8.1.4 flock文件锁与文件内容锁 328 8.2 通用块层 339 8.2.1 通用块层功能概览 339 8.2.2 bio和bio_set 342 8.2.3 request和request_queue 343 8.2.4 电梯算法 345 8.3 缓存层 354 8.3.1 Linux与Windows在缓存设计上的不同 354 8.3.2 Linux下的缓存机制 355 8.4 文件系统与Ext4 362 8.4.1 Linux文件系统的特性与框架 362 8.4.2 文件系统的种类 367 8.4.3 文件系统的抽象:VFS 372 8.4.4 Ext4文件系统实践 375 8.5 预读机制 383 8.5.1 预读机制框架 383 8.5.2 预读算法 388 第9章 套接字(socket) 393 9.1 socket概览 393 9.1.1 socket类型与接口 394 9.1.2 Linux socket连接模型 397 9.1.3 Linux socket的锁 398 9.1.4 epoll 400 9.2 Netlink 402 9.2.1 Netlink消息格式 402 9.2.2 Netlink功能模块 406 9.2.3 genetlink的使用 408 9.2.4 inet_diag模块 410 9.2.5 RTNETLINK 414 9.3 BPF与eBPF 418 9.3.1 BPF 419 9.3.2 eBPF 422 第10章 网络 430 10.1 网络架构 430 10.2 IP 434 10.2.1 路由条目的意义 434 10.2.2 IP管理 437 10.2.3 IP隧道 439 10.3 TCP 446 10.3.1 TCP的无损特性 446 10.3.2 TCP的连接状态 447 10.3.3 TCP拥塞控制 452 10.4 负载均衡 460 10.4.1 负载均衡的核心技术点 460 10.4.2 四层负载均衡常见架构 461 10.4.3 一致性哈希和分布式哈希 463 10.5 网络服务质量与安全性 465 10.5.1 TCP安全性 465 10.5.2 QoS 469 10.5.3 NAT 472 10.6 netfilter 475 第11章 设备管理 479 11.1 设备模型 479 11.1.1 sys文件系统 479 11.1.2 设备变化通知用户端 484 11.1.3 设备类型 485 11.2 tty子系统 491 11.2.1 tty框架与ttyS硬件 491 11.2.2 terminal硬件 493 11.2.3 tty结构 494 11.2.4 getty、login与shell 496 11.2.5 /dev/ptmx与/dev/pts/n 496 11.2.6 SSH 501 11.3 PCI与USB 502 11.3.1 PCI 502 11.3.2 USB 510 第12章 二进制 516 12.1 二进制原理 516 12.1.1 编译、链接与执行 516 12.1.2 裸程序 518 12.1.3 加载器 519 12.1.4 链接过程 523 12.2 ELF格式 525 12.2.1 ABI 525 12.2.2 ELF 529 12.3 函数调用约定 547 12.4 二进制安全 552

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个