Linux内核设计与实现(原书第3版)

Linux内核设计与实现(原书第3版)
分享
扫描下方二维码分享到微信
打开微信,点击右上角”+“,
使用”扫一扫“即可将网页分享到朋友圈。
作者: [美]
出版社: 机械工业出版社
2011-05
版次: 1
ISBN: 9787111338291
定价: 69.00
装帧: 平装
开本: 16开
纸张: 胶版纸
页数: 352页
正文语种: 简体中文
原版书名: Linux Kernel Development, 3E
  •   《Linux内核设计与实现(原书第3版)》详细描述了Linux内核的设计与实现。内核代码的编写者、开发者以及程序开发人员都可以通过阅读《Linux内核设计与实现(原书第3版)》受益,他们可以更好理解操作系统原理,并将其应用在自己的编码中以提高效率和生产率。  《Linux内核设计与实现(原书第3版)》详细描述了Linux内核的主要子系统和特点,包括Linux内核的设计、实现和接口。从理论到实践涵盖了Linux内核的方方面面,可以满足读者的各种兴趣和需求。  作者Robert Love是一位Linux内核核心开发人员,他分享了在开发Linux2.6内核过程中颇具价值的知识和经验《Linux内核设计与实现(原书第3版)》的主题包括进程管理、进程调度、时间管理和定时器、系统调用接口、内存寻址、内存管理和页缓存、VFS、内核同步、移植性相关的问题以及调试技术。同时《Linux内核设计与实现(原书第3版)》也涵盖了Linux2.6内核中颇具特色的内容,包括CFS调度程序、抢占式内核、块I/O层以及I/O调度程序。   RobertLove,是一位资深的开源社区达人,很早就开始使用Linux。目前他是Google公司高级软件工程师,是开发Android移动平台内核的团队成员;他曾在Novell公司任职Linux桌面系统的首席架构师;他之前也曾是MontaVista和Ximain公司的内核开发工程师。他参与的内核项目包括抢占式内核、进程调度器、内核事件层、通知机制、VM改进,以及设备驱动程序。他是《Linuxjournal》杂志的编辑。另外他还著有《Linux System Programming》和《Linux in aNutshell》。  陈莉君,西安邮电学院教授,十多年来一直致力于推动Linux在中国的发展,多年从事Linux内核的教学和研究,并积极跟踪Linux内核的发展动向,对Linux内核版本的不断演化有着深刻的理解。著译作品有《Linux操作系统原理与应用》、《Linux操作系统内核分析》、《深入分析Linux内核源代码》、《深入理解Linux内核》和《Linux内核编程》等。 译者序序言前言作者简介第1章Linux内核简介11.1Unix的历史11.2追寻Linus足迹:Linux简介21.3操作系统和内核简介31.4Linux内核和传统Unix内核的比较51.5Linux内核版本71.6Linux内核开发者社区81.7小结8第2章从内核出发102.1获取内核源码102.1.1使用Git102.1.1安装内核源代码102.1.3使用补丁112.2内核源码树112.3编译内核122.3.1配置内核122.3.2减少编译的垃圾信息142.3.3衍生多个编译作业142.3.4安装新内核142.4内核开发的特点152.4.1无libc库抑或无标准头文件152.4.2GNUC162.4.3没有内存保护机制182.4.4不要轻易在内核中使用浮点数182.4.5容积小而固定的栈182.4.6同步和并发182.4.7可移植性的重要性192.5小结19第3章进程管理203.1进程203.2进程描述符及任务结构213.2.1?配进程描述符223.2.2进程描述符的存放233.2.3进程状态233.2.4设置当前进程状态253.2.5进程上下文253.2.6进程家族树253.3进程创建263.3.1写时拷贝273.3.2fork()273.3.3vfork()283.4线程在Linux中的实现283.4.1创建线程293.4.2内核线程303.5进程终结313.5.1删除进程描述符323.5.2孤儿进程造成的进退维谷323.6小结34第4章进程调度354.1多任务354.2Linux的进程?度364.3策略364.3.1I/O消耗型和处理器消耗型的进程364.3.2进程优先级374.3.3时间片384.3.4调度策略的活动384.4Linux调度算法394.4.1调度器类394.4.2Unix系统中的进程调度404.4.3公平调度414.5Linux调度的实现424.5.1时间记账424.5.2进程选择444.5.3调度器入口484.5.4睡眠和唤醒494.6抢占和上下文切换514.6.1用户抢占534.6.2内核抢占534.7实时调度策略544.8?调度相关的系统调用544.8.1与调度策略和优先级相关的系统调用554.8.2与处理器绑定有关的系统调用554.8.3放弃处理器时间564.9小结56第5章系统调用575.1与内核通信575.2API、POSIX和C库575.3系统调用585.3.1系统调用号595.3.2系统调用的性能595.4系统调用处理程序605.4.1指定恰当的系统调用605.4.2参数传递605.5系统调用的实现615.5.1实现系统调用615.5.2参数验证625.6系统调用上下文645.6.1绑定一个系统调用的最后步骤655.6.2从用户空间访问系统调用675.6.3为什么不通过系统调用的方式实现685.7小结68第6章内核数据结构696.1链表696.1.1单向链表和双向链表696.1.2环形链表706.1.3沿链表移动716.1.4Linux内核中的实现716.1.5操作链表736.1.6遍历链表756.2队列786.2.1kfifo796.2.2创建队列796.2.3推入队列数据796.2.4摘取队列数据806.2.5获取队列?度806.2.6重置和撤销队列806.2.7队列使用举例816.3映射816.3.1初始化一个idr826.3.2分配一个新的UID826.3.3查找UID836.3.4删除UID846.3.5撤销idr846.4二叉树846.4.1二叉搜索树846.4.2自平衡二叉搜索树856.5数据结构以及选择876.6算法复杂度886.6.1算法886.6.2大o符号886.6.3大θ符号896.6.4时间复杂度896.7小结90第7章中断和中断处理917.1中?917.2中断处理程序927.3上半部与下半部的对比937.4注册中断处理程序937.4.1中断处理程序标志947.4.2一个中断例子957.4.3释放中断处理程序957.5编写中断处理程序967.5.1共享的中断处理程序977.5.2中断处理程序实例977.6中断上下文997.7中断处理机制的实现1007.8/proc/interrupts1027.9中断控制1037.9.1禁止和激活中断1037.9.2禁止指定中断线1057.9.3中断系统的状态1057.10小结106第8章下半部和推后执行的工作1078.1下半部1078.1.1为什么要用下半部1088.1.2下半部的环境1088.2软中断1108.2.1软中断的实现1118.2.2使用软中断1138.3tasklet1148.3.1tasklet的实现1148.3.2使用tasklet1168.3.3老的BH机制1198.4工作队列1208.4.1工作队列的实现1218.4.2使用工作队列1248.4.3老的任务队列机制1268.5下半部机制的选择1278.6在下半部之间加锁1288.7禁止下?部1288.8小结129第9章内核同步介绍1319.1临界区和竞争条件1319.1.1为什么我们需要保护1329.1.2单个变量1339.2加锁1349.2.1造成并发执行的原因1359.2.2了解要保护些什么1369.3死锁1379.4争用和扩展性1389.5小结140第10章内核同步方法14110.1原子操作14110.1.1原子整数操作14210.1.264位原子操作14410.1.3原子位操作14510.2自旋锁14710.2.1自旋锁方法14810.2.2其他针对自旋锁的操作14910.2.3自旋锁和下半部15010.3读-写自旋锁15010.4信号量15210.4.1计数信号量和二值信号量15310.4.2创建和初始化信号量15410.4.3使用信号量15410.5读-写信号量15510.6互斥体15610.6.1信号量和互斥体15810.6.2自旋锁和互斥体15810.7完成变量15810.8BLK:大内核锁15910.9顺序锁16010.10禁止抢占16110.11顺序和屏障16210.12小结165第11章定时器和时间管理16611.1内核中的时间概念16611.2节拍率:HZ16711.2.1理想的HZ值16811.2.2高HZ的优势16911.2.3高HZ的劣势16911.3jiffies17011.3.1jiffies的内部表示17111.3.2jiffies的回绕17211.3.3用户空间和HZ17311.4硬时钟和定时器17411.4.1实时时钟17411.4.2系统定时器17411.5时钟中断处理程序17411.6实际时间17611.7定时器17811.7.1使用定时器17811.7.2定时器竞争条件18011.7.3实现定时器18011.8延迟执行18111.8.1忙等待18111.8.2短延迟18211.8.3schedule_timeout()18311.9小结185第12章内存管理18612.1页18612.2区18712.3获得页18912.3.1获得填充为0的页19012.3.2释放页19112.4kmalloc()19112.4.1gfp_mask标志19212.4.2kfree()19512.5vmalloc()19612.6slab层19712.6.1slab层的设计19812.6.2slab分配器的接口20012.7在栈上的静态分配20312.7.1单页内核栈20312.7.2在栈上光明正大地工作20312.8高端内存的映射20412.8.1永久映射20412.8.2临时映射20412.9每个CPU的分配20512.10新的每个CPU接口20612.10.1编译时的每个CPU数据20612.10.2运行时的每个CPU数据20712.11使用每个CPU数据的原因20812.12分配函数的选择20912.13小结209第13章虚拟文件系统21013.1通用文件系统接口21013.2文件系统抽象层21113.3Unix文件系统21213.4VFS对象及其数据结构21313.5超级块对象21413.6超级块操作21513.7索引节点对象21713.8索引节点操作21913.9目录项对象22213.9.1目录项状态22213.9.2目录项缓存22313.10目录项操作22413.11文件对象22513.12文件操作22613.13和文件系统相关的数据结构23013.14和进程相关的数据结构23213.15小结233第14章块I/O层23414.1剖析一个块设备23414.2缓冲区和缓冲区头23514.3bio结构体23714.3.1I/O向量23814.3.2新老方法对比23914.4请求队列24014.5I/O调度程序24014.5.1I/O调度程序的工作24114.5.2Linus电梯24114.5.3最终期限I/O调度程序24214.5.4预测I/O调度程序24414.5.5完全公正的排队I/O调度程序24414.5.6空操作的I/O调度程序24514.5.7I/O调度程序的选择24514.6小结246第15章进程地址空间24715.1地址空间24715.2内存描述符24815.2.1分配内存描述符24915.2.2撤销内?描述符25015.2.3mm_struct与内核线程25015.3虚拟内存区域25115.3.1VMA标志25115.3.2VMA操作25315.3.3内存区域的树型结构和内存区域的链表结构25415.3.4实际使用中的内存区域25415.4操作内存区域25515.4.1find_vma()25615.4.2find_vma_prev()25715.4.3find_vma_intersection()25715.5mmap()和do_mmap():创建地址区间25815.6mummap()和do_mummap():删除地址区间25915.7页表26015.8小结261第16章页高速缓存和页回写26216.1缓存手段26216.1.1写缓存26216.1.2缓存回收26316.2Linux页高速缓存26416.2.1address_space对象26416.2.2address_space操作26616.2.3基树26716.2.4以前的页散列表26816.3缓冲区高速缓存26816.4flusher线程26816.4.1膝上型计算机模式27016.4.2历史上的bdflush、kupdated和pdflush27016.4.3避免拥塞的方法:使用多线程27116.5小结271第17章设备与模块27317.1设?类型27317.2模块27417.2.1Hello,World27417.2.2构建模块27517.2.3安装模块27717.2.4产生模块依赖性27717.2.5载入模块27817.2.6管理配置选项27917.2.7模块参数28017.2.8导出符号表28217.3设备模型28317.3.1kobject28317.3.2ktype28417.3.3kset28517.3.4kobject、ktype和kset的相互关系28517.3.5管理和操作kobject28617.3.6引用计数28717.4sysfs28817.4.1sysfs中添加和删除kobject29017.4.2向sysfs中添加文件29117.4.3内核事件层29317.5小结294第18章调试29518.1准备开始29518.2内核中的bug29618.3通过打印来调试29618.3.1健壮性29618.3.2日志等级29718.3.3记录缓冲区29818.3.4syslogd和klogd29818.3.5从printf()到printk()的转换29818.4oops29818.4.1ksymoops30018.4.2kallsyms30018.5内核调试配置选项30118.6引发bug并打印信息30118.7?神奇的系统请求键30218.8内核调试器的传奇30318.8.1gdb30318.8.2kgdb30418.9探测系统30418.9.1用UID作为选择条件30418.9.2使用条件变量30518.9.3使用统计量30518.9.4重复频率限制30518.10用二分查找法找出引发罪恶的变更30618.11使用Git进行二分搜索30718.12当所有的努力都失败时:社区30818.13小结308第19章可移植性30919.1可移植操作系统30919.2Linux移植史31019.3字长和数据类型31119.3.1不透明类型31319.3.2指定数据类型31419.3.3长度明确的类型31419.3.4char型的符号问题31519.4数据对齐31519.4.1避免对齐引发的问题31619.4.2非标准类型的对齐31619.4.3结构体填补31619.5字节顺序31819.6时间31919.7页长度32019.8处理器排序32019.9SMP、内核抢占、高端内存32119.10小结321第20章补丁、开发和社区32220.1社区32220.2Linux编码风格32220.2.1缩进32320.2.2switch语句32320.2.3空格32420.2.4花括号32520.2.5每行代码的长度32620.2.6命名规范32620.2.7函数32620.2.8注释32620.2.9typedef32720.2.10多用现成的东西32820.2.11在源码中减少使用ifdef32820.2.12结构初始化32820.2.13代码的事后修正32920.3管理系统32920.4提交错误报告32920.5补丁33020.5.1创建补丁33020.5.2用Git创建补丁33120.5.3提交补丁33120.6小结332参考资料333
  • 内容简介:
      《Linux内核设计与实现(原书第3版)》详细描述了Linux内核的设计与实现。内核代码的编写者、开发者以及程序开发人员都可以通过阅读《Linux内核设计与实现(原书第3版)》受益,他们可以更好理解操作系统原理,并将其应用在自己的编码中以提高效率和生产率。  《Linux内核设计与实现(原书第3版)》详细描述了Linux内核的主要子系统和特点,包括Linux内核的设计、实现和接口。从理论到实践涵盖了Linux内核的方方面面,可以满足读者的各种兴趣和需求。  作者Robert Love是一位Linux内核核心开发人员,他分享了在开发Linux2.6内核过程中颇具价值的知识和经验《Linux内核设计与实现(原书第3版)》的主题包括进程管理、进程调度、时间管理和定时器、系统调用接口、内存寻址、内存管理和页缓存、VFS、内核同步、移植性相关的问题以及调试技术。同时《Linux内核设计与实现(原书第3版)》也涵盖了Linux2.6内核中颇具特色的内容,包括CFS调度程序、抢占式内核、块I/O层以及I/O调度程序。
  • 作者简介:
      RobertLove,是一位资深的开源社区达人,很早就开始使用Linux。目前他是Google公司高级软件工程师,是开发Android移动平台内核的团队成员;他曾在Novell公司任职Linux桌面系统的首席架构师;他之前也曾是MontaVista和Ximain公司的内核开发工程师。他参与的内核项目包括抢占式内核、进程调度器、内核事件层、通知机制、VM改进,以及设备驱动程序。他是《Linuxjournal》杂志的编辑。另外他还著有《Linux System Programming》和《Linux in aNutshell》。  陈莉君,西安邮电学院教授,十多年来一直致力于推动Linux在中国的发展,多年从事Linux内核的教学和研究,并积极跟踪Linux内核的发展动向,对Linux内核版本的不断演化有着深刻的理解。著译作品有《Linux操作系统原理与应用》、《Linux操作系统内核分析》、《深入分析Linux内核源代码》、《深入理解Linux内核》和《Linux内核编程》等。
  • 目录:
    译者序序言前言作者简介第1章Linux内核简介11.1Unix的历史11.2追寻Linus足迹:Linux简介21.3操作系统和内核简介31.4Linux内核和传统Unix内核的比较51.5Linux内核版本71.6Linux内核开发者社区81.7小结8第2章从内核出发102.1获取内核源码102.1.1使用Git102.1.1安装内核源代码102.1.3使用补丁112.2内核源码树112.3编译内核122.3.1配置内核122.3.2减少编译的垃圾信息142.3.3衍生多个编译作业142.3.4安装新内核142.4内核开发的特点152.4.1无libc库抑或无标准头文件152.4.2GNUC162.4.3没有内存保护机制182.4.4不要轻易在内核中使用浮点数182.4.5容积小而固定的栈182.4.6同步和并发182.4.7可移植性的重要性192.5小结19第3章进程管理203.1进程203.2进程描述符及任务结构213.2.1?配进程描述符223.2.2进程描述符的存放233.2.3进程状态233.2.4设置当前进程状态253.2.5进程上下文253.2.6进程家族树253.3进程创建263.3.1写时拷贝273.3.2fork()273.3.3vfork()283.4线程在Linux中的实现283.4.1创建线程293.4.2内核线程303.5进程终结313.5.1删除进程描述符323.5.2孤儿进程造成的进退维谷323.6小结34第4章进程调度354.1多任务354.2Linux的进程?度364.3策略364.3.1I/O消耗型和处理器消耗型的进程364.3.2进程优先级374.3.3时间片384.3.4调度策略的活动384.4Linux调度算法394.4.1调度器类394.4.2Unix系统中的进程调度404.4.3公平调度414.5Linux调度的实现424.5.1时间记账424.5.2进程选择444.5.3调度器入口484.5.4睡眠和唤醒494.6抢占和上下文切换514.6.1用户抢占534.6.2内核抢占534.7实时调度策略544.8?调度相关的系统调用544.8.1与调度策略和优先级相关的系统调用554.8.2与处理器绑定有关的系统调用554.8.3放弃处理器时间564.9小结56第5章系统调用575.1与内核通信575.2API、POSIX和C库575.3系统调用585.3.1系统调用号595.3.2系统调用的性能595.4系统调用处理程序605.4.1指定恰当的系统调用605.4.2参数传递605.5系统调用的实现615.5.1实现系统调用615.5.2参数验证625.6系统调用上下文645.6.1绑定一个系统调用的最后步骤655.6.2从用户空间访问系统调用675.6.3为什么不通过系统调用的方式实现685.7小结68第6章内核数据结构696.1链表696.1.1单向链表和双向链表696.1.2环形链表706.1.3沿链表移动716.1.4Linux内核中的实现716.1.5操作链表736.1.6遍历链表756.2队列786.2.1kfifo796.2.2创建队列796.2.3推入队列数据796.2.4摘取队列数据806.2.5获取队列?度806.2.6重置和撤销队列806.2.7队列使用举例816.3映射816.3.1初始化一个idr826.3.2分配一个新的UID826.3.3查找UID836.3.4删除UID846.3.5撤销idr846.4二叉树846.4.1二叉搜索树846.4.2自平衡二叉搜索树856.5数据结构以及选择876.6算法复杂度886.6.1算法886.6.2大o符号886.6.3大θ符号896.6.4时间复杂度896.7小结90第7章中断和中断处理917.1中?917.2中断处理程序927.3上半部与下半部的对比937.4注册中断处理程序937.4.1中断处理程序标志947.4.2一个中断例子957.4.3释放中断处理程序957.5编写中断处理程序967.5.1共享的中断处理程序977.5.2中断处理程序实例977.6中断上下文997.7中断处理机制的实现1007.8/proc/interrupts1027.9中断控制1037.9.1禁止和激活中断1037.9.2禁止指定中断线1057.9.3中断系统的状态1057.10小结106第8章下半部和推后执行的工作1078.1下半部1078.1.1为什么要用下半部1088.1.2下半部的环境1088.2软中断1108.2.1软中断的实现1118.2.2使用软中断1138.3tasklet1148.3.1tasklet的实现1148.3.2使用tasklet1168.3.3老的BH机制1198.4工作队列1208.4.1工作队列的实现1218.4.2使用工作队列1248.4.3老的任务队列机制1268.5下半部机制的选择1278.6在下半部之间加锁1288.7禁止下?部1288.8小结129第9章内核同步介绍1319.1临界区和竞争条件1319.1.1为什么我们需要保护1329.1.2单个变量1339.2加锁1349.2.1造成并发执行的原因1359.2.2了解要保护些什么1369.3死锁1379.4争用和扩展性1389.5小结140第10章内核同步方法14110.1原子操作14110.1.1原子整数操作14210.1.264位原子操作14410.1.3原子位操作14510.2自旋锁14710.2.1自旋锁方法14810.2.2其他针对自旋锁的操作14910.2.3自旋锁和下半部15010.3读-写自旋锁15010.4信号量15210.4.1计数信号量和二值信号量15310.4.2创建和初始化信号量15410.4.3使用信号量15410.5读-写信号量15510.6互斥体15610.6.1信号量和互斥体15810.6.2自旋锁和互斥体15810.7完成变量15810.8BLK:大内核锁15910.9顺序锁16010.10禁止抢占16110.11顺序和屏障16210.12小结165第11章定时器和时间管理16611.1内核中的时间概念16611.2节拍率:HZ16711.2.1理想的HZ值16811.2.2高HZ的优势16911.2.3高HZ的劣势16911.3jiffies17011.3.1jiffies的内部表示17111.3.2jiffies的回绕17211.3.3用户空间和HZ17311.4硬时钟和定时器17411.4.1实时时钟17411.4.2系统定时器17411.5时钟中断处理程序17411.6实际时间17611.7定时器17811.7.1使用定时器17811.7.2定时器竞争条件18011.7.3实现定时器18011.8延迟执行18111.8.1忙等待18111.8.2短延迟18211.8.3schedule_timeout()18311.9小结185第12章内存管理18612.1页18612.2区18712.3获得页18912.3.1获得填充为0的页19012.3.2释放页19112.4kmalloc()19112.4.1gfp_mask标志19212.4.2kfree()19512.5vmalloc()19612.6slab层19712.6.1slab层的设计19812.6.2slab分配器的接口20012.7在栈上的静态分配20312.7.1单页内核栈20312.7.2在栈上光明正大地工作20312.8高端内存的映射20412.8.1永久映射20412.8.2临时映射20412.9每个CPU的分配20512.10新的每个CPU接口20612.10.1编译时的每个CPU数据20612.10.2运行时的每个CPU数据20712.11使用每个CPU数据的原因20812.12分配函数的选择20912.13小结209第13章虚拟文件系统21013.1通用文件系统接口21013.2文件系统抽象层21113.3Unix文件系统21213.4VFS对象及其数据结构21313.5超级块对象21413.6超级块操作21513.7索引节点对象21713.8索引节点操作21913.9目录项对象22213.9.1目录项状态22213.9.2目录项缓存22313.10目录项操作22413.11文件对象22513.12文件操作22613.13和文件系统相关的数据结构23013.14和进程相关的数据结构23213.15小结233第14章块I/O层23414.1剖析一个块设备23414.2缓冲区和缓冲区头23514.3bio结构体23714.3.1I/O向量23814.3.2新老方法对比23914.4请求队列24014.5I/O调度程序24014.5.1I/O调度程序的工作24114.5.2Linus电梯24114.5.3最终期限I/O调度程序24214.5.4预测I/O调度程序24414.5.5完全公正的排队I/O调度程序24414.5.6空操作的I/O调度程序24514.5.7I/O调度程序的选择24514.6小结246第15章进程地址空间24715.1地址空间24715.2内存描述符24815.2.1分配内存描述符24915.2.2撤销内?描述符25015.2.3mm_struct与内核线程25015.3虚拟内存区域25115.3.1VMA标志25115.3.2VMA操作25315.3.3内存区域的树型结构和内存区域的链表结构25415.3.4实际使用中的内存区域25415.4操作内存区域25515.4.1find_vma()25615.4.2find_vma_prev()25715.4.3find_vma_intersection()25715.5mmap()和do_mmap():创建地址区间25815.6mummap()和do_mummap():删除地址区间25915.7页表26015.8小结261第16章页高速缓存和页回写26216.1缓存手段26216.1.1写缓存26216.1.2缓存回收26316.2Linux页高速缓存26416.2.1address_space对象26416.2.2address_space操作26616.2.3基树26716.2.4以前的页散列表26816.3缓冲区高速缓存26816.4flusher线程26816.4.1膝上型计算机模式27016.4.2历史上的bdflush、kupdated和pdflush27016.4.3避免拥塞的方法:使用多线程27116.5小结271第17章设备与模块27317.1设?类型27317.2模块27417.2.1Hello,World27417.2.2构建模块27517.2.3安装模块27717.2.4产生模块依赖性27717.2.5载入模块27817.2.6管理配置选项27917.2.7模块参数28017.2.8导出符号表28217.3设备模型28317.3.1kobject28317.3.2ktype28417.3.3kset28517.3.4kobject、ktype和kset的相互关系28517.3.5管理和操作kobject28617.3.6引用计数28717.4sysfs28817.4.1sysfs中添加和删除kobject29017.4.2向sysfs中添加文件29117.4.3内核事件层29317.5小结294第18章调试29518.1准备开始29518.2内核中的bug29618.3通过打印来调试29618.3.1健壮性29618.3.2日志等级29718.3.3记录缓冲区29818.3.4syslogd和klogd29818.3.5从printf()到printk()的转换29818.4oops29818.4.1ksymoops30018.4.2kallsyms30018.5内核调试配置选项30118.6引发bug并打印信息30118.7?神奇的系统请求键30218.8内核调试器的传奇30318.8.1gdb30318.8.2kgdb30418.9探测系统30418.9.1用UID作为选择条件30418.9.2使用条件变量30518.9.3使用统计量30518.9.4重复频率限制30518.10用二分查找法找出引发罪恶的变更30618.11使用Git进行二分搜索30718.12当所有的努力都失败时:社区30818.13小结308第19章可移植性30919.1可移植操作系统30919.2Linux移植史31019.3字长和数据类型31119.3.1不透明类型31319.3.2指定数据类型31419.3.3长度明确的类型31419.3.4char型的符号问题31519.4数据对齐31519.4.1避免对齐引发的问题31619.4.2非标准类型的对齐31619.4.3结构体填补31619.5字节顺序31819.6时间31919.7页长度32019.8处理器排序32019.9SMP、内核抢占、高端内存32119.10小结321第20章补丁、开发和社区32220.1社区32220.2Linux编码风格32220.2.1缩进32320.2.2switch语句32320.2.3空格32420.2.4花括号32520.2.5每行代码的长度32620.2.6命名规范32620.2.7函数32620.2.8注释32620.2.9typedef32720.2.10多用现成的东西32820.2.11在源码中减少使用ifdef32820.2.12结构初始化32820.2.13代码的事后修正32920.3管理系统32920.4提交错误报告32920.5补丁33020.5.1创建补丁33020.5.2用Git创建补丁33120.5.3提交补丁33120.6小结332参考资料333
