Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理(第2版)-预付365_综合福利消费平台
0 购物车
商品详情
首页 > 图书> 计算机与互联网> 操作系统 > Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理(第2版)
Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理(第2版)
商品价格: ¥76.30 [定价  ¥89.00]
商品编号: 11243705
服      务: 图书 负责发货并提供售后服务
商品运费: 全站满99包邮,不满收10元,实际运费以支付页面金额为准。
温馨提示: 不支持7天无理由退货
购买数量: - +
365商城不参加品牌方的满减优惠及赠品活动
商品介绍
规格与包装
  • 商品名称:Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理(第2版)
  • 商品编号:11243705
产品特色

  为什么写这本书
  很早就有一个想法,做中国人自己的、有所突破、有所创新的操作系统、计算机语言及编译平台。
  我带领的“新设计团队”(主要由中国科学院研究生院毕业的学生组成)在实际开发自己的操作系统的过程中,最先遇到的问题就是如何培养学生真正看懂Linux操作系统的源代码的能力。开源的Linux操作系统的源代码很容易找到,但很快就会发现,培养学生看懂Linux操作系统的源代码是一件非常困难的事。
  操作系统的代码量通常都是非常庞大的,动辄几百万行,即使浏览一遍也要很长时间。比庞大的代码量更让学习者绝望的是操作系统有着极其错综复杂的关系。看上去,代码的执行序时隐时现,很难抓住脉络。代码之间相互牵扯,相互勾连,几乎无法理出头绪,更谈不上理解代码背后的原理、意图和思想。
  对于学生而言,选择从源代码的什么地方开始分析,本身就是一个难题。通常,学生有两种选择:一种是从main函数,也就是从C语言代码的总入口开始,沿着源代码的调用路线一行一行地看下去,学生很快就会发现源代码的调用路线莫名其妙地断了,但直觉和常识告诉他操作系统肯定不会在这个地方停止,一定还在继续运行,却不知道后续的代码在哪里,这种方法很快就走进了死胡同;另一种则是从某一模块入手,如文件系统,但这样会无形中切断操作系统源码之间复杂的关系,如文件系统与进程管理的关系,文件系统与内存管理的关系,等等。学生如果孤立地去理解一个模块,往往只能记住一些名词和简单概念,难以真正理解操作系统的全貌。用学生的话讲,他们理解的操作系统变成了“文科”的操作系统。
  由于操作系统是底层系统程序,对应用程序行之有效的调试和跟踪等手段对操作系统的源代码而言,几乎无效。学生就算把每一行源代码都看懂了,对源代码已经烂熟于心,知道这一行是一个for循环,那一行是一个调用……但仍然不知道整个代码究竟在做什么以及起到什么作用,更不知道设计者的意图究竟是什么。
  学生在操作系统课程上学习过进程管理、内存管理、文件系统等基础知识,但是对这些空洞的理论在一个实际的操作系统中是如何实现的却不得而知。他们在源代码中很难看出进程和内存之间有什么关联,内核程序和用户程序有什么区别,为什么要有这些区别;也很难从源代码中看清楚,我们实际经常用到的操作,比如打开文件,操作系统在其中都做了哪些具体的工作。想在与常见的应用程序的编程方法有巨大差异的、晦涩难懂的、浩瀚如海的操作系统底层源代码中找到这些问题的答案,似乎比登天还难。
  对熟悉操作系统源代码的学生而言,他们也知道像分页机制这样的知识点,知道若干级的分页及恒等映射,但是未必能够真正理解隐藏在机制背后的深刻意义。
  这些都是学生在学习Linux操作系统源代码时遇到的实际问题。中国科学院研究生院的学生应该是年轻人中的佼佼者,他们遇到的问题可能其他读者也会遇到。我萌发了一个想法,虽然学生的问题早已解决,但是否可以把他们曾经在学习、研发操作系统的过程中遇到的问题和心得体会拿出来供广大读者分享。
  当时,针对学生的实际问题,我的解决方法是以一个真实的操作系统为例,让学生理解源代码并把操作系统在内存中的运行时状态画出图来。实践证明,这个方法简单有效。
  现在我们把这个解决方案体现在这本书中。这就是以一个真实的操作系统的实际运行为主线;以图形、图像为核心,突出描述操作系统在实际运行过程中内存的运行时结构;强调学生站在操作系统设计者的视角,用体系的思想方法,整体把握操作系统的行为、作用、目的和意义。
  第1版与第2版的区别
  第2版较第1版有较大的改动。
  从总体结构上,将第1版的第2章拆分为第2版的第2章、第3章、第4章。这样的拆分对操作系统启动部分的系统初始化、激活进程0、创建进程1、创建进程2的层次划分更清晰。各章内容的分量也比较均衡,阅读感受会更好。
  根据读者的反馈意见,第2版增加了一些示意图,在源代码中增加了大量的注释,对操作系统的架构表述得更直观,对源代码讲解得更细致。这些是第2版改动最大、下功夫最多的地方。希望我们的努力能给读者带来更多的帮助。
  本书内容及特色
  在全书的讲解过程中,我们不仅详细分析了源代码、分析了操作系统的执行序,还特别分析了操作系统都做了哪些“事”,并且对于“事”与“事”之间的关系和来龙去脉,这些“事”意味着什么,为什么要做这些“事”,这些“事”背后的设计思想是什么……都做了非常详细且深入的分析。
  更重要的是,对于所有重要的阶段,我们几乎都用图解的方式把操作系统在内存中的实际运行状态精确地表示了出来。我们用600 dpi的分辨率精心绘制了300多张图,图中表现的运行时结构和状态与操作系统实际运行的真实状态完全吻合。对每一条线、每一个色块、每一个位置、每一个地址及每一个数字,我们都经过了认真反复地推演和求证,并最终在计算机上进行了核对和验证。看了这些绘制精美的图后,读者的头脑中就不再是一行行、一段段枯燥的、令人眩晕的源代码,而是立体呈现的一件件清晰的“事”,以及这些“事”在内存中直截了当、清晰鲜活的画面。用这样的方法讲解操作系统是本书的一大特色。理解这些图要比理解源代码和文字容易得多。毫不夸张地说,只要你能理解这些图,你就理解了操作系统的80%。这时你可以自豪地说,你比大多数用别的方法学过操作系统的人的水平都要高出一大截。
  作者和机械工业出版社的编辑做了大量的检索工作。就我们检索的范围而言,这样的创作方法及具有这样特色的操作系统专著在世界范围都是第一次。
  本书分三部分来讲解Linux操作系统:第一部分(第1~4章)分析了从开机加电到操作系统启动完成并进入怠速状态的整个过程;第二部分(第5~8章)讲述了操作系统进入系统怠速后,在执行用户程序的过程中,操作系统和用户进程的实际运行过程和状态;第三部分(第9章)阐述整个Linux操作系统的设计指导思想,是从微观到宏观的回归。
  第一部分中,我们详细讲解了开机加电启动BIOS,通过BIOS加载操作系统程序,对主机的初始化,打开保护模式和分页,调用main函数,创建进程0、进程1、进程2以及shell进程,并且具备用文件的形式与外设交互。
  第二部分中,我们设计了几个尽可能简单又有代表性的应用程序,并以这些程序的执行为引导,详细讲解了安装文件系统、文件操作、用户进程与内存管理、多个进程对文件的操作以及进程间通信。
  我们将操作系统的原理自然而然地融入了讲解真实操作系统的实际运行过程中。在读者看来,操作系统原理不再是空对空的、“文科”概念的计算机理论,而是既有完整且体系的理论,又有真实、具体、实际的代码和案例,理论与实际紧密结合。
  第三部分是全书水平最高的部分,详细阐述了主奴机制以及实现主奴机制的三项关键技术:保护和分页、特权级、中断,分析了保障主奴机制实现的决定性因素—先机,还详细讲解了缓冲区、共享页面、信号、管道的设计指导思想。我们尝试从操作系统设计者的视角讲解操作系统的设计指导思想。希望帮助读者用体系的思想理解、把握、驾驭整个操作系统以及背后的设计思想和设计意图。
  在本书中,我们详细讲解了大家在学习操作系统的过程中可能会遇到的每一个难点,如main函数中的pause()调用,虽然已经找不到后续代码,但该调用结束后,程序仍然执行的原因是:中断已经打开,进程调度就开始了,而此时可以调度的进程只有进程1,所以后续的代码应该从进程1处继续执行……
  我们还对读者不容易理解和掌握的操作系统特有的底层代码的一些编程技巧做了详细的讲解,如用模拟call的方法,通过ret指令“调用”main函数……
  总之,我们所做的一切努力就是想真正解决读者遇到的实际问题和难题,给予读者有效的帮助。我们盼望即使是刚刚考入大学的学生也有兴趣和信心把这本书读下去;我们同样希望即使是对操作系统源代码很熟悉的读者,这本书也能给他们一些不同的视角、方法和体系性思考。
  为什么本书选用Linux 0.11内核
  这本书选用的是Linux 0.11操作系统源代码。对为什么选用Linux 0.11而不是最新版本,赵炯先生有过非常精彩的论述。我们认为赵先生的论述是非常到位的。
  我们不妨看一下Linux最新的版本2.6,代码量大约在千万行这个量级,去掉其中的驱动部分,代码量仍在百万行这个量级。一个人一秒钟看一行,一天看8小时,中间不吃、不喝、不休息,也要看上几个月,很难想象如何去理解。
  就算我们坚持要选用Linux 2.6,就算我们写上2000页(书足足会有十几厘米厚),所有的篇幅都用来印代码,也只能印上不到十分之一的代码。所以,即使是这么不切实际的篇幅,也不可能整体讲解Linux 2.6。读者会逐渐明白,对于理解和掌握操作系统而言,真正有价值的是整体、是体系,而不是局部。
  Linux 0.11的内核代码虽然只有约两万行,但却是一个实实在在、不折不扣的现代操作系统。因为它具有现代操作系统最重要的特征—支持实时多任务,所以必然支持保护和分页……而且它还是后续版本的真正的始祖,有着内在的、紧密的传承关系。读者更容易看清设计者最初的、最根本的设计意图和设计指导思想。
  Linux 0.11已经问世20多年了,被世人广为研究和学习。换一个角度看,要想对众人熟悉的事物和领域讲出新意和特色,对作者来说也是一个强有力的挑战。
  致谢
  首先,感谢机械工业出版社华章公司的副总经理温莉芳女士以及其他领导,是他们的决心和决策成就了这本书,并且在几乎所有方面给予了强有力的支持。特别令人感动的是他们主动承担了全部的出版风险,同时给予了作者最好的条件,让我们看到一个大出版社的气度和风范。
  其次,特别感谢机械工业出版社华章公司的编辑杨福川。杨先生的鉴赏力和他的事业心以及他对工作认真负责的态度为这本书的出版打开了大门。杨先生对读者的理解以及他的计算机专业素养使得他有能力对这本书给予全方位的指导和帮助,使我们对这本书整体修改了多次,使之更贴近读者,可读性更好。
  还要感谢我们和杨福川共同的朋友张国强先生和杨缙女士。
  最后,感谢我们的家人和朋友,是他们坚定的支持才使得整个团队能够拒绝方方面面、形形色色的诱惑,放弃普遍追求的短期利益;我们在常人难以想象的艰苦条件下,长时间专注于操作系统、计算机语言、编译器、计算机体系结构等基础性学科的研究。因为我们认认真真、踏踏实实、不为名利,只为做一点实在、深入的工作,积累了十年的经验,打造了一支敢想、敢干、敢打、敢拼、不惧世界顶级强敌的队伍。这些是本书的基础。
  杨力祥
  中国科学院研究生院
  2013年1月


 
