计算机科学丛书:操作系统设计:Xinu方法 [Operating System Design]

计算机科学丛书:操作系统设计:Xinu方法 [Operating System Design] pdf epub mobi txt 电子书 下载 2025

[美] Douglas Comer 著,邹恒明,周亮,曹浩 等 译
图书标签:
  • 操作系统
  • Xinu
  • 计算机科学
  • 教学
  • 设计
  • 原理
  • UNIX
  • 内核
  • 实验
  • 源码
想要找书就要到 静流书站
立刻按 ctrl+D收藏本页
你会得到大惊喜!!
出版社: 机械工业出版社
ISBN:9787111428268
版次:1
商品编码:11354659
品牌:机工出版
包装:平装
丛书名: 计算机科学丛书
外文名称:Operating System Design
开本:16开
出版时间:2013-12-01
用纸:胶版纸
页数:368
正文语种:中文

具体描述

内容简介

  《计算机科学丛书:操作系统设计:Xinu方法》对操作系统的内存管理、进程管理、进程协调和同步、进程间通信、实时时钟管理、设备无关的I/O、设备驱动、网络协议、文件系统等进行了详细的介绍,并利用分层的设计范式,以一种有序、易于理解的方式来阐述这些内容。《计算机科学丛书:操作系统设计:Xinu方法》以Xinu操作系统为系统设计的样板和模式,从一个裸机开始,一步一步地设计和实现一个小型但优雅的操作系统。本书的样本代码可以运行在Linksys E2100L无线路由器上。
  《计算机科学丛书:操作系统设计:Xinu方法》适用于高年级的本科生或低年级的研究生,也适用于那些想了解操作系统的计算机从业人员。学习本书前,学生需要具备基本的程序设计能力,应当理解基本的数据结构,包括链表、栈和队列,并且应当用C语言写过程序。

作者简介

  Douglas Comer,美国普度大学计算机系杰出教授,国际公认的计算机网络、TCP/IP协议、Internet和操作系统设计方面的专家。Comer出版了多部优秀的教材和专著,被翻译成16种语言,并广泛用于世界各地的工业界和学术界。Comer教授划时代的三卷巨著《Internetworking with TCP/IP》对网络和网络教育产生了革命性的影响。Comer博士是ACM院士、普度教育学院院士。

目录

出版者的话
译者序
前言
关于作者

第1章 引言和概述
1.1 操作系统
1.2 本书的研究方法
1.3 分层设计
1.4 Xinu操作系统
1.5 操作系统不是什么
1.6 从外面看操作系统
1.7 其他章节概要
1.8 观点
1.9 总结
练习

第2章 并发执行与操作系统服务
2.1 引言
2.2 多活动的编程模型
2.3 操作系统服务
2.4 并发处理的概念和术语
2.5 串行程序和并发程序的区别
2.6 多进程共享同一段代码
2.7 进程退出与进程终止
2.8 共享内存、竞争条件和同步
2.9 信号量与互斥
2.10 Xinu中的类型命名方法
2.11 使用Kputc和Kprintf进行操作系统的调试
2.12 观点
2.13 总结
练习

第3章 硬件和运行时环境概览
3.1 引言
3.2 E2100L的物理和逻辑结构
3.3 处理器结构和寄存器
3.4 总线操作:获取-存储范式
3.5 直接内存访问
3.6 总线地址空间
3.7 内核段KSEG0和KSEG1的内容
3.8 总线启动的静态配置
3.9 调用约定和运行时栈
3.10 中断和中断处理
3.11 异常处理
3.12 计时器硬件
3.13 串行通信
3.14 轮询与中断驱动I/O
3.15 内存缓存和KSEG
3.16 存储布局
3.17 内存保护
3.18 观点
练习

第4章 链表与队列操作
4.1 引言
4.2 用于进程链表的统一数据结构
4.3 简洁的链表数据结构
4.4 队列数据结构的实现
4.5 内联队列操作函数
4.6 获取链表中进程的基础函数
4.7 FIFO队列操作
4.8 优先级队列的操作
4.9 链表初始化
4.10 观点
4.11 总结
练习

第5章 调度和上下文切换
5.1 引言
5.2 进程表
5.3 进程状态
5.4 就绪和当前状态
5.5 调度策略
5.6 调度的实现
5.7 上下文切换的实现
5.8 内存中保存的状态
5.9 在MIPS处理器上切换上下文
5.10 重新启动进程执行的地址
5.11 并发执行和null进程
5.12 使进程准备执行和调度不变式
5.13 推迟重新调度
5.14 其他进程调度算法
5.15 观点
5.16 总结
练习

第6章 更多进程管理
6.1 引言
6.2 进程挂起和恢复
6.3 自我挂起和信息隐藏
6.4 系统调用的概念
6.5 禁止中断和恢复中断
6.6 系统调用模板
6.7 系统调用返回SYSERR和OK值
6.8 挂起的实现
6.9 挂起当前进程
6.10 suspend函数的返回值
6.11 进程终止和进程退出
6.12 进程创建
6.13 其他进程管理函数
6.14 总结
练习

第7章 协调并发进程
7.1 引言
7.2 进程同步的必要性
7.3 计数信号量的概念
7.4 避免忙等待
7.5 信号量策略和进程选择
7.6 等待状态
7.7 信号量数据结构
7.8 系统调用wait
7.9 系统调用signal
7.10 静态和动态信号量分配
7.11 动态信号量的实现示例
7.12 信号量删除
7.13 信号量重置
7.14 多核处理器之间的协调
7.15 观点
7.16 总结
练习

第8章 消息传递
8.1 引言
8.2 两种类型的消息传递服务
8.3 消息使用资源的限制
8.4 消息传递函数和状态转换
8.5 send的实现
8.6 receive的实现
8.7 非阻塞消息接收的实现
8.8 观点
8.9 总结
练习

