Linux内核编程

Linux内核编程 pdf epub mobi txt 电子书 下载 2026

出版者:人民邮电
作者:(美)罗德里格斯//费舍尔//斯莫斯基|译者
出品人:
页数:400
译者:陈莉君 贺炎 刘霞林
出版时间:2011-5
价格:75.00元
装帧:平装
isbn号码:9787115251947
丛书系列:图灵程序设计丛书·Linux/UNIX系列
图书标签:
  • Linux
  • kernel
  • 内核
  • 计算机
  • 操作系统
  • 编程
  • 人民邮电出版社
  • Programming
  • Linux内核
  • 内核编程
  • 操作系统
  • C语言
  • 驱动开发
  • 系统编程
  • 嵌入式系统
  • 计算机科学
  • 技术
  • 开源
想要找书就要到 小美书屋
立刻按 ctrl+D收藏本页
你会得到大惊喜!!

具体描述

《Linux内核编程》,本书主要内容包括:Linux基础知识、内核探索工具集、进程的整个生命周期、内存区、页面、Slab分配器、用于输入/输出的各种设备、文件系统、抢占、自旋锁、信号量、内核引导、构建Linux内核,以及向内核添加代码等。同时还简单介绍了一些应用工具和实用程序,从而可以获取理解内核内幕所需的信息。

作者简介

Claudia Salzberg Rodriguez就职于IBM Linux技术中心,负责内核及相关编程工具的开发。在担任程序员的10多年时间里,她一直针对Intel和PPC平台进行Linux嵌入式系统到高性能系统的开发。

Gordon Fischer 曾为很多底层设备开发过Linux和Unix设备驱动程序,并针对Intel和PPC平台上的企业级系统中使用Linux内核。

Steven Smolski 有近30年的半导体行业从业经验。从事过内存、处理器以及ASICS的研发和测试,为Linux、AIX以及Windows都编写过应用程序和驱动程序,还进行过嵌入式操作系统的开发。

目录信息