编辑推荐

  【畅销书】版权输出到美国、韩国和中国台湾,实现了中国计算机图书向美国输出的零的突破。英文版被MIT等100多所大学图书馆和美国国会图书馆收藏

  对于操作系统而言,稳定且可靠地运行是最重要的。现行技术方案是将用户进程与用户进程之间、用户进程与操作系统之间进行分离,操作系统可以管理用户进程,但是用户进程之间不能互相干预,更不能“侵入”操作系统内核。然而这一切是如何实现的呢?用户程序和操作系统都是程序,使用的是同一个CPU、同一套指令集、同一个内存条,为什么会有这么大的区别呢?

  绝妙之处在于操作系统的设计指导思想:主奴机制!

  操作系统的设计者依托硬件,在主奴机制设计思想的指导下,把操作系统内核与用户进程间的关系设计为“主子”与“奴才”的关系。该指导思想贯穿整个操作系统设计的始终,涉及操作系统的方方面面。以内存管理为例,操作系统内核可以访问所有的内存空间,包括用户进程的内存空间,而用户进程则不能访问其他用户进程的内存空间,更不可能访问操作系统内核的内存空间。更有甚者,用户进程甚至不知道自身的代码以及所访问的内存究竟在物理内存中的什么位置……可以说,操作系统就是围绕着“主奴机制”这个设计指导思想实现的。

  本书不仅在主奴机制等宏观的设计指导思想方面有独到的见解,而且对操作系统源代码的实现原理和编程技巧等微观内容的讲解与分析也细致入微。例如:

  为什么操作系统的内核代码不是加载在0x00000的位置?

  为什么 jmpi 0, 8中的“8”不能简单地当做阿拉伯数字“8”看待?

  为什么用C语言写的操作系统却不是从main函数开始执行?

  ……

  所有这些在同类书中可能都不曾提及的问题在本书中都有精彩的论述。

  第1版与第2版的区别

  结合广大读者的反馈意见和新设计团队对操作系统新的认识,第2版在第1版的基础上进行了大幅度的优化和重写,使得本书的内容更易于读者理解。主要改动如下:

  第1版的第2章在第2版中被拆分为第2、3、4章,这样的拆分对操作系统启动部分的系统初始化、激活进程0、创建进程1、进程2的层次划分更清晰,各章内容的篇幅也更为均衡,阅读体验会更好。

  根据读者的反馈,第2版中增加了一些示意图,更便于读者理解。

  根据读者的要求,在源代码中增加了大量的注释,对操作系统的架构描述更直观,对源代码的讲解更细致。