第9章 基本内存管理
9.1 引言
9.2 内存的类型
9.3 重量级进程的定义
9.4 小型嵌入式系统的内存管理
9.5 程序段和内存区域
9.6 嵌入式系统中的动态内存分配
9.7 低层内存管理器的设计
9.8 分配策略和内存持久性
9.9 追踪空闲内存
9.10 低层内存管理的实现
9.11 分配堆存储
9.12 分配栈存储
9.13 释放堆和栈存储
9.14 观点
9.15 总结
练习

第10章 高级内存管理和虚拟内存
10.1 引言
10.2 分区空间分配
10.3 缓冲池
10.4 分配缓冲区
10.5 将缓冲区返回给缓冲池
10.6 创建缓冲池
10.7 初始化缓冲池表
10.8 虚拟内存和内存复用
10.9 实地址空间和虚地址空间
10.10 支持按需换页的硬件
10.11 使用页表的地址翻译
10.12 页表项中的元数据
10.13 按需换页以及设计上的问题
10.14 页面替换和全局时钟算法
10.15 观点
10.16 总结
练习

第11章 高层消息传递
11.1 引言
11.2 进程间通信端口
11.3 端口实现
11.4 端口表初始化
11.5 端口创建
11.6 向端口发送消息
11.7 从端口接收消息
11.8 端口的删除和重置
11.9 观点
11.10 总结
练习

第12章 中断处理
12.1 引言
12.2 中断的优点
12.3 中断分配
12.4 中断向量
12.5 中断向量号的分配
12.6 硬件中断
12.7 中断请求的局限性和中断多路复用
12.8 中断软件和分配
12.9 中断分配器底层部分
12.10 中断分配器高层部分
12.11 禁止中断
12.12 函数中中断代码引起的限制
12.13 中断过程中重新调度的必要性
12.14 中断过程中的重新调度
12.15 观点
12.16 总结
练习

第13章 实时时钟管理
13.1 引言
13.2 定时事件
13.3 实时时钟和计时器硬件
13.4 处理实时时钟中断
13.5 延时与抢占
13.6 使用计时器来模拟实时时钟
13.7 抢占的实现
13.8 使用增量链表对延迟进行有效管理
13.9 增量链表的实现
13.10 将进程转入睡眠
13.11 定时消息接收
13.12 唤醒睡眠进程
13.13 时钟中断处理
13.14 时钟初始化
13.15 间隔计时器管理
13.16 观点
13.17 总结
练习

第14章 设备无关的I/O
14.1 引言
14.2 I/O和设备驱动的概念结构
14.3 接口抽象和驱动抽象
14.4 I/O接口的一个示例
14.5 打开-读-写-关闭范式
14.6 绑定I/O操作和设备名
14.7 Xinu中的设备名
14.8 设备转换表概念
14.9 设备和共享驱动的多个副本
14.10 高层I/O操作的实现
14.11 其他高层I/O函数
14.12 打开、关闭和引用计数
14.13 devtab中的空条目和错误条目
14.14 I/O系统的初始化
14.15 观点
14.16 总结
练习

第15章 设备驱动示例
15.1 引言
15.2 tty抽象
15.3 tty设备驱动的组成
15.4 请求队列和缓冲区
15.5 上半部和下半部的同步
15.6 硬件缓冲区和驱动设计
15.7 tty控制块和数据声明
15.8 次设备号
15.9 上半部tty字符输入(ttyGetc)
15.10 通用上半部tty输入(ttyRead)
15.11 上半部tty字符输出(ttyPutc)
15.12 开始输出(ttyKickOut)
15.13 上半部tty多字符输出(ttyWrite)
15.14 下半部tty驱动函数(ttyInterrupt)
15.15 输出中断处理(ttyInter_out)
15.16 tty输入处理(tty Inter-in)
15.17 tty控制块初始化(ttyInit)
15.18 设备驱动控制
15.19 观点
15.20 总结
练习

第16章 DMA设备和驱动(以太网)
16.1 引言
16.2 直接内存访问和缓冲区
16.3 多缓冲区和环
16.4 使用DMA的以太网驱动例子
16.5 设备的硬件定义和常量
16.6 环和内存缓冲区
16.7 以太网控制块的定义
16.8 设备和驱动初始化
16.9 分配输入缓冲区
16.10 从以太网设备中读取数据包
16.11 向以太网设备中写入数据包
16.12 以太网设备的中断处理
16.13 以太网控制函数
16.14 观点
16.15 总结
练习

第17章 最小互联网协议栈
17.1 引言
17.2 所需的功能
17.3 同步对话、超时和进程
17.4 ARP函数
17.5 网络数据包的定义
17.6 网络输入进程
17.7 UDP表的定义
17.8 UDP函数
17.9 互联网控制报文协议
17.10 动态主机配置协议
17.11 观点
17.12 总结
练习

第18章 远程磁盘驱动
18.1 引言
18.2 磁盘抽象
18.3 磁盘操作驱动支持
18.4 块传输和高层I/O函数
18.5 远程磁盘范式
18.6 磁盘操作的语义
18.7 驱动数据结构的定义
18.8 驱动初始化(rdsInit)
18.9 上半部打开函数(rdsOpen)
18.10 远程通信函数(rdscomm)
18.11 上半部写函数(rdsWrite)
18.12 上半部读函数(rdsRead)
18.13 刷新挂起的请求
18.14 上半部控制函数(rdsControl)
18.15 分配磁盘缓冲区(rdsbufalloc)
18.16 上半部关闭函数(rdsClose)
18.17 下半部通信进程(rdsprocess)
18.18 观点
18.19 总结
练习

