自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 资源 (14)
  • 收藏
  • 关注

转载 Linux 内核配置系统浅析

<br />http://www-900.ibm.com/developerWorks/cn/linux/kernel/l-kerconf/<br /> <br />2003 年 2 月<br /> <br />随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 Linux 内核级的开发中。面对日益庞大的 Linux 内核源代码,开发者在完成自己的内核代码后,都将面临着同样的问题,即如何将源代码融入到 Linux 内核中,增加相应的 Linux 配置选项,并

2010-10-22 14:05:00 1422

原创 Linux 中的汇编语言(四)

4 GCC内嵌汇编编程<br />在Linux的源代码中,有很多C语言的函数中嵌入一段汇编语言程序段,这就是gcc提供的“asm”功能,例如在include/asm-i386/system.h中定义的,读控制寄存器CR0的一个宏read_cr0():<br />#define read_cr0() ({ /<br />unsigned int __dummy; /<br />__asm__( /<br />"movl %%cr0,%0/n/t" /<br />:"=r" (__dummy)); /<br /

2010-10-08 17:56:00 1964

原创 Linux 中的汇编语言(三)

3汇编程序指令(Assembler Directive)<br />上面介绍的.section就是汇编程序指令的一种,GNU汇编程序提供了很多这样的指令(directiv),这种指令都是以句点(.)为开头,后跟指令名(小写字母),在此,我们只介绍在内核源代码中出现的几个指令(以arch/i386/kernel/head.S中的代码为例)。<br /> <br />(1)ascii "string"...<br /> <br />.ascii 表示零个或多个(用逗号隔开)字符串,并把每个字符串(结尾不自动加“

2010-10-08 17:54:00 1855

原创 Linux 中的汇编语言(二)

2 AT&T汇编语言的相关知识<br />在Linux源代码中,以.S为扩展名的文件是“纯”汇编语言的文件。这里,我们结合<br />具体的例子再介绍一些AT&T汇编语言的相关知识。<br /> <br />1.GNU汇编程序GAS(GNU Assembly和连接程序)<br /> <br />当你编写了一个程序后,就需要对其进行汇编(assembly)和连接。在Linux下有两种方式,一种是使用汇编程序GAS和连接程序ld,一种是使用gcc。我们先来看一下GAS和ld:<br /> <br />GAS把汇

2010-10-08 17:52:00 1643

原创 Linux 中的汇编语言(一)

<br />在阅读Linux源代码时,你可能碰到一些汇编语言片段,有些汇编语言出现在以.S为扩展名的汇编文件中,在这种文件中,整个程序全部由汇编语言组成。有些汇编命令出现在以.c为扩展名的C文件中,在这种文件中,既有C语言,也有汇编语言,我们把出现在C代码中的汇编语言叫所“内嵌”汇编。不管这些汇编代码出现在哪里,它在一定程度上都成为阅读源代码的拦路虎。<br /> <br />尽管C语言已经成为编写操作系统的主要语言,但是,在操作系统与硬件打交道的过程中,在需要频繁调用的函数中以及某些特殊的场合中,C语言显

2010-10-08 17:50:00 2371

原创 BIOS系统服务 —— 时钟服务

8 时钟服务(Clock Service——INT 1AH) <br />00H —读取时钟“滴答”计数06H —设置闹钟<br />01H —设置时钟“滴答”计数07H —闹钟复位<br />02H —读取时间0AH —读取天数计数<br />03H —设置时间0BH —设置天数计数<br />04H —读取日期 80H —设置声音源信息<br />05H —设置日期<br /> <br />(1)       功能00H<br /> <br />功能描述:读取时钟“滴答”计数<br />入口参数:AH=

2010-10-08 16:32:00 1537

原创 BIOS系统服务 —— 并行口服务

7并行口服务(Parallel Port Service——INT 17H) <br />00H —向打印机输出字符<br />01H —初始化打印机端口<br />02H —读取打印机状态<br /> <br />(1)       功能00H<br /> <br />功能描述:向打印机输出字符<br />入口参数:AH=00H<br />AL=输出的字符<br />DX=打印机号(0—LPT1,1—LPT2,2—LPT3,……)<br />出口参数:AH=打印机状态。其各位为1时的含义如下:位7—打印机

2010-10-08 16:31:00 1214

原创 BIOS系统服务 —— 键盘服务

6 键盘服务(Keyboard Service——INT 16H) <br />00H、10H —从键盘读入字符03H —设置重复率<br />01H、11H —读取键盘状态04H —设置键盘点击<br />02H, 12H —读取键盘标志05H —字符及其扫描码进栈<br /> <br />(1)       功能00H和10H<br /> <br />功能描述:从键盘读入字符<br />入口参数:AH=00H——读键盘<br />=10H——读扩展键盘,可根据0000:0496H单元的内容判断:扩展键盘

2010-10-08 16:27:00 1788

原创 BIOS系统服务 —— 杂项系统服务

5 杂项系统服务(Miscellaneous System Service——INT 15H) <br />00H —开盒式磁带机马达85H —系统请求(SysReq)键<br />01H —关盒式磁带机马达86H —延迟<br />02H —读盒式磁带机87H —移动扩展内存块<br />03H —写盒式磁带机88H —读取扩展内存大小<br />0FH —格式化ESDI驱动器定期中断89H —进入保护模式<br />21H —读/写自检(POST)错误记录90H —设备等待<br />4FH —键盘截听

2010-10-08 16:23:00 1622

原创 BIOS系统服务 —— 串行口服务

4 串行口服务(Serial Port Service——INT 14H) <br />00H —初始化通信口03H —读取通信口状态<br />01H —向通信口输出字符04H —扩充初始化通信口<br />02H —从通信口读入字符<br /> <br />(1)       功能00H<br /> <br />功能描述:初始化通信口<br />入口参数:AH=00H<br />DX=初始化通信口号(0=COM1,1=COM2,……)<br />AL=初始化参数,参数的说明如下:波特率奇偶位停止位字的位

2010-10-08 16:22:00 1638

原创 BIOS系统服务 —— 直接磁盘服务

3 直接磁盘服务(Direct Disk Service——INT 13H) <br />00H —磁盘系统复位0EH —读扇区缓冲区<br />01H —读取磁盘系统状态0FH —写扇区缓冲区<br />02H —读扇区10H —读取驱动器状态<br />03H —写扇区11H —校准驱动器<br />04H —检验扇区12H —控制器RAM诊断<br />05H —格式化磁道13H —控制器驱动诊断<br />06H —格式化坏磁道14H —控制器内部诊断<br />07H —格式化驱动器15H —读取

2010-10-08 16:18:00 2084

原创 BIOS系统服务 —— 显示服务

2 显示服务(Video Service——INT 10H) <br />00H —设置显示器模式0CH —写图形象素<br />01H —设置光标形状0DH —读图形象素<br />02H —设置光标位置0EH —在Teletype模式下显示字符<br />03H —读取光标信息0FH —读取显示器模式<br />04H —读取光笔位置10H —颜色<br />05H —设置显示页11H —字体<br />06H、07H —初始化或滚屏12H —显示器的配置<br />08H —读光标处的字符及其属性13

2010-10-08 16:11:00 2010

原创 BIOS系统服务 —— 直接系统服务

<br />在系统启动后,没有加载任何操作系统。经过了上电自检以后,CPU的各寄存器被初始化成一些列的值,可以直接定位到一个逻辑地址去执行相应的指令。这个地址一般是0xfffffff0,对应的位置就是BIOS所处的ROM芯片上。而这个芯片上存放的程序都是固定的,我们可以通过编程来访问他们,就是所谓的BIOS系统服务。这个服务一般用来初始化操作系统所需要的各种环境,并在屏幕上打印一些提示或交互信息。<br /> <br />接下来,我们就对这些服务进行一下介绍:<br /> 1 直接系统服务<br />INT

2010-10-08 16:07:00 1684

原创 BIOS系统概述

<br />BIOS技术源于IBM PC/AT机器的流行以及第一台由康柏公司研制生产的“克隆”PC。在PC启动的过程中,BIOS担负着初始化硬件,检测硬件功能,以及引导操作系统的责任。<br />在早期,BIOS还提供一套运行时的服务程序给操作系统及应用程序使用。BIOS程序存放于一个断电后内容不会丢失的只读ROM中;系统过电或被重置 (reset) 时,处理器第一条指令的位址会被定位到该 BIOS 的内存中,让初始化程序开始执行。<br /> <br />英特尔公司从2000年开始,发明了可扩展固件接口(

2010-10-08 16:01:00 2365

原创 汇编语言程序设计(六)

5 简化的段定义<br />前面,我们介绍了完整的段定义格式,用完整的段定义格式虽然可以控制段的各种属性,但程序员很少会这样做。现在的汇编程序提供了一种简化的段定义方式,它使定义段更简单、方便。<br /> 5.1 存储模式定义伪指令<br />在使用简化的段定义方式之前,必须使用存储模式说明伪指令来描述源程序所采用的存储模式。该伪指令说程序所使用的存储模式,汇编程序将用该存储模式生成相应的ASSUME和GROUP语句,同时也为其它的简化段创建等价的预定义。<br /> <br />程序存储模式说明伪指令的

2010-10-08 15:55:00 1872

原创 汇编语言程序设计(五)

4 段的基本属性<br />在通常情况下,一个复杂的应用程序会由若干个模块组成,一个模块又会含有多个段。而不同模块的段之间、同一模块的段之间往往存在某种联系,这种联系就要体现在段属性的说明上。<br /> <br />段定义的一般格式如下:<br /> <br />段名 SEGMENT[对齐类型][组合类型][类别] <br />… <br />段名 ENDS <br /> <br />段属性“对齐类型”、“组合类型”和“类别”要按此顺序说明,但这些可选项可根据需要选择书写。如果源程序中不指定某个属性,那么

2010-10-08 15:52:00 1560

原创 汇编语言程序设计(四)

3 汇编程序基本结构<br />在学习高级语言程序设计时,我们知道了程序的三大主要结构:顺序结构、分支结构和循环结构。在汇编语言的源程序也同样有此三大结构,所不同的是它们的表现形式不同。用高级语言编写程序时,由于不使用“转移语句”而使这三种结构清晰明了。<br /> <br />但在汇编语言的源程序中,很难不使用“转移语句”(除非是一些只有简单功能的程序),有时甚至会有各种各样的“转移语句”。由于存在这些转移语句,就使得:汇编语言源程序的基本结构显得不太明确。如果源程序的编写者思维混乱,编写出来的源程序在结

2010-10-08 15:48:00 2762

原创 汇编语言程序设计(三)

2 程序的基本组成<br />汇编语言源程序的组成部分有:模块、段、子程序和宏等。一个模块对应一个目标文件,当开发较大型的应用程序时,该程序可能由若干个目标文件或库结合而成的。<br /> 2.1 段的定义<br />微机系统的内存是分段管理的,为了与之相对应,汇编语言源程序也分若干个段来构成。8086CPU有四个段寄存器,在该系统环境下运行的程序在某个时刻最多可访问四个段,而80386及其以后的CPU都含有六个段寄存器,于是,在这些系统环境下开发的运行程序在某个时刻最多可访问六个段。<br /> <br

2010-10-08 15:44:00 1631

原创 汇编语言程序设计(二)

1.5 结构类型伪指令<br />前面,我们介绍了汇编语言中六个最基本的数据类型,这些数据类型能满足程序设计中绝大多数情况的需要,但也存在需要更复杂的数据类型的情况。<br /> <br />下面介绍汇编语言所提供的三种复合数据类型的说明形式。<br /> <br />1、重复说明符DUP<br /> <br />从前面的内容里,我们知道了定义少量内存变量的定义形式,但如果在程序中要说明50个、100个、200个甚至更多的、同类型的内存变量时,若采用前面所学的方法,对它们一一加以说明显然是不可行的。为此,汇

2010-10-08 15:37:00 2971

原创 汇编语言程序设计(一)

<br />在前面内容的学习中,我们分别介绍了用汇编语言进行程序设计所需要的几个最基本的知识:CPU功能结构、工作模式,内存单元的寻址方式,各种汇编指令格式。在掌握了这些基本内容之后,就需要学习如何把它们组成一个完整的汇编语言程序。<br /> <br />在汇编语言程序设计中,有三类指令:指令、伪指令和宏指令。<br /> <br />指令:汇编后形成一条机器语言指令,指示CPU进行各种操作。它在程序执行时得到运行,它与机器语言指令一一对应。<br /> <br />伪指令:它只告诉汇编程序(MASM.G

2010-10-08 15:24:00 3049 2

原创 PC 存储器

<br />在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存,港台称之为记忆体)。我们这里讨论的存储器主要是内存,因为当今的计算机体系中,辅存已经被划分成了I/O设备。<br /> <br />内存又称主存,是CPU能直接寻址的存储空间,由半导体器件制成。内存的特点是存取速度快。内存是计算机的主要部件,它是相对于外存而言的。我

2010-10-08 15:08:00 5200 2

原创 80486和Pentium增强和扩充指令

<br />80486和Pentium增强和扩充指令有以下几条:<br /> <br />1.       BSWAP指令<br /> <br />功能: 字节交换<br />语法: BSWAP r32<br /> <br />反转 32 位(目标)寄存器的字节顺序:位 0 到 7 位与位 24 到 31 交换,位 8 到 15 位与位 16 到 23 交换。提供此指令是为了将低位在先、高位在后的值转换成高位在先、低位在后的格式,或者正相反。<br /> <br />要交换字值(16 位寄存器)中的字节,请

2010-10-08 14:56:00 2257

原创 Pentium系列微处理器功能结构

<br />一、主要特征<br /> <br />◆超级标量结构(双指令流水线)<br />◆双Cache(指令Cache和数据Cache分离)<br />◆分支预测技术<br />◆ 64位数据总线<br />◆ RISC和CISC的结合<br /> <br />二、内部结构<br /> <br />1. 功能模块<br /> <br />从功能模块的角度, Pentium在80486的基础上增加了一条指令流水线(包括相应的地址生成部件)和一个Cache。<br />在结构上, 与80486相比, 形成了

2010-10-08 14:24:00 2991

原创 Intel 80486微处理器功能结构

<br />1. 功能模块<br /> <br />在80386基础上, 增加:8KCache;浮点协处理器 FPU。如下图所示:<br /><br /> <br /><br />    ● 内部64位总线连接EU和FPU;<br />    ● 可以禁止分页, 所以SU输出可直接送到Cache;<br />    ● SU和PU首先寻址Cache, 不命中才寻址内存。<br /> <br />2. 内部寄存器<br /> <br />通用寄存器/段寄存器/指令指针与80386相同。 <br /> <br

2010-10-08 14:16:00 4201

原创 保护模式编程实例

<br />前面介绍了保护模式编程的重要指令,接下来需要掌握的是几个重要的保护模式编程要领。保护模式编程最重要的是切换,向保护模式切换的主要步骤是:(1)作切换到保护方式的准备;(2)切换到保护方式;(3)把指定内存区域的内容传送到位于常规内存的缓冲区中;(4)切换回实模式;(5)显示缓冲区内容。<br /> <br />本节,我们通过一个具体实例来开始接触保护模式编程,这个实例的其逻辑功能是,以十六进制数的形式显示从内存地址110000H开始的256个字节的值。本实例指定该内存区域的目的仅仅是想说明切换到

2010-10-08 14:03:00 2191 1

原创 保护模式编程

随着80386微处理器体系结构的重大变化,它的指令系统也得到了增强和补充,x86的发展进入了保护模式阶段。首先,介绍一下新增加的一些指令:一、新增高级语言指令1. PUSHA/POPA指令功能: 压入所有通用寄存器 语法: PUSHA/POPA 该指令是重点指令,用于将通用寄存器的内容压入堆栈,这些寄存器按以下顺序存储到堆栈: AX、CX、DX、BX、SP(原始值)、BP、SI 及 DI(如果操作数大小属性为 16)。POPA指令执行它的逆操作。SP 寄存器压入的值是它在

2010-10-06 23:29:00 2146

原创 Intel 80386的保护模式

<br />1. 实地址模式<br /> <br />当CPU通电或RESET时,cr0的PE位置0, 进入实地址模式。这里不在赘述。<br /> <br />2. 保护模式<br /> <br />80386提供分段和分页两种存储管理模式<br /> <br />●分段管理的特点:对存储空间的逻辑划分,优点:对模块化(结构化)程序设计方式提供了很好的支持;缺点:①段长可变不固定, 管理更复杂、②空间碎片较多、③访问字节数∕传输字节可能很小<br /> <br />●分页管理的特点:对存储空间的物理划分,优

2010-10-04 23:41:00 1796

原创 Intel 80386微处理器功能结构

<br />1. 功能模块<br /> <br />(1) BIU(总线接口部件):完成指令预取请求和执行单元的数据存取请求,数据存取请求优先于指令预取请求。<br /> <br />(2) IPU(指令预取部件):16字节指令预取队列, 提出预取请求<br /> <br />(3) IDU(指令译码部件):完成指令译码。<br /> <br />(4) SU(分段部件):完成执行单元的地址请求, 将虚地址转换为线性地址。线性地址:不允许分页(实地址模式):线性地址=物理地址;若允许分页(需地址保护模式):

2010-10-04 23:35:00 2391

原创 Intel 80286工作模式

<br />1. 实地址模式<br /> <br />系统开机CPU复位时,自动进入实地址模式,A23~A20自动置为0,以 A19~A0寻址1M的存储空间。<br /> <br />2. 虚地址保护模式<br /> <br />当机器状态字MSW的PE位置1时,进入保护模式。该模式主要针对在多任务机制中的存储管理。其有两个方面的含义:<br /> <br />虚地址——应用程序可以寻址一个比实际物理地址空间(16M)大得多的虚存空间(1024M)。<br /> <br />保护——对存储空间的(数据和程序

2010-10-04 02:16:00 3412

原创 Intel 80286微处理器功能结构

<br />1. 主要构成<br /> <br />80286主要由指令部件(IU)、执行部件(EU)、地址部件(AU)、总线部件(BU)组成,前两者相当于8086的EU,后两者相当于8086的BIU。<br /> <br />(1) AU:按EU的请求的寻址方式形成物理地址<br />    主要由段基地址寄存器、地址加法器、段容量寄存器、描述子表基地址寄存器、段限检查器五个部分组成<br /> <br />(2) BU:按AU形成的物理地址, 完成EU所请求的寻址过程和数据传送<br />    主要由

2010-10-04 02:05:00 2625

原创 Intel 8086/8088 指令系统(六)

<br />六、处理器控制指令<br /> <br />处理器控制指令是一组控制CPU工作方式的指令。这组指令的使用频率不高。<br /> <br />1、标志位操作指令:对CF、IF、DF进行操作<br /> <br />这些指令都是无操作数指令,指令中未直接给出操作数的地址,但隐含指出操作数在标志寄存器的某些标志位上,能直接操作的标志位有CF、IF、DF。<br /> <br />(1)、清除进位标志指令 (Clear carry flag) <br />CLC ;置CF=0<br /> <br />(

2010-10-04 01:58:00 1522

原创 Intel 8086/8088 指令系统(五)

<br />五、程序转移类指令<br /> <br />转移指令是汇编语言程序员经常使用的一组指令。在高级语言中,时常有“尽量不要使用转移语句”的劝告,但如果在汇编语言的程序中也尽量不用转移语句,那么该程序要么无法编写,要么没有多少功能,所以,在汇编语言中,不但要使用转移指令,而且还要灵活运用,因为指令系统中有大量的转移指令。<br /> <br />1、无条件转移指令<br /> <br />JMP指令是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一个短(short)转移(偏移量在[-1

2010-10-04 01:56:00 1855

原创 Intel 8086/8088 指令系统(四)

<br />四、串操作类指令<br /> <br />数据串是存储器中一片连续的存储单元,字符串操作指令的实质是对一片连续存储单元进行处理,这片存储单元是由隐含指针DS:SI或ES:DI来指定的。字符串操作指令可对内存单元按字节、字或双字进行处理,并能根据操作对象的字节数使变址寄存器SI(和DI)增减1、2或4。具体规定如下:<br /> <br />(1)、当DF=0时,变址寄存器SI(和DI)增加1、2或4;<br />(2)、当DF=1时,变址寄存器SI(和DI)减少1、2或4。<br /> <br

2010-10-04 01:21:00 1831

原创 Intel 8086/8088 指令系统(三)

<br />三、位操作类指令<br /> <br />包括逻辑运算指令、测试指令和移位指令<br /> <br />指令名<br />指令格式<br />指令功能<br />标志位备注<br />逻辑运算指令<br /> <br /> <br /> <br />逻辑与<br />AND DEST,SRC<br />DEST←(SRC)∩(DEST)<br />SF、ZF、PF,置CF和OF为0,AF不确定<br />逻辑或<br />OR DEST,SRC<br />DEST←(SRC)∪(DEST)<br

2010-10-04 01:17:00 8729

原创 Intel 8086/8088 指令系统(二)

<br />二、算术运算类指令<br /> <br />这类指令包括加、减、乘、除4种指令。不过注意两个操作数不能同时为存储器操作数,且目的操作数不能是立即数(不然你结果放哪儿?)。<br /> <br />指令名<br />指令格式<br />指令功能<br />标志位备注<br />加法指令<br />ADD DEST,SRC<br />DEST←(SRC)+(DEST)<br />按结果置OF、SF、ZF、AF、PF、CF<br />带进位加法<br />ADC DEST,SRC<br />DEST←

2010-10-04 01:13:00 1804

原创 Intel 8086/8088 指令系统(一)

<br />8086/8088 指令系统的指令按操作数地址个数可分为三种类型:<br />     (1)双操作数指令: OPR DEST,SRC<br />     (2)单操作数指令: OPR DEST<br />     (3)无操作数指令: OPR<br /> <br />在8086/8088 指令系统中,除串操作指令外,其余所有指令最多只能有一个操作数存放在存储器中。对于双操作数而言,两个操作数不能同时是存储器操作数。<br /> <br />8086/8088 指令系统的指令按功能可分为六大类:

2010-10-04 01:09:00 3790

原创 Intel 8086/8088系统寻址方式

<br /><br />计算机的指令集合称为指令系统。一条指令主要包括操作码和操作数。<br /> <br />操作码表示该指令要完成的操作,如传送、加、减、乘、除等。操作数字段表示操作码所需操作数的来源和操作结果的去向。<br /> <br />寻址方式是规定如何对指令中操作数字段作出解释以找到操作数的方法。8086/8088有以下几种寻址方式:<br /> <br />寄存器寻址方式、立即数寻址方式、存储器寻址方式(直接寻址方式、寄存器间接寻址方式、变址和基址寻址方式、基址变址寻址方式)、串操作寻址方式

2010-10-04 01:06:00 4687 1

原创 Intel 8086/8088 CPU 寄存器结构

<br />1. 段寄存器<br /> <br />需执行程序的各部分(指令代码、数据、堆栈)分别放在主存的指定段中。<br /> <br />段寄存器:用来存放每个段的段基值,即段基址的高16位,每个段寄存器有特定功能,不能互换。<br /> <br />当前段:由CS、DS、SS、ES指向的段,如图:<br /> <br /><br /> <br />CS ----- 代码段用来存放程序的指令代码序列,CS用来存放当前代码段首址的高16位,即段基值。<br /> <br />DS ----- 数据段用来

2010-10-04 00:58:00 3859 1

NFS文件系统

NFS文件系统是目前最为成功的网络文件系统,在文件共享领域有着出色的表现,特别是pNFS的出现,使得NFS文件系统在性能和规模上有了大幅提升,为其带了更为广阔的应用空间。同时,NFS之所以备受关注,还在于它在NAS存储领域的关键作用。本文剖析了NFSv3文件系统源代码,使开发工程师,技术支持人员,特别是存储领域从业人员对NFS有更为深刻的认识。

2012-04-08

数据结构与算法——面向对象C++设计模式

数据结构与算法的经典教材,系统全面地介绍了各种传统的数据结构,把它们按照类层次的现代理念予以展开,进而达到抽象结构与实际设计的完美统一。本书后三章通过引入抽象问题求解的概念,集中进述了算法技术和各算法之间的关系。另外,作者运用一定的数学工具及必要的分析技术和分析理论,对每种数据结构及相关算法都进行了时间和空间效率分析。本书作者在每章后面布置了习题和设计项目,并在全书的后面给出了问题参考答案,希望读者能在其中汲取宝贵的知识与经验。

2011-11-27

高性能分布式监控系统Ganglia详解

Ganglia是一个高性能分布式监控系统,用来监控集群和超级计算机。Ganglia是一个基于多点传送的监听/告知协议来监控集群的状态,它使用一个点对点树来访问集群并且可以统计其综合的信息。Ganglia可以广泛地使用像XML这样的技术来表示数据;使用XDR技术来聚合、轻化数据传送;使用RRDTool来存储和显示数据。

2011-07-10

几个比较著名的哈希算法

几个比较著名的哈希算法,还有哈希算法的概念以及如何优化哈希值的分布,在日常软件开发中十分有用

2011-07-07

疯狂内核之——内核初始化

目录 1 引子 2 1.1 上电 2 1.2 BIOS时代 3 1.3 内核引导程序 5 2 内核映像的形成 8 2.1 MakeFile预备知识 9 2.1.1 Makefile书写规则 9 2.1.2 Makefile变量 10 2.1.3 条件判断 14 2.1.4 函数 17 2.1.5 隐含规则 17 2.1.6 定义模式规则 19 2.1 KBuild体系 23 2.1.1 内核目标 24 2.1.2 主机程序 26 2.1.3 编译标志 27 2.2 内核编译分析 28 2.2.1 编译配置 29 2.2.2 寻找第一个目标 32 2.2.3 prepare和scripts目标 38 2.2.4 递归编译各对象 41 2.2.5 链接vmlinux 44 2.2.6 制作bzImage 50 3 实模式下的内核代码 57 3.1 内核映像内存布局 58 3.2 实模式汇编代码header.S 60 3.2.1 无用的bootsect代码 60 3.2.2 初始化头变量hdr 63 3.2.3 准备实模式下C语言环境 64 3.3 实模式代码main函数 69 3.3.1 复制初始化头变量 71 3.3.2 初始化堆 74 3.3.3 确保支持当前运行的CPU 75 3.3.4 设置BIOS的x86模式 76 3.3.5 内存的检测 78 3.3.6 设置键盘属性 81 3.3.7 填充系统环境配置表 82 3.3.8 填充IST信息 83 3.3.9 设置Video模式 83 3.4 实模式代码go_to_proteced_mode函数 91 3.4.1 禁止可屏蔽和不可屏蔽中断 92 3.4.2 打开A20地址线 93 3.4.3 安装临时全局描述符表 99 3.4.4 第一次启动保护模式 101 4 保护模式下的内核代码 107 4.1 32位x86保护模式代码 107 4.1.1 内核解压缩的前期工作 108 4.1.2 解压缩内核 111 4.1.3 第二次启动保护模式 121 4.1.4 第一次启动分页管理 124 4.1.5 初始化0号进程 128 4.2 向start_kernel进发 131 4.2.1 初始化中断描述符表 132 4.2.2 第三次启动保护模式 137 4.2.3 启动x86虚拟机 141 5 走向现代:start_kernel函数 144 5.1 初始化同步与互斥环境 148 5.1.1 屏蔽中断 148 5.1.2 启动大内核锁 152 5.1.3 注册时钟通知链 153 5.1.4 激活第一个CPU 155 5.1.5 初始化地址散列表 160 5.1.6 打印版本信息 161 5.2 执行setup_arch()函数 166 5.2.1 拷贝可用内存区信息 171 5.2.2 获得总页面数 175 5.2.3 着手建立永久内核页表 177 5.2.4 第二次启动分页管理 181 5.2.5 建立内存管理架构 186 5.2.6 添砖加瓦 192 5.3 设置每CPU环境 206 5.4 初始化内存管理区列表 211 5.5 利用early_res分配内存 214 5.6 触碰虚拟文件系统 223 5.7 初始化异常服务 224 5.8 初始化内存管理 230 5.8.1 启用伙伴算法 230 5.8.2 初始化slab分配器 241 5.8.3 初始化非连续内存区 250 5.9 初始化调度程序 251 5.10 初始化中断处理系统 256 5.10.1 设置APIC中断服务 256 5.10.2 初始化本地软时钟 264 5.10.3 软中断初始化 268 5.10.4 初始化定时器中断 271 5.11 走进start_kernel尾声 273 5.11.1 初始化slab的后续工作 273 5.11.2 启动console 275 5.11.3 一些简单的函数 276 5.11.4 校准CPU时钟速度 279 5.11.5 创建一些slab缓存 282 5.12 安装根文件系统 287 5.12.1 创建VFS相关slab缓存 288 5.12.2 安装rootfs 291 5.12.3 安装proc文件系统 296 6 后start_kernel时代 298 6.1 创建1号进程 298 6.2 子系统的初始化 306 6.3 启动shell环境 309

2011-05-30

疯狂内核之——Linux虚拟内存

目录 第一章 Linux底层分段分页机制 5 1.1 基于x86的Linux分段机制 5 1.2 基于x86的Linux分页机制 7 1.2.1 页全局目录和页表 8 1.2.2 线性地址到物理地址 10 1.2.3 线性地址字段处理 13 1.2.4 页表处理 15 1.3 扩展分页与联想存储器 20 1.4 Linux内存布局 21 1.5 内核空间和用户空间 23 1.5.1 初始化临时内核页表 24 1.5.2 永久内核页表的初始化 32 1.5.3 第一次进入用户空间 41 1.5.4 内核映射机制实例 44 1.6 固定映射的线性地址 48 1.7 高端内存内核映射 50 1.8.1 永久内存映射 50 1.8.2 临时内核映射 55 第二章 内核级内存管理系统 58 2.1 Linux页面管理 58 2.1.1 NUMA架构 61 2.1.2 内存管理区 62 2.2 伙伴系统算法 65 2.2.1 数据结构 66 2.2.2 块分配 67 2.2.3 块释放 69 2.3 Linux页面级内存管理 72 2.3.1 分配一组页面 73 2.3.2 释放一组页面 80 2.4 每CPU页面高速缓存 81 2.4.1 数据结构 81 2.4.2 通过每CPU 页高速缓存分配页面 82 2.4.3 释放页面到每CPU 页面高速缓存 83 2.5 slab分配器 85 2.5.1 数据结构 86 2.5.2 分配/释放slab页面 92 2.5.3 增加slab数据结构 93 2.5.4 高速缓存内存布局 94 2.5.5 slab着色 95 2.5.6 分配slab对象 96 2.5.7 释放Slab对象 100 2.5.8 通用对象 102 2.5.9 内存池 103 2.6 非连续内存区 104 2.6.1 高端内存区回顾 105 2.6.2 非连续内存区的描述符 106 2.6.3 分配非连续内存区 109 2.6.4 释放非连续内存区 113 第三章 进程的地址空间 117 3.1 用户态内存分配 117 3.1.1 mm_struct数据结构 118 3.1.2 内核线程的内存描述符 122 3.2 线性区的数据结构 123 3.2.1 线性区数据结构 123 3.2.2 红-黑树算法 126 3.2.3 线性区访问权限 128 3.3 线性区的底层处理 130 3.3.1 查找给定地址的最邻近区 131 3.3.2 查找一个与给定的地址区间相重叠的线性区 135 3.3.3 查找一个空闲的地址区间 135 3.3.4 向内存描述符链表中插入一个线性区 137 3.4 分配线性地址区间 141 3.5 释放线性地址区间 151 3.5.1 do_munmap()函数 151 3.5.2 split_vma()函数 153 3.5.3 unmap_region()函数 155 3.6 创建和删除进程的地址空间 156 3.6.1 创建进程的地址空间 156 3.6.2 删除进程的地址空间 175 3.6.3 内核线程1号的地址空间 176 3.7 堆的管理 178 第四章 磁盘文件内存映射 182 4.1 内存映射的数据结构 182 4.2 内存映射的创建 184 4.3 内存映射的请求调页 194 4.4 刷新内存映射的脏页 203 4.5 非线性内存映射 210 第五章 页面的回收 215 5.1 页框回收概念 215 5.1.1 选择目标页 216 5.1.2 PFRA设计 217 5.2 反向映射技术 218 5.2.1 匿名页的反向映射 220 5.2.2 优先搜索树 226 5.2.3 映射页的反向映射 231 5.3 PFRA实现 235 5.3.1 最近最少使用(LRU)链表 236 5.3.2 内存紧缺回收 242 5.3.3 回收磁盘高速缓存的页 267 5.3.4 周期回收 273 5.3.5 内存不足删除程序 283 第六章 交换机制 289 6.1 交换区数据结构 289 6.1.1 创建交换区 290 6.1.2 交换区描述符 291 6.1.3 换出页标识符 293 6.2 激活和禁用交换区 295 6.2.1 sys_swapon()系统调用 296 6.2.2 sys_swapoff()系统调用 304 6.2.3 try_to_unuse()函数 308 6.3 分配和释放页槽 313 6.3.1 scan_swap_map()函数 313 6.3.2 get_swap_page()函数 316 6.3.3 swap_free()函数 318 6.4 页面的换入换出 320 6.4.1 交换高速缓存 320 6.4.2 换出页 323 6.4.3 换入页 329 第七章 缺页异常处理程序 335 7.1 总体流程 335 7.2 vma以外的错误地址 341 7.3 vma内的错误地址 346 7.3.1 handle_mm_fault()函数 348 7.3.2 请求调页 352 7.3.3 写时复制 358 7.4 处理非连续内存区访问 364

2011-05-30

疯狂内核之——进程管理子系统

目录 1 进程的组织 5 1.1 进程相关数据结构 5 1.1.1 进程的基本信息 6 1.1.2 进程状态 10 1.1.3 TASK_RUNNING状态的进程链表 11 1.1.4 进程间关系 12 1.2 Linux的线程——轻量级进程 15 1.3 进程的创建——do_fork()函数详解 19 1.4 执行进程间切换 33 1.4.1 进程切换之前的工作 33 1.4.2 进程切换实务 —— switch_to宏 37 1.4.3 __switch_to函数 39 1.5 fork与vfock系统调用的区别 42 1.6 内核线程 46 1.7 挂起状态进程的组织 49 1.7.1 等待队列头 49 1.7.2 等待队列的操作 50 1.7.3 进程资源限制 55 1.8 系统调用execve() 56 1.8.1 拷贝用户态参数 57 1.8.2 重要的数据结构 61 1.8.3 search_binary_handler函数 66 1.8.4 目标文件的装载和投入运行 69 1.8.5 库函数 92 2 中断控制 94 2.1 中断的分类 94 2.2 中断的硬件环境 95 2.2.1 外部中断请求IRQ 95 2.2.2 中断描述符表 96 2.2.3 中断和异常的硬件处理 97 2.3 中断描述符表 99 2.3.1 中断门、陷阱门及系统门 99 2.3.2 IDT的初步初始化 100 2.4 异常处理 101 2.5 中断处理 106 2.5.1 中断向量 107 2.5.2 IRQ数据结构 108 2.5.3 do_IRQ()函数 113 2.5.4 中断服务例程 115 2.5.5 IRQ线的动态分配 116 2.6 下半部分 117 2.6.1 软中断 118 2.6.2 tasklet 121 2.6.3 工作队列 122 2.7定时器中断 124 2.7.1 时钟与定时器 124 2.7.2 定时器中断相关的数据结构 127 2.7.3 定时器中断的上半部分 129 3 进程调度 138 3.1 进程调度的概念 138 3.2 进程调度的数据结构和优先级 141 3.2.1 进程的优先级 141 3.2.2 数据结构 145 3.3 调度程序所使用的函数 151 3.3.1 scheduler_tick函数 151 3.3.2 try_to_wake_up函数 156 3.3.3 recalc_task_prio函数 160 3.4 schedule()函数 163 3.4.1 直接调用 163 3.4.2 延迟调用 164 3.4.3 进程切换之前所做的工作 168 3.4.4 完成进程切换时所执行的操作 171 3.4.5 进程切换后所执行的操作 173 3.5 多处理器运行队列的平衡 175 3.5.1 调度域 176 3.5.2 rebalance_tick()函数 178 3.5.3 load_balance()函数 180 3.5.4 move_tasks()函数 183 3.6 进程退出 187 3.6.1 进程终止 187 3.6.2 进程删除 189 4 进程的并发性体现 191 4.1 内核抢占 193 4.1.1 内核抢占概念 193 4.1.2 同步技术总揽 196 4.2 每CPU变量 197 4.3 原子操作 199 4.4 优化屏障和内存壁垒 203 4.4.1 优化屏障 204 4.4.2 内存壁垒 204 4.5 自旋锁 206 4.6 读写自旋锁 211 4.6.1 为读获取和释放一个锁 213 4.6.2 为写获取或释放一个锁 214 4.7 顺序锁 215 4.8 RCU机制 217 4.9 信号量 219 4.9.1 获取和释放信号量 221 4.9.2 读/写信号量 224 4.9.3 补充信号量 225 4.10 禁止本地中断 226 4.10.1 禁止本地中断 227 4.10.2 禁止下半部(可延迟函数) 229 4.11 一些避免竞争条件的实例 231 4.11.1 引用计数器 231 4.11.2 大内核锁 231 4.11.3 内存描述符读/写信号量 232 4.11.4 slab高速缓存链表的信号量 233 4.11.5 索引节点的信号量 233 4.12 内核同步与互斥的总结 233

2011-05-30

疯狂内核之——Linux预备知识.pdf

目录 1.1 体系架构 3 1.1.1 Linux体系结构 4 1.1.2 一般程序的执行 5 1.2用户态向内核态切换 7 1.2.1 Linux的堆栈切换 7 1.2.2 80x86分段的总结 12 1.2.3 Linux的指针 14 1.3 C语言基本功 14 1.3.1 Linux内核中的链表 15 1.3.2 Linux双循环链表综合实例 29 1.4 内核汇编语言规则 30 1.4.1 GNU的x86汇编语言 32 1.4.2 嵌入式汇编语言 33 1.5 必要的硬件知识 37 1.5.1 EU模块 38 1.5.2 SU模块 39 1.5.3 PU模块 43 1.5.4 高速缓存 45 1.6 __attribute__ 机制 46 1.6.1 函数属性 46 1.6.2 变量属性 51 1.6.3 类型属性 52 1.6.4 变量属性与类型属性举例 54 1.7 必要的编译知识 55

2011-05-30

基于C++语言的GoF23种设计模式

懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此。 GoF 的 23 种模式研读、总结和探索,对想成为系统架构师的各位来说,意义重大。

2011-05-29

从8086到Pentium Ⅲ微型计算机及接口技术3

内容提要:   本书以Intel处理器为核心的微型计算机为背景,全面、系统、深入地介绍了微型计算机的基本组成、工作原理和实际应用,注重吸取微机发展的最新技术和最新知识,并将其融于全书之中。   全书共分10章,分别介绍微型计算机的基本知识、从8086到PentiumⅢ循序渐进地介绍了微处理器的内部结构及特点、指令系统、汇编语言程序设计、存储器、输入输出基础、中断系统、通信与接口技术、微机总线及其接口标准和微型计算机系统板等。每章后面都有大量思考题与习题。本书可作为高等院校各个专业本、专科教材,也可作为工程技术人员的参考书。   友情提示:虽然本书并未介绍的目前最新的处理器,但书籍是永远跟不上产品的发展速度的,更何况没有掌握基础的技术是绝对谈不上学会最新技术的,因此本书是很有价值的。本资料为PDF电子版,推荐采用Adobe Reader7.0或兼容阅读器在120%的显示比例下阅读! 目录 前言 第1章 概述 1.1 微型计算机的发展概况 1.2 计算机中信息的表示 1.3 微型计算机的硬件结构和基本工作原理 1.4 微型计算机的软件系统 1.5 微型计算机系统及性能指标 思考与习题 第2章 微处理器 2.1 8086/8088微处理器 2.2 80286微处理器 2.3 80386微处理器 2.4 CISC与RISC 2.5 80486微处理器 2.6 Pentium微处理器 2.7 Pentium Pro微处理器 2.8 MMX及MMX Pentium微处理器 2.9 Pentium II和Pentium III微处理器 2.10 新一代64位微处理器Merced 思考与习题 第3章 80X86指令系统 3.1 指令格式与编码 3.2 寻址方式 3.3 8086/8088指令系统 3.4 80286增强和扩充的指令 3.5 80386增强和扩充的指令 3.6 80486和Pentium增强和扩充的指令 思考与习题 第4章 汇编语言程序设计 4.1 概述 4.2 80X86宏汇编语言的数据和表达式 4.3 80X86宏汇编语言的伪指令语句 4.4 汇编语言程序设计方法 思考与习题 第5章 微型计算机中的存储器 5.1 存储器概述 5.2 半导体存储器分类及性能指标 5.3 随机存取存储器 5.4 只读存储器 5.5 存储器的扩展 5.6 微机内存层次结构 5.7 微机系统中的其他存储部件 5.8 微型计算机系统的内存管理 思考与习题 第6章 输入输出基础 6.1 概述 6.2 输入输出控制方式 6.3 I/O接口的基本结构及特点 6.4 I/O接口的读写技术 6.5 DMA控制器 思考与习题 第7章 微型计算机的中断系统 7.1 中断的基本概念 7.2 可编程中断控制器8259A 7.3 中断调用及中断程序设计 思考与习题 第8章 微机通信与接口技术 8.1 并行通信与串行通信 8.2 可编程串行通信接口芯片16550与8250 8.3 可编程并行通信接口芯片8255 8.4 可编程定时/计数器芯片8253与8254 8.5 A/D与D/A转换接口 8.6 打印机接口 8.7 显示适配器接口 8.8 软硬盘接口 8.9 调制解调器 8.10 简单实用的双机通信 思考与习题 第9章 微机总线及其接口标准 9.1 总线概述 9.2 总线层次及信号类型 9.3 ISA总线 9.4 EISA总线 9.5 VESA总线 9.6 PCI总线 9.7 AGP 思考与习题 第10章 微型计算机系统板 10.1 系统板概述 10.2 PC/XT和286系统板 10.3 386和486系统板 10.4 Pentium和PentiumⅡ/Ⅲ系统板 10.5 系统板重要元器件及接口功能介绍 10.6 微机硬件新技术 思考与习题 参考文献

2010-09-24

Linux sysfs 文件系统机制详解

Linux sys文件系统机制是非常难懂的一个机制。文章主要介绍了一些设备驱动相关的sys文件系统,结合ldd3(linux device driver 3)中的示例代码(主要是lddbus 和sculld 文件夹),详细分析虚拟文件系统sysfs,以及如何编写基于sysfs的模块化的驱动程序。使用的内核是2.6.18。

2009-12-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除