图书介绍

操作系统原理·技术与编程【2025|PDF|Epub|mobi|kindle电子书版本百度云盘下载】

操作系统原理·技术与编程
  • 蒋静,徐志伟著 著
  • 出版社: 北京:机械工业出版社
  • ISBN:7111131606
  • 出版时间:2004
  • 标注页数:502页
  • 文件大小:107MB
  • 文件页数:519页
  • 主题词:Linux操作系统-高等学校-教材

PDF下载


点此进入-本书在线PDF格式电子书下载【推荐-云解压-方便快捷】直接下载PDF格式图书。移动端-PC端通用
种子下载[BT下载速度快]温馨提示:(请使用BT下载软件FDM进行下载)软件下载地址页直链下载[便捷但速度慢]  [在线试读本书]   [在线获取解压码]

下载说明

操作系统原理·技术与编程PDF格式电子书版下载

下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。

建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!

(文件页数 要大于 标注页数,上中下等多册电子书除外)

注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具

图书目录

第一部分 操作系统初始化2

第1章 操作系统概述2

1.1 操作系统的定义2

1.1.1 计算机系统层次结构图2

1.1.2 操作系统的定义3

1.2 操作系统发展过程中的设计需求分析4

1.2.1 没有操作系统的第一代计算机4

1.2.2 具有简单批处理操作系统的第二代计算机5

1.2.3 简单批处理操作系统功能分析6

1.2.4 多道程序设计的批处理操作系统7

1.2.5 多道程序设计的分时操作系统8

1.2.6 其他操作系统8

1.3 内核体系结构模型9

1.3.1 大型系统软件分析方法9

1.3.2 操作系统结构模型10

1.3.3 UNIX内核系统结构模型11

1.4 Linux操作系统的出现12

1.5 操作系统如何运行一个用户程序13

1.5.1 操作系统运行的全过程13

1.5.2 客户/服务器工作流程14

1.5.3 客户/服务器实例15

1.6 重要思想和理论19

1.6.1 重要思想19

1.6.2 重要理论21

1.7 小结23

1.8 练习题24

1.9 参考文献24

第2章 i386硬件与软件接口技术26

2.1 微型计算机硬件组成26

2.1.1 微型计算机基本组成26

2.1.2 微处理器分类27

2.1.3 微处理器结构的发展28

2.1.4 微型计算机总线结构28

2.2 实模式软件结构29

2.2.1 实模式下软件组织29

2.2.2 实模式主存储器地址的产生31

2.2.3 实模式输入/输出地址空间31

2.3 保护模式下存储器管理单元MMU32

2.3.1 描述符寄存器32

2.3.2 描述符34

2.3.3 虚拟地址和虚拟地址空间36

2.3.4 虚实地址转换37

2.3.5 保护模式指令集38

2.4 保护模式和保护39

2.4.1 多任务与分时系统39

2.4.2 保护环40

2.4.3 保护机制40

2.4.4 保护性检查40

2.4.5 越级访问存储器的代码段和数据段41

2.5 任务切换机制43

2.6 小结44

2.7 练习题45

2.8 参考文献45

第3章 Linux系统引导过程46

3.1 BIOS启动过程46

3.1.1 i386芯片的启动状态47

3.1.2 BIOS加载操作系统引导程序48

3.2 引导过程50

3.2.1 软盘引导过程50

3.2.2 硬盘引导过程53

3.2.3 LILO运行过程分析55

3.3 实模式下的系统初始化setup()函数56

3.3.1 setup.S代码签名检查57

3.3.2 设置参数57

3.3.3 准备进入保护模式57

3.3.4 setup.S程序流程图59

3.3.5 执行setup.S程序后内存分配图63

3.3.6 setup.S中全局描述符表分析63

3.4 内核解压缩过程startup_32()65

3.5 保护模式下的系统初始化startup_32()67

3.5.1 在startup_32中完成临时页表的初始化70

3.5.2 设置全局描述符表70