第19章 文件系统
19.1 文件系统是什么
19.2 文件操作的示例集合
19.3 本地文件系统的设计
19.4 Xinu文件系统的数据结构
19.5 索引管理器的实现
19.6 清空索引块(lfibclear)
19.7 获取索引块(lfibget)
19.8 存储索引块(lfibput)
19.9 从空闲链表中分配索引块(lfiballoc)
19.10 从空闲链表中分配数据块(lfdballoc)
19.11 使用设备无关的I/O函数的文件操作
19.12 文件系统的设备设置和函数名称
19.13 本地文件系统打开函数(lfsOpen)
19.14 关闭文件伪设备(lflClose)
19.15 刷新磁盘中的数据(lfflush)
19.16 文件的批量传输函数(lflWrite,lflRead)
19.17 在文件中查找一个新位置(lflSeek)
19.18 从文件中提取一个字节(lflGetc)
19.19 改变文件中的一个字节(lflPutc)
19.20 载入索引块和数据块(lfsetup)
19.21 主文件系统设备的初始化(lfsInit)
19.22 伪设备的初始化(lflInit)
19.23 文件截断(lftruncate)
19.24 初始文件系统的创建(lfscreate)
19.25 观点
19.26 总结
练习

第20章 远程文件机制
20.1 引言
20.2 远程文件访问
20.3 远程文件语义
20.4 远程文件设计和消息
20.5 远程文件服务器通信
20.6 发送一个基本消息
20.7 网络字节序
20.8 使用设备范式的远程文件系统
20.9 打开远程文件
20.10 检查文件模式
20.11 关闭远程文件
20.12 读远程文件
20.13 写远程文件
20.14 远程文件的定位
20.15 远程文件单字符I/O
20.16 远程文件系统控制函数
20.17 初始化远程文件数据结构
20.18 观点
20.19 总结
练习

第21章 句法名字空间
21.1 引言
21.2 透明与名字空间的抽象
21.3 多种命名方案
21.4 命名系统设计的其他方案
21.5 基于句法的名字空间
21.6 模式和替换
21.7 前缀模式
21.8 名字空间的实现
21.9 名字空间的数据结构和常量
21.10 增加名字空间前缀表的映射
21.11 使用前缀表进行名字映射
21.12 打开命名文件
21.13 名字空间初始化
21.14 对前缀表中的项进行排序
21.15 选择一个逻辑名字空间
21.16 默认层次和空前缀
21.17 额外的对象操作函数
21.18 名字空间方法的优点和限制
21.19 广义模式
21.20 观点
21.21 总结
练习

第22章 系统初始化
22.1 引言
22.2 引导程序:从头开始
22.3 操作系统初始化
22.4 在E2100L上启动一个可选的映像
22.5 Xinu初始化
22.6 系统启动
22.7 从程序转化为进程
22.8 观点
22.9 总结
练习

第23章 异常处理
23.1 引言
23.2 异常、陷阱和恶意中断
23.3 panic的实现
23.4 观点
23.5 总结
练习

第24章 系统配置
24.1 引言
24.2 多重配置的需求
24.3 Xinu系统配置
24.4 Xinu配置文件的内容
24.5 计算次设备号
24.6 配置Xinu系统的步骤
24.7 观点
24.8 总结
练习

第25章 一个用户接口例子:Xinu壳
25.1 引言
25.2 用户接口
25.3 命令和设计原则
25.4 一个简化壳的设计决策
25.5 壳的组织和操作
25.6 词法符号的定义
25.7 命令行语法的定义
25.8 Xinu壳的实现
25.9 符号的存储
25.10 词法分析器代码
25.11 命令解释器的核心
25.12 命令名查询和内部处理
25.13 传给命令的参数
25.14 向外部命令传递参数
25.15 I/O重定向
25.16 示例命令函数(sleep)
25.17 观点
25.18 总结

练习
附录1 操作系统移植
附录2 Xinu设计注解
索引

精彩书摘

  第1章 引言和概述 ·
  ·第1章 引言和概述
  第1章
  Operating System Design:The Xinu Approach,Linksys Version
  引言和概述
  第1章 引言和概述
  我们的小小系统也有风光的时刻。
  ——Alfred,Lord Tennyson
  1.1 操作系统
  每一个智能设备和计算机系统中都隐藏着这么一类软件,它们控制着处理信息、管理资源以及与显示屏、网络、磁盘和打印机等设备通信的工作。总的来说,这些进行控制和协调工作的代码通常叫做执行器、监视器、任务管理器,或者内核,而我们将使用一个更宽泛的术语操作系统。
  计算机操作系统是人类创造的最复杂的物体之一:计算机操作系统允许多个计算进程和用户同时共享一个CPU,保护数据免受未经授权的访问,并保持独立输入/输出(I/O)设备的正确运行。操作系统提供的高级服务都是通过向复杂的硬件发送一系列详细的命令实现的。有趣的是,操作系统并不是从外部控制电脑的独立机制——它还包括一些软件,这些软件由执行应用程序的同一处理器执行。事实上,当处理器运行应用程序的时候,处理器是不能执行操作系统的,反之亦然。
  保证操作系统总在应用程序运行结束后重新夺回控制权的安排机制使得操作系统的设计变得非常复杂。操作系统最令人印象深刻的方面来自于服务和硬件之间的不同:操作系统在低级的硬件上提供高级服务。随着本书内容的推进,读者就会理解系统软件处理像串行接口这样简单的设备需要做的事情。而其中的哲学原理很简单:操作系统应该提供让编程更加容易的抽象,而不是反映底层硬1件设备的抽象。因此,我们得出结论:
  设计操作系统时,应该隐藏底层的硬件细节,并创建一个为应用程序提供高级服务的抽象机器。
  操作系统的设计并不是人们所熟知的工艺。最初,由于计算机的缺乏和价格的昂贵,只有少数程序员有从事操作系统相关工作的机会。而现在,由于先进的微电子技术降低了制造成本使得微处理器不再昂贵,操作系统便成为一种商品,与此同时也只有少数程序员从事操作系统方面的工作。有趣的是,由于微处理器变得非常便宜,大多数电子设备都是从可编程处理器构建得到,而不是从离散的逻辑构建得到。因此,设计与实现微机和微控制器的软件系统不再是专家的专利,它已成为一个称职的系统程序员必须能胜任的技术。
  幸运的是,随着生产新机器的技术的发展,我们对于操作系统的理解也在不断提高。研究人员已经找出了根本问题,制定了设计原则,定义了基本的组件,并设计了组件一起工作的机制。更重要的是,研究人员还定义了一系列的抽象,如文件和当前进程(这些抽象对于所有的操作系统都是相同的),并且已经找到了实现这些抽象的有效方式。最后,我们知道了如何将操作系统的不同组件组织成一个有意义的系统设计与实现。
  同早期系统相比,现代操作系统是简洁的、可移植的。设计良好的系统都遵循着将软件分割成一系列基本组件的基本设计模式。因此,现代系统就变得更容易理解和修改,相比早期的系统其处理开销也比较小。
  供应商出售的大型商业操作系统通常包括很多额外的软件组件。例如,一个典型的操作系统软件发行版包括编译器、连接器、装载程序、库函数和一系列的应用程序。为了区分这些额外的软件和一个基本的操作系统,我们有时会用内核指代常驻在内存中并且提供诸如并发进程支持等关键性服务的代码。在本书中,操作系统这个术语指的就是内核,而不包括其他附加的功能。一个最小化内核功能的设计有时称为微内核设计。我们的讨论就将集中在微内核上。
  1.2 本书的研究方法
  本书讲解了如何构建、设计并且实现操作系统的内核。书中使用了工程学方法,而不是仅仅罗列操作系统的特性和抽象地对其进行描述。这种方法向我们展示了每一个抽象是如何建立的,以及如何将这些抽象组织成一个优雅、高效的设计。
  这种工程学方法有两个优势。第一,因为本书的内容涵盖操作系统的每一部分,所以读者会看到整个系统如何融合在一起,而不仅仅是一两个部分之间如何交互。第二,由于读者可以得到书中描述的所有部分的源代码,所以任何部分的实现都没有什么神秘的地方——读者可以获得一份系统的副本来检查、修改、工具化、测量、扩展或者将其移植到其他架构。在本书的最后,读者会看到操作系统的每个部分是如何满足设计需求的,以帮助读者理解可选的设计方案。
  本书的关注点是实现,这意味着代码是本书的一个重要组成部分。事实上,代码是讨论的核心,必须通过阅读和学习所罗列的程序来欣赏其中的微妙之处和工程中的细节。例子代码都非常精简,这意味着读者可以集中精力在概念的理解上而不需要费力地阅读许多页的代码。但某些练习建议的改进或修改需要读者深入细节或者找到其他方案。熟练的程序员会找到更多方法来改进和扩展我们的系统。
  ……