内容简介

  长期以来,新设计团队一直在为设计一个自主的、有所突破和创新的操作系统而努力。为了让新的成员能更快、更容易地理解操作系统的精髓,从更高的角度去鉴赏和发现操作系统设计中的精妙与不足,团队成员以Linux 0.11内核为例,对操作系统的设计思想和实现原理进行了深刻地剖析,取得了十分好的效果,很好地培养和锻炼了团队成员对操作系统的驾驭能力。为了实现让国人也能设计出自己的操作系统的目标,本书作者团队无私地将他们的独特研究方式与研究成果奉献了出来,希望所有想要去深刻理解Linux内核和操作系统设计思想朋友能从中受益。

  本书的特点在于,既不是空泛地讲理论,也不是单纯地从语法的角度去逐行地分析源代码,而是以操作系统在实际运行中的几个经典事件为主线,将理论和实际结合在一起,精准地再现了操作系统在实际运行中究竟是如何运转的。宏观上,大家可以领略Linux 0.11内核的设计指导思想,可以了解到各个环节是如何牵制并保持平衡的,以及软件和硬件之间是如何互相依赖、互相促进的;微观上,大家可以看到每一个细节的实现方式和其中的精妙之处。


作者简介

  新设计团队,一直在为设计一个自主的、有所突破和创新的操作系统而努力。为了让新的成员能更快、更容易地理解操作系统的精髓,从更高的角度去鉴赏和发现操作系统设计中的精妙与不足,团队成员以Linux 0.11内核为例,对操作系统的设计思想和实现原理进行了深刻地剖析,取得了十分好的效果,很好地培养和锻炼了团队成员对操作系统的驾驭能力。为了实现让国人也能设计出自己的操作系统的目标,本书作者团队无私地将他们的独特研究方式与研究成果奉献了出来,希望所有想要深刻理解Linux内核和操作系统设计思想的朋友能从中受益。
  《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理(第2版)》的特点在于,既不是空泛地讲理论,也不是单纯地从语法的角度去逐行地分析源代码,而是以操作系统在实际运行中的几个经典事件为主线,将理论和实际结合在一起,精准地再现了操作系统在实际运行中究竟是如何运转的。宏观上,大家可以领略Linux 0.11内核的设计指导思想,可以了解到各个环节是如何牵制并保持平衡的,以及软件和硬件之间是如何互相依赖、互相促进的;微观上,大家可以看到每一个细节的实现方式和其中的精妙之处。

