Linux内核完全剖析[试读]
序
本书是一本有关Linux操作系统内核基本工作原理的入门读物。 本书的主要目标 本书的主要目标是使用尽量少的篇幅,对完整的Linux内核源代码进行解剖,使读者对操作系统的基本功能和实际实现方式获得全方位的理解。 本书读者应是知晓Linux系统的一般使用方法或具有一定的编程基础,但比较缺乏阅读目前最新内核源代码的基础知识,又急切希望能够进一步理解UNIX类操作系统内核工作原理和实际代码实现的爱好者。这部分读者的水平应该界于初级与中级水平之间。目前,这部分读者人数在Linux爱好者中所占的比例是很高的,而面向这部分读者以比较易懂和有效的手段讲解内核的书籍资料不多。 ... 查看全部[ 序 ]
数学协处理器
内核目录kernel/math目录中包含数学协处理器仿真处理代码文件,共包含9个C语言程序,见表11-1。本章内容与具体硬件结构关系非常密切,因此需要读者具备较深的有关Intel CPU和协处理器指令代码结构的知识。但好在这些内容与内核实现关系不大,因此跳过本章内容并不会妨碍读者对内核实现方法的完整理解。不过若能理解本章内容,那么对于实现系统级应用程序(例如汇编和反汇编等程序)和编制协处理器浮点处理程序将有很大帮助。 表11-1 linux/kernel/math目录 名称 大小/B 最后修改时间 名称 大小/B 最后修改时间 Makefile 3377 1... 查看全部[ 数学协处理器 ]
浮点数据类型
具有整数部分和小数(尾数)部分的数称为实数或浮点数。实际上整型数是小数部分为0的实数,是实数集的一个子集。由于计算机使用固定长度位来表示一个数,因此并不能精确地表示所有实数。由于计算机表示实数时为了在固定长度位内能表示尽量精确的实数值,分配给表示小数部分的位个数并不是固定的,即小数点是可以“浮动”的,因此计算机表示的实数数据类型也称为浮点数。为了便于程序移植,目前计算机中都使用IEEE标准754指定的浮点数表示方式来表示实数。 这种实数表示方式的一般格式如图 11-3 所示。它由有效数(Significant)部分、指数(Exponent)部分和符号位(Sign)组成。8038... 查看全部[ 浮点数据类型 ]
特殊实数
与上面表中格式某些值无法表示的情况类似,使用实数格式表示的某些值也有其特殊含义。对于80位长度格式的临时实数,80387并没有使用其可表示的所有范围数值。表11-3是80387使用中的临时实数所能表示的所有可能的数值,其中有效数一栏虚线左侧1位表示临时实数位63,即明确表示数值1的位。短实数和长实数没有此位,因此也没有表中的伪非规格化类别。下面说明其中的一些特殊值:零值、无穷值、非规格化值、伪非规格化值以及信号NaN(Not a Number)和安静NaN。 表11-3 80387临时实数所能表示的数值类型和范围 负号 偏置型指数 有效数 类别 0/1 11.... 查看全部[ 特殊实数 ]
数学协处理器功能和结构
80386虽然是一个通用微处理器,但其指令并不是非常适用于数学计算。因此若使用80386来执行数学计算,那么就需要编制非常复杂的程序,而且执行效率也相对较低。80387作为80386的辅助处理芯片,极大地扩展了程序员的编程范围。以前程序员不太可能做到的事,使用协处理器后就可以很容易地,并且快速而精确地完成。 80387具有一组特别的寄存器。这组寄存器可以让80387直接操作比80386所能处理的大或小几个数量级的数值。80386使用2进制补数方式表示一个数。这种方法不适合用来表示小数。而80387并不使用2的补数方法来表示数值,它使用了IEEE标准754规定的80位(10个字节... 查看全部[ 数学协处理器功能和结构 ]
栈式浮点累加器
在浮点指令执行过程中,8个80位长度的物理寄存器组被作为栈式累加器使用。虽然每个80位寄存器有固定的物理顺序位置(即左边的0~7),但当前栈顶则由ST(即ST(0))来指明。ST之下的其余累加器使用名称ST(i)来指明(i = 1~7)。至于哪个80位物理寄存器是当前栈顶ST,则由具体操作过程指定。在状态字寄存器中名称为TOP的3位字段含有当前栈顶ST对应的80位物理寄存器的绝对位置。一个入栈(Push)操作将会把TOP字段值递减1,并把新值存储于新的ST中。在入栈操作之后,原来的ST变成了ST(1),而原来的ST(7)变成了现在的ST。即所有累加器的名称都从原来的ST(i)变成了ST... 查看全部[ 栈式浮点累加器 ]
状态与控制寄存器
三个16位的寄存器(TAG字、控制字和状态字)控制着浮点指令的操作并且为其提供状态信息。它们的具体格式如图11-6所示。下面逐一对它们进行说明。 (1)控制字 控制字(Control Word)可用于程序设置各种处理选项来控制80387的操作。其中可分为三个部分。位11~10的RC(Rounding Control)是舍入控制字段,用于对计算结果进行舍入操作。位9~8的PC(Precision Control)是精度控制字段,用于在保存到指定存储单元之前对计算结果进行精度调整。所有其他操作使用临时实数格式精度,或者使用指令指定的精度。位5~0是异常屏蔽位,用于控制协处理... 查看全部[ 状态与控制寄存器 ]
出错指针寄存器
出错指针寄存器(Error-Pointer Register)是4个32位的80387寄存器,其中含有80387最后执行指令和所用数据的指针,参见图11-6。前两个寄存器FIP和FCS中是最后执行指令中2个操作码的指针(忽略前缀码)。FCS是段选择符和操作码,FIP是段内偏移值。后两个寄存器FOO和FOS是最后执行指令内存操作数的指针。FOS中是段选择符,FOO中是段内偏移值。如果最后执行的协处理器指令不含内存操作数,则后两个寄存器值无用。指令FLDENV、FSTENV、FNSTENV、FRSTOR、FSAVE和FNSAVE用于加载和保存这4个寄存器的内容。前3条指令共加载或保存28字... 查看全部[ 出错指针寄存器 ]
math_emulate.c程序
math_emulate.c程序中的所有函数可分为3部分:第一类是设备不存在异常处理程序接口函数math_emulate(),只有这一个函数;第二类是浮点指令仿真处理主函数do_emu(),也只有一个函数;另外所有函数都是仿真运算辅助类函数,包括其余几个C语言程序中的函数。 在一台不包含80387协处理器芯片的PC中,如果内核初始化时在CR0中设置了仿真标志EM = 1,那么当CPU遇到一条浮点指令时就会引起CPU产生异常中断int 7,并且在该中断处理过程中调用本程序中第476行处的math_emulate(long ___false)函数。 在math_emulat... 查看全部[ math_emulate.c程序 ]
书名: Linux内核完全剖析
作者: 赵炯
出版社: 机械工业出版社
副标题: 基于0.12内核
出版年: 2008.10
页数: 945
定价: 99.00元
装帧: 平装
ISBN: 9787111250470