前言/序言

  建造计算机操作系统有点像编织锦缎。这两种工作的最终成品都是一个和谐一致、大型、复杂的人造系统。在每一种情况下,最后的人造成品都是由细微但却精巧的步骤所构造。在编织锦缎时,细节是至关重要的,因为一点点不协调的瑕疵都很容易观察到。就像锦缎里的缎面一样,加入到操作系统里的每个新组件都需要与整体的设计相协调。从这个角度看,将不同片段组装起来的机械加工只是整个建造过程中的一小部分,一个大师级的产品必须以某个模式为蓝本,所有参与系统设计的工作人员都必须遵守这种模式。
  有讽刺意味的是,现有的操作系统教材或课程很少对底层的模式和原理进行解释,而这些模式和原理正是操作系统构造的基础。在学生看来:操作系统似乎是一个暗箱,而现有的教材则加强了这种误解,因为这些教材所解释的不过是操作系统的功能,其关注的也只是操作系统各种能力的使用。更为重要的是,学生在学习操作系统时采取的是从操作系统外面来察看的方式,从而常常导致这样一种感觉:认为操作系统由一组抽象的界面所组成,这些界面下的功能由一大堆晦涩神秘的代码连接在一起,而这些神秘的代码本身还包含着许多与机器硬件直接相关的、无规律可寻的奇技巧术。
  令人惊奇的是,学生一旦从大学毕业,就马上觉得与操作系统有关的工作已经结束,自己不再需要理解或学习操作系统,因为由商业公司和开源社区所构造的现有操作系统足以应付各种需要,没有自己什么事情了。但没有什么比这种想法离真理更远了。有讽刺意味的是,尽管为个人计算机设计传统操作系统的公司数量比以前更少了,但社会和行业对操作系统技能的需求却在增长,许多公司雇佣大学生来从事操作系统方面的工作。社会上这些对操作系统技能的需求来源于更便宜的微处理器,这些便宜的微处理器嵌入在智能手机、视频游戏、iPod、Internet路由器、线缆和机顶盒以及打印机中。
  在与嵌入式系统打交道时,有关原理和结构的知识非常关键,因为程序员可能需要在现有的操作系统内部构造某种或某个新的机制,或者对现有操作系统进行修改以便可以在新的硬件平台上运行。而且,为嵌入式设备编写应用程序时需要理解下层的操作系统。如果不理解操作系统设计的各种细微之处,则不可能充分利用这些小型嵌入式处理器的能力。
  本书的目的是揭开操作系统设计中的神秘感,将方方面面的材料整合为一个系统化的整体。本书对操作系统的主要系统组件进行了详细阐述,并以一种层次架构的设计范式来组织这些组件,从而以一种有序、可理解的方式来展开这些内容。与其他评述性书籍不同的是,本书并不尽可能多地提供不同方案,呈现给读者的将是一个基于传统过程的、使用实际的、直截了当的原语所构造的操作系统。本书从一个裸机开始,一步一步地设计和实现一个小型但优雅的操作系统。这个称为Xinu的操作系统将成为系统设计的样板和模式。
  虽然Xinu操作系统的规模较小,可以完全容纳在本书中,但该系统却包括了构成一个普通操作系统的全部组件:内存管理、进程管理、进程协调和同步、进程间通信、实时时钟管理、设备独立的输入输出、设备驱动、网络协议和一个文件系统。本书将这些组件组织成一个层次架构,使它们之间的相互连接清晰可见、设计过程浅显易懂。尽管规模小,但Xinu却拥有大型系统的能力。此外,Xinu并不是一个玩具系统,它在很多商业产品中得到了应用。使用该系统的厂商包括Mitsubishi、Lexmark、HP、IBM、Woodward(woodward.com)、Barnard Software和Mantissa公司。学生通过本书可以学到的重要一课是:不管是小型嵌入式系统还是大型系统,好的系统设计都一样重要,一个系统的大部分能力都来自于良好的抽象。
  本书所覆盖的所有议题都以一种特定的次序排列,这种次序就是设计人员在构建操作系统时所遵守的工作次序。本书每一章描述设计架构里的一个组件,并提供示例软件来演示由该层架构所提供的功能。使用这种方式具有如下几种优点:第一,每一章所解释的操作系统的功能子集均比上一章所讨论的功能子集更大,这种安排使我们在考虑一层特定架构的设计和实现时不用关心后续层面的实现。第二,每一章的细节描述在第一次阅读时可以跳过去,读者只需要理解该层所提供的服务即可,而不是这些服务是如何实现的。第三,如果按次序阅读本书,读者可以先理解一个功能,然后在后面看到该功能是如何被后续部分所使用的。第四,有智力挑战的议题(如对并发的支持)出现在书的较前面,高层次的操作系统服务则出现在后面。在本书中,读者将看到大部分核心的功能仅仅只用几行代码就可以完成,这样我们就可以将大部分的代码(网络和文件系统)放到书的较后面,在读者已经做出了充分的思想准备后再进行讲解。
  如前所述,与其他关于操作系统的许多书不一样的是,本书并不试图对每个系统组件的每种实现方案进行评估,也不对现有的商业系统进行综述。而是选择对一组使用最广泛的操作系统原语的实现细节进行阐述。例如,在讨论进程协调的一章,我们解释的是信号量(使用最广泛的进程协调原语)原语,而对其他原语(如监视器)的讨论则放到练习里。我们的目的是展示如何将原语在传统的硬件上实现,消除神秘。学生一旦理解了一组特定原语的魔力,其他原语的实现也就容易掌握了。
  本书的示例代码可以运行在Linksys E2100L无线路由器上,该无线路由器在零售商店里就可以买到。只不过,我们并不是将Linksys硬件作为一个无线路由器来使用。我们的做法是,打开Linksys设备,将一根串行线连接到其控制端口,使用该串行线来中断Linksys正常的启动过程,并通过输入命令来迫使Linksys硬件下载和运行一个Xinu操作系统副本。也就是说,我们基本上忽略供应商所提供的软件,而是对其底层的硬件进行控制来运行Xinu。
  本书适用于高年级的本科生或者研究生,也适用于那些想了解操作系统的计算机从业人员。在本书所提供的全部材料里,虽然没有任何议题的难度达到不能理解的程度,但学习本书的全部内容可能需要超过一学期的时间。本科生里很少有学生能够熟练地阅读串行程序,而理解运行时环境的细节或机器架构的学生就更少了。因此,必须对学生进行仔细引导,以便使其可以掌握进程管理和进程同步的知识。如果时间有限,我推荐覆盖的内容包括第1章~第7章(进程管理)、第9章(基本的内存管理)、第12章(中断处理)、第13章(时钟管理)、第14章(设备无关的I/O)和第19章(文件系统)。此外,对于一个完整学期的本科生课程来说,讨论第20章的远程文件系统等基本的远程访问议题也很重要。对于研究生课程来说,学生应当完整地阅读整本书,课堂讨论则应该专注于一些微妙的细节、各种折中和不同实现方案的比较。不管是本科生课程还是研究生课程,都应该包括的两个议题是:1)在初始化阶段,当一个运行中的程序转化为一个进程时所发生的各种改变;2)当输入行里的字符序列作为一个字符串变量传递给命令进程时,在操作系统壳里所发生的转化。
  在所有情况下,如果学生能够在实验室中对系统进行动手实验,则学习的效果将大幅提高。理想的状态下,学生可以在课程的最初几天或几个星期开始使用这个系统,然后再试图理解系统的内部结构。本书第1章提供了几个例子和一些能够引起学生兴趣的实验(令人吃惊的是,很多学生在学习过操作系统课程后,却没有写过一个并发程序或使用过操作系统功能)。
  如果要在一个学期内覆盖本书的大部分内容,则要求极快的进度,而这在本科生课程里难以达到。此时,选择略去哪些内容将很大程度上取决于选修本课程的学生的背景。在系统课程里,我们需要课堂讲解时间来帮助学生理解动机和细节。如果学生修过的“数据结构”课程里对内存管理和表处理进行过讨论,则本书第4章和第9章的内容可以略过。如果学生在将来会选修网络方面的课程,则第17章的网络协议内容也可以跳过。此外,本书包括一章远程磁盘系统和一章远程文件系统,这两章的内容存在一些相似之处,可以略过一章。相对来说,远程磁盘系统一章的内容可能更加贴切,因为该章引入了磁盘块缓存的议题,而该议题对于许多操作系统来说都非常重要。
  在研究生课程里,课堂时间可以用来讨论动机、原理、折中、不同原语集和不同的实现方案比较。学生在本课程学习结束后,应当对进程模型、中断和进程之间的关系有一个深刻的理解,同时也将具备理解、创建和修改系统组件的能力。学生应当在大脑中建立起了整个系统的完整概念模型,并且知道所有的组件之间是如何交互协作的。
  我推荐在各个层面上设计程序设计实验。本书的许多练习都推荐对代码进行修改或者测量,或者尝试不同的实现方案。相关的软件可在下面的网站上免费下载,该网站上还列有如何创建一个Linksys实验平台的指令:www.xinu.cs.purdue.edu。
  因为Linksys的硬件非常便宜,所以构建一个实验的成本很低。此外,我们也有用于其他硬件平台的软件版本,这些版本包括x86和ARM的一个功能有限的版本。
  本书中的许多练习都建议进行改进、实验和不同实现,但是也可以设计大型实验项目。可以用于不同硬件平台的大型实验例子包括:虚拟内存系统、不同计算机之间指令执行的同步机制、虚拟网络的设计等。例如,普度大学的一些学生就将Xinu操作系统移植到了各种处理器上,或者为各种I/O设备编写了设备驱动程序。
  学习本书前,学生需要具备基本的程序设计能力。学生应当理解基本的数据结构,这些基本结构包括链表、栈和队列,并且应当用C语言写过程序。
  最后,我鼓励设计人员尽可能使用高级程序设计语言,仅在必要的情况下才使用汇编语言。根据这种原则,Xinu操作系统的大部分都是用C语言编写的。少数一些与机器相关的功能,如上下文切换和中断分配器的最底层功能,则是用汇编语言写成的。所有的汇编语言代码都附有解释和注释,使读者无需学习汇编语言的细节就可以理解这些代码。此外,我们还提供用于其他平台的Xinu版本,这样就可以对在各种平台上实现Xinu操作系统的成本进行比较。例如,我们可以对在MIPS处理器上实现Xinu所需要的代码量和在其他处理器架构(如x86)上实现Xinu所需要的代码量进行比较。
  本书的成书要归功于我过去在商业操作系统上所获得的各种经验,这些经验有好也有坏。虽然Xinu操作系统与现有的操作系统在内部机制上并不相同,但其基本的思想却并不新颖。另外,虽然Xinu系统里的许多概念和名称都来自于UNIX系统,但读者应当注意,这两个系统里的许多函数所使用的参数和内部结构有巨大的不同。因此,为一个系统所写的应用程序在未经修改的情况下不能在另一个平台上运行。
  我感谢为Xinu项目贡献了思想、辛劳和激情的所有人的帮助。在过去的岁月里,普度大学的许多研究生都从事过本系统的工作,他们为Xinu进行过移植,写过设备驱动。从原始的系统版本开始,Xinu到目前已经走过了30多年的历程。本书的Xinu版本是原始版本的一个完全重写,但却保留了原始设计的优雅。Dennis Brylow将Xinu移植到了Linksys平台,并且创建了许多底层的构件,包括启动代码、上下文切换和Ethernet驱动。Dennis还设计了重启机制,并应用在普度大学的实验室里。另外,我特别要感谢我的妻子和我的合作伙伴Christine,她的仔细编辑和建议让本书改善良多。
  Douglas E.Comer
  2011年8月