第1 章 概述   1
1.1 UNIX 的历史   2
1.2 标准和通用接口   3
1.3 自由软件和开放源码   3
1.4 Linux 发布版概览   3
1.41 Debian   4
1.42 Red Hat/Fedora 4
1.43 Mandriva   4
1.44 SUSE    4
1.45 Gentoo    4
1.46 Yellow Dog   5
1.47 其他发布版   5
1.5 内核版本信息   5
1.6 基于Power 的Linux   5
1.7 什么是操作系统   6
1.8 内核组织   7
1.9 Linux 内核概述   7
1.9.1 用户接口   7
1.9.2 用户标识符   8
1.9.3 文件和文件系统   8
1.9.4 进程   12
1.9.5 系统调用   15
1.9.6 Linux 调度程序   15
1.9.7 Linux 设备驱动程序   15
1.10 可移植性和体系结构的相关性   16
1.11 小结   16
1.12 习题   16
第2 章 内核探索工具集   18
2.1 内核中常见的数据类型   18
2.1.1 链表   18
2.1.2 查找   21
2.1.3 树   22
2.2 汇编   24
2.2.1 PowerPC    24
2.2.2 x86    27
2.3 汇编语言示例   29
2.3.1 x86 中的汇编示例   30
2.3.2 PowerPC 中的汇编示例   31
2.4 内联汇编   33
2.4.1 输出操作数   34
2.4.2 输入操作数   34
2.4.3 已修改过的寄存器(已修改的元素列表) 34
2.4.4 参数的编号方式   34
2.4.5 约束条件   34
2.4.6 asm    35
2.4.7 __volatile__   35
2.5 特殊的C 语言用法   38
2.5.1 asmlinkage   38
2.5.2 UL   39
2.5.3 内联   39
2.5.4 const 和volatile   39
2.6 内核探索工具一览   40
2.6.1 objdump/readelf   40
2.6.2 hexdump    41
2.6.3 nm   41
2.6.4 objcopy    42
2.6.5 ar   42
2.7 内核发言:倾听来自内核的消息   42
2.7.1 printk()   42
2.7.2 dmesg   42
2.7.3 /var/log/messages   42
2.8 其他奥秘   43
2.8.1 __init   43
2.8.2 likely()和unlikely()   43
2.8.3 IS_ERR 和PTR_ERR   44
2.8.4 通告程序链   44
2.9 小结   45
2.9.1 项目:Hellomod   45
2.9.2 第一步:构造Linux 模块的框架   45
2.9.3 第二步:编译模块   46
2.9.4 第三步:运行代码   47
2.10 习题   48
第3 章 进程:程序执行的基本模型   49
3.1 程序   51
3.2 进程描述符   52
3.2.1 与进程属性相关的字段   54
3.2.2 与调度相关的字段   55
3.2.3 涉及进程间相互关系的字段   58
3.2.4 与进程信任状相关的字段   59
3.2.5 与进程权能相关的字段   60
3.2.6 与进程限制相关的字段   61
3.2.7 与文件系统及地址空间相关的字段   63
3.3 进程的创建:系统调用fork()、vfork 和clone()   64
3.3.1 fork()函数   65
3.3.2 vfork()函数   66
3.3.3 clone()函数   67
3.3.4 do_fork()函数   68
3.4 进程的生命周期   70
3.4.1 进程的状态   70
3.4.2 进程状态的转换   71
3.5 进程的终止   74
3.5.1 sys_exit() 函数   75
3.5.2 do_exit()函数   75
3.5.3 通知父进程和sys_wait4()   77
3.6 了解进程的动态:调度程序的基本构架   80
3.6.1 基本结构   80
3.6.2 从等待中醒来或者激活   81
3.7 等待队列   86
3.7.1 添加到等待队列   88
3.7.2 等待事件   89
3.7.3 唤醒进程   91
3.8 异步执行流程   93
3.8.1 异常   93
3.8.2 中断   95
3.9 小结   114
3.9.1 项目:系统变量current   114
3.9.2 项目源码   115
3.9.3 运行代码   116
3.10 习题   116
第4 章 内存管理   117
4.1 页   119
4.2 内存管理区   121
4.2.1 内存管理区描述符   122
4.2.2 内存管理区操作辅助函数   124
4.3 页面   124
4.3.1 请求页面的函数   124
4.3.2 释放页面的函数   126
4.3.3 伙伴系统   126
4.4 Slab 分配器   130
4.4.1 缓存描述符   133
4.4.2 通用缓存描述符   135
4.4.3 Slab 描述符   136
4.5 Slab 分配器的生命周期   138
4.5.1 与Slab 分配器有关的全局变量   138
4.5.2 创建缓存   139
4.5.3 创建slab 与cache_grow()   144
4.5.4 Slab 的销毁:退还内存与kmem_cache_destroy()   146
4.6 内存请求路径   147
4.6.1 kmalloc()   147
4.6.2 kmem_cache_alloc()   148
4.7 Linux 进程的内存结构   149
4.7.1 mm_struct   150
4.7.2 vm_area_struct   152
4.8 进程映像的分布及线性地址空间   153
4.9 页表   155
4.10 缺页   156
4.10.1 x86 缺页异常   156
4.10.2 缺页处理程序   157
4.10.3 PowerPC 缺页异常   164
4.11 小结   164
4.12 项目:进程内存映射   165
4.13 习题   166
第5 章 输入/输出   167
5.1 总线、桥、端口和接口的硬件实现   167
5.2 设备   171
5.2.1 块设备概述   172
5.2.2 请求队列和I/O 调度   173
5.2.3 示例:“通用”块设备驱动程序   180
5.2.4 设备操作   182
5.2.5 字符设备   183
5.2.6 网络设备   184
5.2.7 时钟设备   184
5.2.8 终端设备   184
5.2.9 直接存储器存取   184
5.3 小结   185
5.4 项目:创建并口驱动程序   185
5.4.1 并口的硬件   185
5.4.2 运行在并口上的软件   187
5.5 习题   192
第6 章 文件系统   194
6.1 文件系统的基本概念   194
6.1.1 文件和文件名   194
6.1.2 文件类型   195
6.1.3 文件的附加属性   195
6.1.4 目录和路径名   196
6.1.5 文件操作   197
6.1.6 文件描述符   197
6.1.7 磁盘块、磁盘分区以及实现   197
6.1.8 性能   198
6.2 Linux 虚拟文件系统   198
6.2.1 VFS 的数据结构   200
6.2.2 全局链表和局部链表的引用   211
6.3 与VFS 相关的结构   212
6.3.1 fs_struct 结构   212
6.3.2 files_struct 结构   213
6.4 页缓存   216
6.4.1 address_space 结构   217
6.4.2 buffer_head 结构   219
6.5 VFS 的系统调用和文件系统层   221
6.5.1 open()   221
6.5.2 close()    227
6.5.3 read()   229
6.5.4 write()   244
6.6 小结   246
6.7 习题   246
第7 章 进程调度和内核同步   247
7.1 Linux 的调度程序   248
7.1.1 选择下一个进程   248
7.1.2 上下文切换   253
7.1.3 让出CPU   261
7.2 内核抢占   269
7.2.1 显式内核抢占   269
7.2.2 隐式用户抢占   270
7.2.3 隐式内核抢占   270
7.3 自旋锁和信号量   272
7.4 系统时钟:关于时间和定时器   274
7.4.1 实时时钟:现在几点了   274
7.4.2 读取PPC 的实时时钟   276
7.4.3 读取x86 的实时时钟   278
7.5 小结   280
7.6 习题   280
第8 章 内核引导   281
8.1 BIOS 和Open Firmware 282
8.2 引导加载程序   282
8.2.1 GRUB   283
8.2.2 LILO   286
8.2.3 PowerPC 和Yaboot   286
8.3 与体系结构相关的内存初始化   287
8.3.1 PowerPC 的硬件内存管理   287
8.3.2 基于Intel x86 体系结构的硬件内存管理   296
8.3.3 PowerPC 和x86 的代码汇集   305
8.4 原始的RAM 盘   305
8.5 开始:start_kernel()   306
8.5.1 调用lock_kernel()   307
8.5.2 调用page_address_init()   309
8.5.3 调用printk(linux_banner)   311
8.5.4 调用setup_arch   311
8.5.5 调用setup_per_cpu_areas()   315
8.5.6 调用smp_prepare_boot_cpu()    316
8.5.7 调用sched_init()    317
8.5.8 调用build_all_zonelists()   319
8.5.9 调用page_alloc_init   319
8.5.10 调用parse_args()   320
8.5.11 调用trap_init()   322
8.5.12 调用rcu_init()   323
8.5.13 调用init_IRQ()   323
8.5.14 调用softirq_init()   324
8.5.15 调用time_init()   325
8.5.16 调用console_init()   326
8.5.17 调用profile_init()   326
8.5.18 调用local_irq_enable()   327
8.5.19 配置initrd   327
8.5.20 调用mem_init()   327
8.5.21 调用late_time_init()   333
8.5.22 调用calibrate_delay()   333
8.5.23 调用pgtable_cache_init()   334
8.5.24 调用buffer_init()   335
8.5.25 调用security_scaffolding_startup()   336
8.5.26 调用vfs_caches_init()   336
8.5.27 调用radix_tree_init()   343
8.5.28 调用signal_init()   344
8.5.29 调用page_writeback_init()   344
8.5.30 调用proc_root_init()   346
8.5.31 调用init_idle()   347
8.5.32 调用rest_init()   348
8.6 init 线程(或进程1)  349
8.7 小结   353
8.8 习题   353
第9 章 构建Linux 内核   354
9.1 工具链   354
9.1.1 编译程序   355
9.1.2 交叉编译   355
9.1.3 链接程序   356
9.1.4 ELF 二进制目标文件   356
9.2 内核源代码的构建   360
9.2.1 解释源代码   360
9.2.2 构建内核映像   364
9.3 小结   369
9.4 习题   369
第10 章 向内核添加代码   371
10.1 浏览源代码   371
10.11 熟悉文件系统   371
10.12 filp 和fops   372
10.13 用户空间和内核空间   374
10.14 等待队列   375
10.15 工作队列及中断   378
10.16 系统调用   380
10.17 其他类型的驱动程序   380
10.18 设备模型和sysfs 文件系统   383
10.2 编写代码   386
10.2.1 设备基础   386
10.2.2 符号输出   388
10.2.3 IOCTL   388
10.2.4 轮询与中断   391
10.2.5 工作队列和tasklet   395
10.2.6 增加系统调用的代码   396
10.3 构建和调试   398
10.4 小结   399
10.5 习题   400
· · · · · · (收起)