3.6 小结72

3.7 练习题72

3.8 参考文献73

第4章 启动Linux内核74

4.1 初始化系统内核74

4.1.1 初始化与体系结构相关的硬件数据结构74

4.1.2 解析内核选项80

4.2 init()函数与init进程81

4.3 init()函数执行流程82

4.3.1 继续初始化系统内核82

4.3.2 系统进程的生成84

4.3.3 init进程84

4.4 Shell命令文本的执行87

4.4.1 执行脚本文件/etc/rc.d/rc.sysinit87

4.4.2 执行脚本文件/etc/rc.d/rcN.d目录中的各个命令88

4.4.3 各终端进程的生成89

4.5 小结89

4.6 练习题91

4.7 参考文献92

第二部分 并发控制原理及其实现94

第5章 程序和进程94

5.1 并发控制94

5.1.1 多道程序设计与分时共享94

5.1.2 并发控制的硬件支持95

5.2 进程的定义和特征96

5.2.1 程序与进程96

5.2.2 从并发机制理解进程98

5.2.3 进程的特征99

5.3 线程99

5.3.1 多线程100

5.3.2 内核线程和用户线程100

5.4 操作系统控制进程的基本方法101

5.5 内核中进程的实现102

5.5.1 进程控制块PCB102

5.5.2 进程状态104

5.5.3 Linux进程控制块105

5.5.4 Linux系统0号进程的控制块107

5.5.5 Linux进程状态108

5.6 进程的组织109

5.6.1 进程链表和运行队列链表110

5.6.2 pidhash链表110

5.6.3 如何寻址当前进程的PCB111

5.7 内核创建新进程111

5.8 Linux fork的编程实现112

5.8.1 内核函数do_fork113

5.8.2 调用fork()的编程实例117

5.8.3 内核怎样运行一个新程序118

5.9 Linux exec的编程实现118

5.9.1 运行新程序的do_execve()118

5.9.2 二进制处理程序load_binary()完成的工作121

5.9.3 使用fork_exec组合的编程实例121

5.10 从程序到进程123

5.10.1 文件系统中可执行文件的一般格式124

5.10.2 shell进程执行用户程序的过程125

5.11 进程的终止126

5.12 编程实例——Linux守护进程的编程方法126

5.12.1 进程组、会话和控制终端127

5.12.2 Linux守护进程编程细则129

5.12.3 Linux守护进程实例131

5.13 小结132

5.14 练习题133

5.15 参考文献134

第6章 互斥与同步135

6.1 并发进程控制的基本原理135

6.1.1 竞争条件135

6.1.2 同步与互斥136

6.1.3 对互斥操作的要求137

6.2 竞争条件产生的原因138

6.2.1 原子操作138

6.2.2 原子操作的实例139

6.3 基于共享变量的同步操作139

6.3.1 忙等待140

6.3.2 锁变量140

6.3.3 TestAndSet与Swap指令141

6.4 信号量142

6.5 内核使用的P、V操作实例146

6.5.1 DOWN操作146

6.5.2 UP操作149

6.5.3 同步slab高速缓存的信号量151

6.5.4 同步内存描述符的信号量151

6.5.5 同步索引节点的信号量151

6.6 内核采用的其他同步技术152

6.6.1 内核是不可强占的152

6.6.2 关中断152

6.7 等待对列及其操作153

6.8 小结155

6.9 练习题156

6.10 参考文献157

第7章 死锁与饥饿158

7.1 死锁分析158

7.1.1 可剥夺资源与不可剥夺资源158

7.1.2 死锁定义159

7.1.3 死锁的条件159

7.1.4 资源分配模型图159

7.2 死锁预防160

7.3 死锁避免160

7.3.1 系统资源分配的表示方法160

7.3.2 系统拒绝启动进程161

7.3.3 系统拒绝分配资源162

7.4 死锁检测和恢复163

7.4.1 死锁检测算法163

7.4.2 死锁检测的时机164