《嵌入式系统开发精要:从底层驱动到应用集成》 内容简介 在飞速发展的嵌入式技术浪潮中,理解并掌握嵌入式系统的设计与开发至关重要。本书旨在为读者提供一套系统、深入的学习路径,覆盖从硬件底层驱动到复杂应用集成的全过程。我们不再拘泥于特定操作系统架构的细节,而是着力于揭示嵌入式系统构建的通用原理、核心挑战以及高效解决方案。本书将带领您穿越信号流的复杂迷宫,构建坚实的软件架构,最终实现稳定、高效、可靠的嵌入式产品。 第一部分:嵌入式系统底层基础与硬件交互 本部分是整个嵌入式系统开发的基石。我们将首先深入理解嵌入式系统的核心——微控制器(Microcontroller Unit, MCU)。这不是对某个特定MCU型号的简单介绍,而是要剖析MCU的通用架构,包括CPU核心(如ARM Cortex-M系列)、内存子系统(RAM, ROM, Flash)、外围设备接口(GPIO, UART, SPI, I2C, ADC, DAC等)以及时钟与电源管理单元。我们将详细阐述这些组件如何协同工作,以及它们在嵌入式系统中的功能定位。 接下来,我们将聚焦于裸机编程(Bare-metal Programming)的概念。这意味着我们将直接与硬件寄存器打交道,不依赖于任何高级操作系统。我们将通过大量实例,讲解如何通过直接读写硬件寄存器来实现对GPIO引脚的控制,如何配置和使用定时器产生精确的时间延迟或周期性信号,如何通过UART进行串行通信,以及如何与其他外设进行基本的数据交换。这个过程将帮助读者建立起对硬件操作的直观认识,理解“代码如何驱动物理世界”。 中断(Interrupts)是嵌入式系统中实现高效并发和响应外部事件的关键机制。我们将深入探讨中断的原理,包括中断向量表、中断服务例程(ISR)的设计原则、中断优先级管理以及中断嵌套。通过实际案例,我们将演示如何配置和处理外部中断,例如按键按下、传感器数据就绪等,以及如何利用定时器中断实现任务调度和周期性数据采集。理解中断处理的精妙之处,是编写响应式嵌入式程序的关键。 内存管理在资源受限的嵌入式环境中同样不容忽视。我们将介绍嵌入式系统中常见的内存组织方式,包括闪存(Flash Memory)用于存储程序代码和常量数据,SRAM用于存储变量和堆栈。我们将讨论代码的加载过程,理解固定地址代码和可重定位代码的区别。对于需要动态分配内存的应用,我们将探讨如何在资源有限的情况下实现高效的内存分配与释放策略,以及避免常见的内存泄漏问题。 第二部分:实时操作系统(RTOS)的核心概念与应用 虽然本书不以特定RTOS为中心,但RTOS是现代嵌入式系统开发不可或缺的组成部分。本部分将系统地介绍RTOS的设计理念和核心组件,帮助读者理解RTOS如何为复杂的嵌入式应用提供结构和管理。 我们将从任务(Task)的概念开始,这是RTOS的基本执行单元。我们将详细阐述任务的状态(就绪、运行、阻塞、挂起),以及任务之间的切换机制——上下文切换(Context Switching)。理解上下文切换的开销和时机,对于优化系统性能至关重要。 进程间通信(Inter-Process Communication, IPC)是RTOS中用于实现任务间协同工作的关键机制。我们将详细讲解几种主要的IPC方式: 信号量(Semaphores): 用于实现资源的互斥访问和任务间的同步。我们将通过实际场景,例如共享打印机资源,来演示信号量的使用。 互斥锁(Mutexes): 专用于解决共享资源互斥访问的问题,并提供优先级继承等机制来避免优先级反转。 消息队列(Message Queues): 允许任务之间发送和接收任意类型的数据块,是实现数据流和事件通知的强大工具。 事件标志组(Event Flags): 允许任务之间通过组合多个事件进行同步,实现更灵活的等待和通知机制。 时间管理是RTOS的核心功能之一。我们将深入讲解RTOS如何提供精确的时间服务,包括系统时钟(System Tick)、延时函数(Delay Functions)以及定时器(Timers)的应用。理解RTOS的调度算法(如优先级调度、时间片轮转)对于预测系统行为和优化资源分配至关重要。 本部分还将探讨RTOS的内存管理策略,例如静态分配和动态分配。我们会讨论RTOS如何管理堆(Heap)和栈(Stack),以及如何避免在RTOS环境下出现死锁(Deadlock)和活锁(Livlock)等并发问题。 第三部分:嵌入式系统软件架构与设计模式 一个良好的软件架构是构建可维护、可扩展、高可靠性嵌入式系统的关键。本部分将引领读者思考如何在RTOS的基础上,构建健壮的应用程序。 我们将介绍几种在嵌入式领域广泛应用的软件架构模式: 事件驱动架构(Event-Driven Architecture): 强调系统响应外部事件的能力,通过事件和消息驱动系统流程,非常适合于需要实时响应的系统。 状态机(State Machines): 一种强大的建模工具,用于描述系统的行为,尤其适用于处理复杂的逻辑和流程控制。我们将演示如何设计和实现状态机,以清晰地管理系统的工作模式。 生产者-消费者模型(Producer-Consumer Model): 一种经典的并发模型,用于解决数据产生与消费之间的速度匹配问题,通过缓冲区(如消息队列)进行解耦。 我们将深入探讨嵌入式系统中常用的设计模式,例如: 单例模式(Singleton Pattern): 确保某个类只有一个实例,并提供一个全局访问点,常用于配置管理器或日志服务。 工厂模式(Factory Pattern): 提供一个创建对象的接口,但由子类决定实例化哪个类,增加了代码的灵活性。 观察者模式(Observer Pattern): 定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 通过对这些架构和设计模式的学习,读者将能够更有条理地组织代码,提高代码的可读性、可测试性和可重用性,从而应对日益复杂的嵌入式项目需求。 第四部分:嵌入式系统通信协议与网络集成 现代嵌入式系统往往需要与其他设备进行通信,甚至接入互联网。本部分将聚焦于嵌入式通信协议和网络集成。 我们将详细介绍嵌入式系统中常用的串行通信协议,例如: UART(Universal Asynchronous Receiver/Transmitter): 最基础的串行通信方式,用于设备间的点对点通信。 SPI(Serial Peripheral Interface): 一种全双工、同步的串行通信总线,适合于连接多个外设,如传感器、存储器等。 I2C(Inter-Integrated Circuit): 一种串行通信总线,具有地址识别功能,允许多个设备挂载在同一总线上,常用于传感器和片上外设的连接。 除了硬件层面的通信,我们还将探讨更高层次的通信协议,尤其是在物联网(IoT)领域。 MQTT(Message Queuing Telemetry Transport): 一种轻量级的发布/订阅消息协议,非常适合于低带宽、高延迟的网络环境,是IoT设备通信的首选协议之一。 HTTP(Hypertext Transfer Protocol): 尽管通常与Web相关,但在某些嵌入式场景下,HTTP也被用于设备间的通信或与云平台的交互。 网络层面的集成将是本部分的重点。我们将讨论嵌入式设备如何连接到网络,无论是通过有线以太网还是无线Wi-Fi、蓝牙、LoRa等。我们将介绍TCP/IP协议栈在嵌入式系统中的实现,以及如何进行网络配置、数据传输和与服务器进行通信。 第五部分:嵌入式系统调试、测试与优化 在嵌入式系统的开发过程中,调试和测试是不可或缺的环节。本部分将提供一套实用的工具和方法,帮助读者快速定位问题,保证产品质量。 我们将深入讲解各种调试技术: 打印调试(Print Debugging): 最简单但有时非常有效的调试方法。 断点调试(Breakpoint Debugging): 利用调试器(如GDB)设置断点,逐步执行代码,观察变量变化。 硬件调试器(Hardware Debuggers): 如JTAG/SWD接口,配合调试器(如OpenOCD, Segger J-Link)进行更底层的代码调试,包括内存查看、寄存器读写等。 逻辑分析仪与示波器: 用于观察信号时序和电平变化,对于解决硬件接口问题至关重要。 我们将介绍嵌入式系统的测试策略: 单元测试(Unit Testing): 对模块或函数进行独立测试,确保其功能正确性。 集成测试(Integration Testing): 测试不同模块组合在一起时的交互是否正常。 系统测试(System Testing): 对整个系统进行端到端的测试,验证其是否满足需求。 最后,我们将讨论嵌入式系统的性能优化。这包括代码优化(算法改进、减少不必要的计算)、内存优化(合理分配,避免浪费)以及功耗优化(低功耗模式的运用)。通过这些方法,读者将能够打造出高效、节能的嵌入式解决方案。 总结 《嵌入式系统开发精要:从底层驱动到应用集成》并非一本关于特定操作系统内核实现的教程。它是一本关于如何构建一个功能完善、性能优越、可靠稳定的嵌入式系统的指南。本书强调的是通用的设计原则、核心技术和实践经验,旨在培养读者独立解决复杂嵌入式问题的能力。通过理论与实践的结合,本书将帮助您建立起扎实的嵌入式系统开发功底,为应对未来不断变化的嵌入式技术挑战做好充分准备。