读后感

评分

400页的书,还是重新翻译滴。竟然卖75元。好贵啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

评分

400页的书,还是重新翻译滴。竟然卖75元。好贵啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

评分

一直以为自己在挑书方面是很幸运的,总是在适当的时候挑到恰当的书。可惜这次我遗憾了,这本书我读晚了,所以它对我的价值已经不怎么高了。当时在china-pub上看到的时候,吸引我的不是其内容,而是定价,虽然定价75,但打折后只要30,如果你去得不晚,应该还有戏。坏消息是,本...  

评分

400页的书,还是重新翻译滴。竟然卖75元。好贵啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

评分

一直以为自己在挑书方面是很幸运的,总是在适当的时候挑到恰当的书。可惜这次我遗憾了,这本书我读晚了,所以它对我的价值已经不怎么高了。当时在china-pub上看到的时候,吸引我的不是其内容,而是定价,虽然定价75,但打折后只要30,如果你去得不晚,应该还有戏。坏消息是,本...  

用户评价

评分

我必须指出,这本书的难度并非坦途,它要求读者具备扎实的C语言基础以及对计算机体系结构有初步了解。它绝非那种可以囫囵吞枣、浅尝辄止的读物。为了跟上作者的思路,我不得不频繁地查阅C标准库的底层实现以及汇编指令手册。但正是这种“挑战性”,才确保了读完之后所获得的知识是真正内化于心的,而非浮于表面的记忆。特别是对于设备驱动层面的深入探讨,它迫使我必须去理解寄存器操作、DMA传输和中断向量表这些硬核细节。这种强迫自己跨越知识盲区的过程,虽然辛苦,但最终回报是巨大的。它成功地将我从一个只会调用API的“脚本小子”,推向了一个有能力去分析、去调试、甚至去修改底层行为的系统工程师的行列。可以说,它是一本需要投入时间与精力,但绝对物超所值的“内功心法”。