目录

前  言
第1章·从开机加电到执行
main函数之前的过程
1.1 启动BIOS,准备实模式下的中断向量表和中断服务程序
1.1.1 BIOS的启动原理
1.1.2 BIOS 在内存中加载中断向量表和中断服务程序
1.2 加载操作系统内核程序并为保护模式做准备
1.2.1 加载第一部分内核代码--引导程序(bootsect)
1.2.2 加载第二部分内核代码--setup
1.2.3 加载第三部分内核代码--system模块
1.3 开始向32位模式转变,为main函数的调用做准备
1.3.1 关中断并将system移动到内存地址起始位置0x0000
1.3.2 设置中断描述符表和全局描述符表
1.3.3 打开A20,实现32位寻址
1.3.4 为保护模式下执行head.s做准备
1.3.5 head.s开始执行
1.4 本章小结


第2章·设备环境初始化及激活进程
2.1 设置根设备、硬盘
2.2 规划物理内存格局,设置缓冲区、虚拟盘、主内存
2.3 设置虚拟盘空间并初始化
2.4 内存管理结构mem_map初始化
2.5 异常处理类中断服务程序挂接
2.6 初始化块设备请求项结构
2.7 与建立人机交互界面相关的外设的中断服务程序挂接
2.7.1 对串行口进行设置
2.7.2 对显示器进行设置
2.7.3 对键盘进行设置
2.8 开机启动时间设置
2.9 初始化进程
2.9.1 初始化进程
2.9.2 设置时钟中断
2.9.3 设置系统调用总入口
2.10 初始化缓冲区管理结构
2.11 初始化硬盘
2.12 初始化软盘
2.13 开启中断
2.14 进程0由0特权级翻转到3特权级,成为真正的进程
2.15 本章小结