用户评价

评分

这本书的书名,特别是“Xinu方法”这几个字,瞬间就勾起了我强烈的好奇心。作为一个长期在计算机领域摸爬滚打的从业者,我深知操作系统设计是计算机科学中最核心、最基础也最复杂的领域之一。我曾经阅读过不少关于操作系统的书籍,但总觉得有些意犹未尽,或者过于侧重理论,或者对于实践的指导不够深入。然而,“Xinu”这个名字,给我一种耳目一新的感觉,它似乎暗示了一种更加实用、更加贴近实际的教学方法。我非常好奇,作者是如何将Xinu这个具体的操作系统作为切入点,来讲解如此宏大的操作系统设计原理的。我期望这本书能够提供一种不同于传统模式的学习体验,它可能不是那种“教科书式”的讲解,而是通过一个鲜活的、可运行的例子,来带领读者一步步深入到操作系统的内部。我希望能从中学习到如何思考操作系统的问题,如何设计和实现一个操作系统,甚至是如何去理解和优化现有的操作系统。

评分

我最期待的是这本书能够提供一种全新的视角来看待操作系统。很多关于操作系统的书籍,往往侧重于理论的讲解,虽然内容详实,但常常让人觉得脱离实际,难以想象其在真实计算机上的运行。而“Xinu方法”这个名字,暗示了一种以具体实现为基础的学习方式,这正是我一直以来所寻求的。我希望这本书能够通过Xinu这个具体的操作系统内核,深入浅出地揭示操作系统的核心设计理念和实现细节。我设想,在阅读过程中,我能够不仅仅是“读”到操作系统是如何工作的,而是能够“看到”它如何在Xinu中被实现,甚至能够通过对Xinu代码的理解,去“感受”到操作系统的脉搏。我期待书中能够包含大量的图示、流程图以及关键代码片段的分析,用直观的方式展现操作系统内部的运作机制,例如进程的创建与销毁、内存的分配与回收、中断的处理流程等等。我希望这本书能够打破抽象概念的壁垒,让我能够真正地理解操作系统的“艺术”,掌握构建和理解复杂软件系统的关键技能。