评分

这本书的价值不仅体现在对“如何编程”的指导上,更在于对“如何思考”的塑造。在分析驱动模型时,作者深入探讨了总线、设备、驱动三者之间的“契约”关系,这种对系统间接口定义的严格要求,深刻地体现了工程实践中的最佳范式。很多时候,我们写应用代码时对边界条件的容忍度较高,但在内核世界,一个微小的疏忽就可能导致系统崩溃。书中对健壮性设计的强调,例如对锁的粒度选择和异常恢复路径的审慎处理,都让我对高质量代码有了全新的认识。这不仅仅是技术层面的提升,更是一种职业素养的熏陶。读完后,我发现自己写应用代码时,也会不自觉地去思考“如果这个资源被其他进程抢占了怎么办”、“内存分配失败时应该如何优雅退出”等问题,这无疑是本书带给我最宝贵、也最难以量化的收获。

评分

阅读体验上,这本书的排版和插图设计值得称赞,它们极大缓解了面对如此厚重技术主题时的枯燥感。尤其是一些涉及复杂数据结构和交互流程的图示,它们简洁有力,往往寥寥数笔就能勾勒出原本需要大段文字才能描述清楚的关系网。我特别喜欢作者在引入新概念之前,总会先设置一个场景或一个亟待解决的问题,然后顺理成桐地引出解决方案,这种“问题驱动学习”的方式,让人有很强的代入感。例如,在介绍中断处理机制时,它首先模拟了一个I/O操作完成的场景,继而引出硬件中断和软件上下文切换的必要性,思路层层递进,逻辑链条清晰无比。这种写作手法,极大地降低了初学者面对内核复杂性时的心理门槛。它不像某些教材那样冰冷地堆砌事实,而是更像一位经验丰富的导师,耐心地引导你一步步揭开系统的面纱。

评分

这本书的深度和广度着实令人印象深刻,它不仅仅是一本讲解基础概念的入门读物,更像是一份详尽的路线图,指引着我对操作系统底层机制的探索。我尤其欣赏作者在阐述复杂概念时所展现出的清晰逻辑和耐心。比如,在讲解内存管理模块时,它并没有停留在理论层面,而是结合实际的代码结构和数据流,让抽象的页表机制和缓存一致性问题变得触手可及。每一次翻阅,都能发现新的细节和之前未曾注意到的微妙之处。书中对并发控制的剖析尤为精彩,从自旋锁到信号量的演进,再到RCU等更先进机制的内部工作原理,作者都做了细致的梳理。这使得即便是面对那些号称“资深”的开发者,也能在其中找到提升自身对内核理解的突破口。对于希望从应用层晋升到系统层、真正理解程序如何在硬件上运行时,这本书提供了一个坚实且可靠的基石。它对模块化编程思想的强调,也潜移默化地影响了我日后的代码组织方式,注重接口分离和低耦合设计,这在维护大型内核模块时显得尤为关键。

评分

坦白说,初次接触这本书时,我曾担心其内容会过于偏向某一特定发行版或内核版本,导致学习的局限性。然而,作者高明之处在于,他巧妙地平衡了通用原理与特定实现的关联性。书中大部分篇幅都聚焦于内核设计哲学和跨版本通用的核心算法,而非纠结于某个API的微小变动。这种宏观视角极大地提升了学习的可迁移性。举例来说,当讨论到进程调度时,书中并未陷入对CFS算法某一特定参数的死扣,而是深入剖析了时间片轮转、优先级继承等基本调度范式的内在权衡。这让我能够迅速地将所学知识迁移到我当前工作环境中正在使用的旧版内核,或者未来可能接触到的新内核版本中去,而无需担心知识的半衰期问题。这种对“不变性”原理的深刻洞察,是许多技术书籍所欠缺的。它教会我的不是“怎么做”,而是“为什么这样做”,这才是真正有价值的长期投资。

评分

确实是primer,内容偏少。其中的一些图是出色之处。

评分

通读过,原文就差,翻译的更差,不推荐初学者。最大的缺点是:讲的流于形式,试图讲的全面结果无一深入,甚至无一讲清楚。

评分

这本书着重描述了内核的一些基本技巧,以及基本的数据结构,还有一些基本的函数。很适合初级和中级内核开发者阅读。

评分

这本书着重描述了内核的一些基本技巧,以及基本的数据结构,还有一些基本的函数。很适合初级和中级内核开发者阅读。

评分

写的不错,kernel primer嘛,一些地方不够详细得看其他的参考,不过都点到了,学到了不少

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2026 book.quotespace.org All Rights Reserved. 小美书屋 版权所有