7.4.3 从死锁中恢复164

7.5 最简单的死锁策略165

7.6 饥饿165

7.7 小结166

7.8 练习题167

7.9 参考文献168

第8章 进程调度169

8.1 进程调度的基本原理169

8.1.1 调度程序的设计目标169

8.1.2 选择合适的调度策略170

8.1.3 时间测度指标171

8.2 非强占方式调度算法172

8.2.1 先来先服务172

8.2.2 最短作业优先173

8.2.3 优先级调度174

8.3 强占式调度算法174

8.3.1 轮转法174

8.3.2 多级队列175

8.3.3 反馈调度算法175

8.4 Linux进程调度的实现176

8.4.1 在PCB中与调度有关的数据成员176

8.4.2 Linux调度策略177

8.4.3 Linux调度函数schedule()179

8.4.4 Linux调度机制183

8.5 调度程序的编程实例185

8.6 小结187

8.7 练习题188

8.8 参考文献189

第9章 中断技术190

9.1 基于IBM PC机的中断接口电路190

9.1.1 Intel 80386芯片的中断接口190

9.1.2 使用82C59芯片连结外围设备的中断接口电路191

9.2 中断和异常193

9.2.1 异常193

9.2.2 中断和异常的优先级195

9.3 中断向量表和中断描述符表196

9.3.1 中断和异常向量196

9.3.2 中断门和陷阱门的区别197

9.4 Linux中断系统的初始化过程197

9.4.1 第一次初始化中断描述符表198

9.4.2 第二次初始化中断描述符表198

9.5 异常处理200

9.5.1 异常处理过程200

9.5.2 异常处理程序201

9.5.3 内核管理硬件资源的两种异常202

9.6 中断处理202

9.6.1 硬件设备使用的中断向量202

9.6.2 中断处理使用的数据结构203

9.6.3 中断系统初始化函数init_IRQ205

9.6.4 中断处理程序的执行过程206

9.6.5 保存断点现场208

9.6.6 执行所有的中断服务例程208

9.6.7 内核模式的设备驱动程序209

9.7 下半部分210

9.7.1 Linux对下半部分的组织211

9.7.2 执行do_bottom_half()函数212

9.7.3 调度do_bottom_half()函数运行的时机213

9.8 动态安装和释放中断处理程序213

9.9 从中断和异常返回215

9.10 一个中断处理实例218

9.10.1 定时器中断的上半部219

9.10.2 定时器中断的下半部219

9.10.3 预定义的任务队列220

9.11 小结222

9.12 练习题223

9.13 参考文献224

第10章 系统调用接口225

10.1 标准C函数库和系统调用225

10.2 模式转换的硬件处理226

10.2.1 陷阱门处理的模式转换226

10.2.2 调用门处理的模式转换227

10.3 系统调用接口229

10.3.1 内核对系统调用的初始化229

10.3.2 系统调用的执行流程230

10.3.3 封装例程231

10.3.4 系统调用号与系统调用表232

10.3.5 system_call的执行过程233

10.4 lcall7的执行过程234

10.5 内核中添加新系统调用的实例235

10.6 小结238

10.7 练习题239

10.8 参考文献239

第三部分 OS资源管理及其实现242

第11章 存储器管理及Linux实现242

11.1 存储器功能需求分析242

11.1.1 重定位243

11.1.2 保护243

11.1.3 共享243

11.2 存储器的组织方式244

11.2.1 逻辑组织244

11.2.2 物理组织244

11.3 内存管理244

11.3.1 固定分区245

11.3.2 动态分区246

11.4 位图247

11.5 伙伴系统248

11.6 重定位技术250

11.6.1 存储器管理使用的地址类型250

11.6.2 固定分区使用的重定位技术250

11.6.3 分页使用的重定位技术251

11.6.4 分段使用的重定位技术252

11.7 虚拟存储器管理技术253

11.7.1 局部性原理254

11.7.2 虚拟存储器管理软件254