评分

这本书的包装设计,那种简洁而又不失质感的风格,让我第一眼就对它产生了浓厚的兴趣。我一直认为,一本优秀的技术书籍,除了内容本身的高质量,其呈现方式同样重要。封面的设计往往能够传达出书籍的定位和气质,而这本书的设计,恰恰展现了一种严谨、专业且具有前瞻性的学术品味。我尤其被“Xinu方法”这个副标题所吸引,它暗示了一种独特的、以实践为导向的学习路径。我曾经接触过一些关于操作系统的经典著作,它们固然精彩,但在如何将理论知识转化为实际动手能力方面,总觉得缺少一些直接的指导。我希望这本书能够填补这一空白,它不仅仅是关于操作系统的理论知识,更是关于如何通过Xinu这个具体的操作系统来实现这些理论。我非常期待书中能够包含丰富的代码示例、详细的设计思路以及实际操作的指导,让我在阅读的过程中,能够真正地“玩转”操作系统,理解其背后的逻辑和精妙之处。

评分

这本书的封面设计真是太吸引人了,那种深邃的蓝色背景,搭配上简约却充满力量感的银色字体,让人一眼就能感受到一种严谨和深度的学术氛围。我当时就是在书店里被它“抓”住的,它就静静地摆在那里,散发出一种“过来,让我带你进入操作系统设计的奇妙世界”的邀请。我一直对计算机底层的东西非常感兴趣,但又觉得很多资料过于枯燥抽象,难以入门。这本书的名字,尤其是“Xinu方法”这几个字,给我一种独特的感觉,仿佛它提供了一条不同寻常但又充满启发的学习路径。我迫不及待地想知道,通过Xinu这个具体的例子,究竟能如何生动地剖析操作系统的核心原理。我脑海中已经开始构想,这本书会不会像一个经验丰富的向导,带领我穿越复杂的内存管理、进程调度、设备驱动等概念的迷雾,让我能够真正理解“看不见”的操作系统是如何运转的。封面上的图案,虽然只是简单的几何图形组合,但却传递出一种逻辑性和结构感,这正是我对操作系统设计最期待的特质。我希望这本书不仅仅是一本技术手册,更是一次思维的启迪,能够让我对计算机的运行机制产生更深刻、更全面的认识。