第3章·进程1的创建及执行
3.1 进程1的创建
3.1.1 进程0创建进程
3.1.2 在task[64]中为进程1申请一个空闲位置并获取进程号
3.1.3 调用copy_process函数
3.1.4 设置进程1的分页管理
3.1.5 进程1共享进程0的文件
3.1.6 设置进程1在GDT中的表项
3.1.7 进程1处于就绪态
3.2 内核第一次做进程调度
3.3 轮转到进程1执行
3.3.1 进程1为安装硬盘文件系统做准备
3.3.2 进程1格式化虚拟盘并更换根设备为虚拟盘
3.3.3 进程1在根设备上加载根文件系统
3.4 本章小结


第4章·进程2的创建及执行
4.1 打开终端设备文件及复制文件句柄
4.1.1 打开标准输入设备文件
4.1.2 打开标准输出、标准错误输出设备文件
4.2 进程1创建进程2并切换到进程2执行
4.3 加载shell程序
4.3.1 关闭标准输入设备文件,打开rc文件
4.3.2 检测shell文件
4.3.3 为shell程序的执行做准备
4.3.4 执行shell程序
4.4 系统实现怠速
4.4.1 创建update进程
4.4.2 切换到shell进程执行
4.4.3 重建shell
4.5 本章小结


第5章·文件操作
5.1 安装文件系统
5.1.1 获取外设的超级块
5.1.2 确定根文件系统的挂接点
5.1.3 将超级块与根文件系统挂接
5.2 打开文件
5.2.1 将进程的*filp[20]与file_table[64]挂接
5.2.2 获取文件i节点
5.2.3 将文件i节点与file_table[64]挂接
5.3 读文件
5.3.1 确定数据块在外设中的位置
5.3.2 将数据块读入缓冲块
5.3.3 将缓冲块中的数据复制到进程空间
5.4 新建文件
5.4.1 查找文件
5.4.2 新建文件i节点
5.4.3 新建文件目录项
5.5 写文件
5.5.1 确定文件的写入位置
5.5.2 申请缓冲块
5.5.3 将指定的数据从进程空间复制到缓冲块
5.5.4 数据同步到外设的两种方法
5.6 修改文件
5.6.1 重定位文件的当前操作指针
5.6.2 修改文件
5.7 关闭文件
5.7.1 当前进程的filp与file_table[64]脱钩
5.7.2 文件i节点被释放
5.8 删除文件
5.8.1 对文件的删除条件进行检查
5.8.2 进行具体的删除工作
5.9 本章小结


第6章·用户进程与内存管理
6.1 线性地址的保护
6.1.1 进程线性地址空间的格局
6.1.2 段基址、段限长、GDT、LDT、特权级
6.2 分页
6.2.1 线性地址映射到物理地址
6.2.2 进程执行时分页
6.2.3 进程共享页面
6.2.4 内核分页
6.3 一个用户进程从创建到退出的完整过程
6.3.1 创建str1进程
6.3.2 str1进程加载的准备工作
6.3.3 str1进程的运行、加载
6.3.4 str1进程的退出
6.4 多个用户进程同时运行
6.4.1 进程调度
6.4.2 页写保护
6.5 本章小结