查看详情
好书推荐 / 更多
Linux内核设计与实现(原书第3版)
北平学人访问记(上)(碎金文丛5)
贺逸文
Linux内核设计与实现(原书第3版)
文青之死
赖香吟 ;后浪
Linux内核设计与实现(原书第3版)
立马上菜
M.F.K.费雪
Linux内核设计与实现(原书第3版)
自愈之路:开创癌症免疫疗法的科学家们
[美]尼尔·卡纳万(Neil Canavan)
Linux内核设计与实现(原书第3版)
哲思与海:一部诗意的哲学随笔
[美]戴维·法雷尔·克雷尔 著;陈瑾 译
Linux内核设计与实现(原书第3版)
锥形帐篷的起源
乔尼·休斯
Linux内核设计与实现(原书第3版)
事邦国之神祇:唐至北宋吉礼变迁研究
朱溢 著
Linux内核设计与实现(原书第3版)
《剑桥非洲史·20世纪卷(1905—1940)》 《剑桥非洲史·20世纪卷(1940—1975)》(丛书2册)
安德鲁·罗伯茨;迈克尔·克劳德
Linux内核设计与实现(原书第3版)
面具与乌托邦:墨西哥人民及其文化剪影
[墨]萨穆埃尔·拉莫斯
Linux内核设计与实现(原书第3版)
苏联的外宾商店:为了工业化所需的黄金
[俄罗斯]叶列娜·亚历山德罗夫娜·奥金娜
Linux内核设计与实现(原书第3版)
警治的终结
[英]亚历克斯·S.维塔莱 著;王飞、张鹏瀚 译
Linux内核设计与实现(原书第3版)
用电影燃尽欲望
[【日】]园子温;余梦娇