评分

这本书的出版信息和作者背景介绍,让我对它充满了期待。看到作者在操作系统领域拥有如此丰富的实践经验和深厚的理论功底,我就知道这绝对不是一本泛泛而谈的书。我尤其看重那些能够将复杂的理论与实际应用巧妙结合的作者,他们往往能够用最生动、最易懂的方式解释最晦涩的概念。我一直在寻找一本能够让我“上手”学习操作系统设计的书籍,而“Xinu方法”这个提示,让我相信这本书的作者并非只满足于理论的陈述,而是会通过一个可执行的、可观察的系统来讲解。我希望这本书能够带领我从最基础的启动过程开始,一步一步地构建起对操作系统的认识,而不是上来就抛出各种高深的术语。我希望它能像一个循循善诱的老师,用清晰的逻辑和丰富的实例,引导我逐步掌握操作系统的各个组成部分及其相互作用。我对于那些能够引发读者思考、鼓励读者动手实践的书籍情有独钟,我相信这本书一定能满足我的这一期望,它不仅仅是知识的传授,更是一种能力的培养,一种解决问题的思维方式的塑造。

评分

正在看,不错,我,很喜欢

评分

不错,还行,不错,还行,不错,还行

评分

还是应该多看看这类的书籍,多动手,不然OS的学习就成为学习政治了

评分

正在看,不错,我,很喜欢

评分

学习操作系统的,可以参考的一本书

评分

值得学习值得学习值得学习值得学习值得学习

评分

这个系列的书都比较喜欢,理论多,比较深入

评分

书质量很不错,都是正版的,价格也比较优惠。京东客服态度很好,比较有礼貌,疑问都能很好解决。送货速度也很快,上午下单,下午就能送到。不是专业的,所以具体的内容不怎么太懂,别人看了都说是蛮不错的书,挺有用的。

评分

浏览过一遍,感觉还不错的样子

相关图书

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 book.coffeedeals.club All Rights Reserved. 静流书站 版权所有