11.7.3 交换区256

11.8 通用存储器管理模型256

11.9 Linux在i386中的分段和分页257

11.9.1 Linux使用的分段258

11.9.2 Linux使用的分页260

11.9.3 Linux在i386平台上定义的页表项格式261

11.10 Linux内存管理262

11.10.1 描述内存页框的page数据结构263

11.10.2 基于buddy算法的内存页框管理264

11.11 基于slab算法的内存区管理266

11.11.1 slab分配器的组成267

11.11.2 slab分配器与页框级分配器的接口和实现269

11.11.3 连续内存区的分配和释放函数270

11.12 非连续内存区的分配和释放271

11.12.1 描述非连续内存区的数据结构271

11.12.2 分配和释放非连续内存区的函数272

11.13 进程的地址空间274

11.13.1 struct mm_struct和struct vm_area_struct结构274

11.13.2 进程地址空间的存取权限276

11.13.3 对线性区进行处理的底层函数277

11.13.4 进程线性地址空间的映射do_mmap()279

11.13.5 释放进程线性地址空间do_munmap()281

11.14 页面失效处理281

11.14.1 缺页异常处理程序do_page_fault()281

11.14.2 请求调页286

11.14.3 写时拷贝288

11.14.4 调用sys_brk动态增长内存288

11.15 交换289

11.15.1 描述交换空间的数据结构290

11.15.2 页面替换策略291

11.16 页换出操作292

11.16.1 页交换守护进程kswapd292

11.16.2 kswapd()的执行流程293

11.16.3 页换入do_swap_page()294

11.16.4 页换出295

11.17 对交换区数据结构进行操作的函数297

11.18 小结297

11.19 练习题299

11.20 参考文献300

第12章 文件管理及Linux实现302

12.1 磁盘的物理组织与调度302

12.1.1 磁盘结构302

12.1.2 磁盘的逻辑组织302

12.1.3 磁盘性能参数303

12.1.4 磁盘调度算法304

12.1.5 磁盘纠错305

12.2 文件管理需求分析305

12.2.1 文件管理的设计目标305

12.2.2 文件管理系统结构模型306

12.3 文件307

12.3.1 文件结构307

12.3.2 文件类型和存取方式307

12.3.3 文件属性307

12.4 目录308

12.4.1 目录结构308

12.4.2 路径名309

12.4.3 目录操作309

12.5 文件系统的组织309

12.5.1 文件组织310

12.5.2 目录表表项的格式310

12.5.3 共享文件311

12.5.4 磁盘空间管理311

12.5.5 文件系统的一致性311

12.6 文件系统的保护机制312

12.7 虚拟文件系统VFS313

12.7.1 虚拟文件系统的设计思路313

12.7.2 虚拟文件系统VFS框架314

12.8 Linux虚拟文件系统的数据结构315

12.8.1 VFS超级块数据结构315

12.8.2 VFS的目录项数据结构317

12.8.3 VFS的inode节点数据结构319

12.8.4 VFS中数据结构之间的关系321

12.9 对虚拟文件系统的管理322

12.9.1 文件系统注册链表322

12.9.2 文件系统安装注册链表323

12.9.3 根文件系统的安装323

12.10 对文件系统模块的安装和卸载325

12.10.1 安装一个文件系统sys_mount()325

12.10.2 卸载一个文件系统sys_umount()326

12.11 进程与文件系统的联系326

12.11.1 文件对象327

12.11.2 用户打开文件表328

12.11.3 根目录和当前工作目录329

12.12 文件加锁331

12.13 磁盘数据的内存高速缓冲区332

12.13.1 缓冲区高速缓存的数据结构333

12.13.2 buffer cache的组织335

12.13.3 对buffer cache的基本操作337

12.13.4 把脏缓冲区写入磁盘338

12.14 EXT2文件系统339

12.14.1 EXT2对物理磁盘的组织340

12.14.2 EXT2减少碎片的方案340