第7章·缓冲区和多进程操作文件
7.1 缓冲区的作用
7.2 缓冲区的总体结构
7.3 b_dev、b_blocknr及request的作用
7.3.1 保证进程与缓冲块数据交互的正确性
7.3.2 让数据在缓冲区中停留的时间尽可能长
7.4 uptodate和dirt的作用
7.4.1 b_uptodate的作用
7.4.2 b_dirt的作用
7.4.3 i_uptodate、i_dirt和s_dirt的作用
7.5 count、 lock、wait、request的作用
7.5.1 b_count的作用
7.5.2 i_count的作用
7.5.3 b_lock、*b_wait的作用
7.5.4 i_lock、i_wait、s_lock、*s_wait的作用
7.5.5 补充request的作用
7.6 实例1:关于缓冲块的进程等待队列
7.7 总体来看缓冲块和请求项
7.8 实例2:多进程操作文件的综合实例
7.9 本章小结


第8章·进程间通信
8.1 管道机制
8.1.1 管道的创建过程
8.1.2 管道的操作
8.2 信号机制
8.2.1 信号的使用
8.2.2 信号对进程执行状态的影响
8.3 本章小结


第9章·操作系统的设计指导思想
9.1 运行一个最简单的程序,看操作系统为程序运行做了哪些工作
9.2 操作系统的设计指导思想--主奴机制
9.2.1 主奴机制中的进程及进程创建机制
9.2.2 操作系统的设计如何体现主奴机制
9.3 实现主奴机制的三种关键技术
9.3.1 保护和分页
9.3.2 特权级
9.3.3 中断
9.4 建立主奴机制的决定性因素--先机
9.5 软件和硬件的关系
9.5.1 非用户进程--进程0、进程1、shell进程
9.5.2 文件与数据存储
9.6 父子进程共享页面
9.7 操作系统的全局中断与进程的局部中断--信号
9.8 本章小结
结束语
“新设计团队”简介

精彩书摘
  2.10初始化缓冲区管理结构
  缓冲区是内存与外设(如硬盘,以后以硬盘为例)进行数据交互的媒介。内存与硬盘最大的区别在于,硬盘的作用仅仅是对数据信息以很低的成本做大量数据的断电保存,并不参与运算(因为CPU无法到硬盘上进行寻址),而内存除了需要对数据进行保存以外,更重要的是要与CPU、总线配合进行数据运算。缓冲区则介于两者之间,它既对数据信息进行保存,也能够参与一些像查找、组织之类的间接、辅助性运算。有了缓冲区这个媒介以后,对外设而言,它仅需要考虑与缓冲区进行数据交互是否符合要求,而不需要考虑内存如何使用这些交互的数据;对内存而言,它也仅需要考虑与缓冲区交互的条件是否成熟,而不需要关心此时外设对缓冲区的交互情况。两者的组织、管理和协调将由操作系统统一操作。
  操作系统通过hash_table[NR_HASH]、buffer_head双向环链表组成的复杂的哈希表管理缓冲区。
  操作系统通过调用buffer_init()函数对缓冲区进行设置,执行代码如下:
  在buffer_init()函数里,从内核的末端及缓冲区的末端同时开始,方向相对增长、配对地做出buffer_head、缓冲块,直到不足一对buffer_head、缓冲块。在第2章开始时设定的内存格局下,有3000多对buffer_head、缓冲块,buffer_head在低地址端,缓冲块在高地址端。
  将buffer_head的成员设备号b_dev、引用次数b_count、“更新”标志b_uptodate、“脏”标志b_dirt、“锁定”标志b_lock设置为0。如图2—24所示,将b_data指针指向对应的缓冲块。利用buffer_head的b_prevz_free、b_next_free,将所有的buffer_head形成双向链表。使flee_list指向第一个buffer_head,并利用free_list将buffer_head形成双向链表链接成双向环链表,如图2—25所示。
  注意图2—26顶部所示的内存的变化。在紧靠系统内核的部分,多出了一块用黑色表示的内存区域,那里面存储的就是缓冲区管理结构。由于它管理着3000多个缓冲块,因此它占用的内存空间的大小,与内核几乎差不多。图2—26中也对空闲表的双向链表结构给出了形象的说明。
  ……
  • 著者新设计团队
  • 出版社机械工业出版社
  • ISBN9787111421764
  • 版次2
  • 包装平装
  • 出版时间2013-05-01
  • 用纸胶版纸
  • 页数468
  • 正文语种中文

温馨提示

由于部分商品包装更换较为频繁,因此您收到的货品有可能与图片不完全一致,请您以收到的商品实物为准,同时我们会尽量做到及时更新,由此给您带来不便多多谅解,谢谢!