12.14.3 EXT2对磁盘块的分配原则341

12.15 EXT2磁盘重要数据结构341

12.15.1 EXT2的目录项数据结构342

12.15.2 EXT2的磁盘i节点结构343

12.15.3 EXT2磁盘上的超级块346

12.15.4 EXT2的组描述符347

12.15.5 EXT2的块位图和索引节点位图347

12.15.6 EXT2存放文件的数据块348

12.16 EXT2的内核组织348

12.16.1 EXT2的内存超级块348

12.16.2 EXT2的内存i节点350

12.16.3 磁盘i节点读入高速缓存的过程350

12.17 如何通过路径名找到索引节点352

12.18 EXT3文件系统354

12.18.1 关于日志式文件系统354

12.18.2 EXT2文件系统的不足354

12.18.3 日志文件系统的工作原理355

12.18.4 EXT3日志文件系统的具体实现356

12.18.5 EXT3文件系统的额外开销357

12.19 小结357

12.20 练习题358

12.21 参考文献359

第13章 I/O设备管理与设备驱动程序360

13.1 I/O系统的基本组成360

13.1.1 I/O设备的分类360

13.1.2 内核对设备的分类360

13.1.3 I/O接口功能361

13.1.4 CPU与1/O设备交互的控制方式362

13.2 I/O系统管理软件的设计原理363

13.3 用户程序364

13.4 逻辑1/O管理364

13.4.1 设备命名方法364

13.4.2 访问设备的权限和设备保护366

13.4.3 为设备分配和释放缓冲区366

13.5 设备驱动程序和中断控制层367

13.6 设备驱动程序的组织实例368

13.6.1 设备驱动程序的工作原理369

13.6.2 逻辑I/O与设备驱动程序接口370

13.6.3 系统调用与驱动程序接口373

13.6.4 安装中断处理程序374

13.7 设备驱动程序模块374

13.7.1 静态链接的设备驱动程序模块375

13.7.2 可动态加载和卸载的设备驱动程序模块375

13.7.3 用户空间的设备驱动程序376

13.8 了解系统基本配置376

13.8.1 I/O端口377

13.8.2 内核中驱动程序清单377

13.8.3 内核的中断报告显示378

13.9 设备驱动程序中使用的内核函数378

13.9.1 操作I/O端口的函数379

13.9.2 分配和释放内存的函数379

13.9.3 访问设备卡上内存的函数380

13.9.4 同步和计时要使用的内核函数380

13.9.5 中断管理内核函数381

13.9.6 注册和注销设备的内核函数383

13.9.7 其他内核函数383

13.10 编制设备驱动程序的基本方法383

13.10.1 设备驱动程序与内核383

13.10.2 驱动程序与硬件388

13.10.3 驱动程序与引导388

13.11 内核级设备驱动程序编程实例389

13.11.1 编程用到的硬件389

13.11.2 上半部与下半部各自的功能390

13.11.3 内核驱动程序的上半部编程391

13.11.4 内核驱动程序的下半部编程395

13.11.5 模块的安装与卸载398

13.11.6 访问设备驱动程序的用户程序399

13.11.7 编译设备驱动程序400

13.11.8 使用内核设备驱动程序模块401

13.12 小结401

13.13 练习题402

13.14 参考文献403

第四部分 IPC和网络编程接口406

第14章 最早的IPC方法:信号与管道406

14.1 进程间通信的设计目标406

14.2 信号机制406

14.2.1 什么是信号407

14.2.2 信号的产生与处理407

14.3 发送信号409

14.3.1 信号操作用到的数据结构410

14.3.2 数据结构sigset_t上的一组简单操作函数411

14.3.3 传送信号412

14.4 接收信号414

14.4.1 分析do_signal()函数415

14.4.2 忽略信号415

14.4.3 执行一个默认操作416

14.4.4 捕获一个信号416

14.4.5 执行信号处理程序418

14.4.6 终止信号处理程序418

14.4.7 被中断的系统调用获得重新执行418

14.5 捕获一个信号的编程实例418

14.6 管道420

14.6.1 struct pipe_inode_info数据结构421

14.6.2 do_pipe()——创建一个管道421

14.6.3 读管道422

14.6.4 写管道423

14.6.5 撤销管道424

14.7 无名管道的编程实例424

14.8 有名管道FIFO425

14.8.1 创建一个FIFO425

14.8.2 打开FIFO425

14.8.3 读写FIFO426

14.9 编写有名管道的实用程序426

14.10 小结427

14.11 练习题428

14.12 参考文献428

第15章 System V进程间通信429

15.1 与IPC相关的系统调用429

15.1.1 创建IPC资源的系统调用429

15.1.2 控制IPC资源的系统调用429

15.1.3 操作IPC资源的系统调用430

15.1.4 IPC系统调用在i386体系结构中的实现430

15.2 IPC资源中的公共元素及属性430

15.3 IPC信号量432

15.3.1 与信号量操作相关的数据结构432

15.3.2 sys_semop()函数的功能435

15.3.3 sys_semctl()函数的功能436

15.4 IPC信号量的编程示例436

15.5 信号量小结438

15.6 IPC消息队列438

15.6.1 与消息队列操作相关的数据结构439

15.6.2 发送一个消息440

15.6.3 接收消息和释放消息队列441

15.7 IPC消息队列的编程示例442

15.8 消息队列小结443

15.9 共享内存443

15.9.1 IPC共享内存的数据结构443

15.9.2 连接IPC共享内存445

15.9.3 IPC共享内存请求调页的过程446

15.9.4 剥离和释放IPC共享内存段446

15.10 IPC共享内存编程示例447

15.11 小结451

15.12 练习题451

15.13 参考文献452

第16章 Linux网络接口及内核实现453

16.1 Linux网络系统分层结构453

16.1.1 OSI模型和网际协议族453

16.1.2 Linux网络协议族分层结构454

16.2 TCP和UDP455

16.2.1 传输控制协议——TCP455

16.2.2 用户数据报协议——UDP456

16.3 内核中与发送/接收相关的数据结构456

16.3.1 套接口地址结构456

16.3.2 数据包结构457

16.3.3 建立网络连接的数据结构461

16.3.4 协议操作函数使用的数据结构464

16.4 网络连接的建立和关闭465

16.4.1 网络连接的建立466

16.4.2 关闭网络连接470

16.5 发送数据471

16.5.1 发送数据的系统调用接口472

16.5.2 从INET协议层到IP层473

16.5.3 IP层到硬件层的数据发送过程474

16.5.4 硬件层的数据发送过程475

16.6 接收数据476

16.6.1 接收数据的系统调用接口476

16.6.2 硬件层接收数据分析477

16.6.3 从IP层接收数据478

16.6.4 从INET层接收数据479

16.7 小结480

16.8 练习题481

16.9 参考文献481

第17章 TCP套接口编程的基本方法482

17.1 套接口函数482

17.1.1 socket()函数482

17.1.2 其他套接口函数483

17.2 TCP连接的建立和终止过程485

17.2.1 建立TCP连接的过程485

17.2.2 终止TCP连接的过程486

17.3 编制TCP客户程序487

17.3.1 TCP客户程序设计方法487

17.3.2 TCP客户程序的实现487

17.4 编制TCP服务器程序489

17.4.1 一个简单TCP服务器的编程方法489

17.4.2 一个简单TCP服务器的实现489

17.4.3 TCP并发服务器的实现491

17.5 小结493

17.6 练习题493

17.7 参考文献493

第18章 UDP套接口编程的基本方法494

18.1 UDP程序使用的套接口函数494

18.2 发送UDP数据报的编程实例495

18.3 接收UDP数据报的编程实例496

18.4 小结498

18.5 练习题498

18.6 参考文献499

附录 Linux源代码目录结构与内容500

热门推荐