第一章 概 述
1.1 嵌入式系统概述
1.2 嵌入式操作系统概述
1.2.1 嵌入式操作系统特点
1.可裁剪性
2.与应用代码一起连接
3.可移植性
4.可扩展性
1.2.2 嵌入式操作系统与通用操作系统的区别
1.地址空间上的区别
2.内存管理上的区别
3.应用方式上的区别
1.2.3 嵌入式实时操作系统
1.3 操作系统的基本概念
1.3.1 微内核与大内核
1.3.2 进程、线程与任务
1.3.3 可抢占与不可抢占
1.3.4 同步机制
1.事件(Event)
2.信号量(Semaphore)
3.互斥体(Mutex)
4.内核线程对象(KernelThreadObject)
5.睡眠
6.定时器
1.4 Hello China概述
1.4.1 Hello China的功能特点
1.4.2 Hello China的开发环境
开发环境的搭建
1.创建一个DLL工程:
2.设置项目编译与连接选项:
1.4.3 面向对象思想的模拟
1.使用结构体定义实现对象
2.使用宏定义实现继承
3.使用强制类型转换实现动态类型
1.4.4 对象机制
1.4.5 Hello China V1.0版本的源文件构成
1.4.6 Hello China V1.5版本的源文件构成
1.4.7 Hello China的使用
1.5 实例:一个简单的IP路由器的实现
1.5.1 概述
1.5.2 路由器的硬件结构
1.5.3 路由器的软件功能
1.5.4 各任务的实现
第二章Hello China的加载和初始化
2.1 常见嵌入式系统的启动
2.1.1 典型嵌入式系统内存映射布局
2.1.2 嵌入式系统的启动概述
2.1.3 常见嵌入式操作系统的加载方式
2.1.4 嵌入式系统软件的写入
2.2 Hello China在PC机上的启动
2.2.1 PC机启动过程概述
2.2.2 Hello China的引导过程
2.2.3 实地址模式下的初始化
2.2.4 保护模式下的初始化
2.2.5 操作系统核心功能的初始化
第三章Hello China的SHELL
3.1 Hello China的SHELL
3.1.1 Shell的启动和初始化
3.1.2 Shell的消息处理过程
3.1.3 内部命令的处理过程
3.1.4 外部命令的处理过程
第四章Hello China的线程
4.1 线程概述
4.1.1 进程、线程和任务
4.2 Hello China V1.0版本的线程实现
4.2.1 核心线程管理对象
4.2.2 线程的状态及其切换
4.2.3 核心线程对象
4.2.4 线程的上下文
4.2.5 线程的优先级与调度
4.2.6 线程的创建
4.2.7 线程的结束
4.2.8 线程的消息队列
4.2.9 线程的切换——中断上下文
4.2.10 线程的切换——系统调用上下文
4.2.11 上下文保存和切换的底层函数
4.2.12 线程的睡眠与唤醒
4.3 V1.5版本中核心线程的实现
4.3.1 概述
4.3.2 核心线程调度时机
4.4 V1.5核心线程管理器(KernelThreadManager)的实现
4.4.1 V1.5核心线程队列的实现
4.5 V1.5核心线程对象(KernelThreadObject)的实现
4.5.1 V1.5版本中硬件上下文的保存
4.5.2 线程的调度-中断上下文
KERNEL_THREAD_STATUS_SUSPENDED:
KERNEL_THREAD_STATUS_SLEEPING:
KERNEL_THREAD_STATUS_TERMINAL:
KERNEL_THREAD_STATUS_BLOCKED:
4.5.3 线程的调度-程序上下文
KERNEL_THREAD_STATUS_RUNNING:
KERNEL_THREAD_STATUS_READY:
KERNEL_THREAD_STATUS_SUSPENDED:
KERNEL_THREAD_STATUS_SLEEPING:
KERNEL_THREAD_STATUS_TERMINAL:
核心线程的创建和初始化
中断处理程序结束后的线程调度
第五章 内存管理机制
5.1 内存管理机制概述
5.2 IA32 CPU内存管理机制
5.2.1 IA32 CPU内存管理机制概述
5.2.2 几个重要的概念
5.2.3 分段机制的应用
5.2.3.1 基本平展段模式
5.2.3.2 保护平展段模式
5.2.3.3 多段模式
5.2.4 分页机制的应用
分页机制概述
操作系统核心的保护
虚拟内存的实现
按需内存分配
代码共享机制
部分装入机制
Power PC CPU的内存管理机制
Hello China内存管理模型
Hello China的内存管理模型
Hello China的内存布局
核心内存池的管理
页框管理对象(PageFrameManager)
页面索引对象
Initialize
Uninitialize
GetPhysicalAddress
ReservePage:
SetPageFlag
ReleasePage
页索引管理器的应用
虚拟内存管理对象(VirtualMemoryMgr)
虚拟区域
虚拟内存管理器(Virtual Memory Manager)
Initialize
Uninitialize
VirtualAlloc
VirtualFree
GetPdeAddress
第六章线程本地堆的实现
6.1 Heap概述
6.2 堆的功能需求定义
6.3 堆的实现概要
6.4 堆的详细实现
6.4.1 堆的创建
6.4.2 堆的销毁
6.4.3 堆内存申请
6.4.4 堆内存释放
6.4.5 malloc和free的实现
第七章 互斥和同步机制的实现
7.1 互斥和同步概述
7.2 关键区段概述
7.3 关键区段产生的原因
7.3.1 多个线程之间的竞争
7.3.2 中断服务程序与线程之间的竞争
7.3.3 多个CPU之间的竞争
单CPU下关键区段的实现
多CPU下关键区段的实现
多CPU环境下的实现方式
Hello China的未来实现
Power PC下关键区段的实现
Power PC提供的互斥访问机制
多CPU环境下的互斥机制
关键区段使用注意事项
Semaphore概述
Semaphore对象的定义
Semaphore对象的实现
Initialize和Uninitialize实现
WaitForThisObject的实现
WaitForThisObjectEx的实现
ReleaseSemaphore的实现
中断和异常概述
硬件相关部分处理
IA32中断处理过程
IDT初始化
硬件无关部分处理
系统对象和中断对象
中断调度过程
缺省中断处理函数
对外服务接口
几个注意事项
Power PC的异常处理机制
PPC 异常处理机制概述
Power PC异常的分类
异常的处理和返回
定时器概述
SetTimer调用
CancelTimer调用
ResetTimer调用
设置定时器操作
定时器超时处理
定时器取消处理
定时器复位
定时器注意事项
第八章 中断和定时处理机制的实现
8.1 中断和异常概述
8.2 硬件相关部分处理
8.2.1 IA32中断处理过程
8.2.2 IDT初始化
8.3 硬件无关部分处理
8.3.1 系统对象和中断对象
8.3.2 中断调度过程
8.3.3 缺省中断处理函数
8.4 对外服务接口
8.5 几个注意事项
8.6 Power PC的异常处理机制
8.6.1 PPC 异常处理机制概述
Power PC异常的分类
异常的处理和返回
定时器概述
SetTimer调用
CancelTimer调用
ResetTimer调用
设置定时器操作
定时器超时处理
定时器取消处理
定时器复位
定时器注意事项
第九章 系统总线管理
9.1 系统总线概述
9.1.1 系统总线
9.1.2 总线管理模型
9.1.3 设备标识符
9.2 系统资源管理
9.2.1 资源描述对象
9.2.3 IO端口资源管理
9.3 驱动程序接口
9.3.1 GetResource
9.3.2 GetDevice
9.3.3 CheckPortRegion
9.3.4 ReservePortRegion
9.3.5 ReleasePortRegion
9.3.6 AppendDevice
9.3.7 DeleteDevice
9.4 PCI总线驱动程序概述
9.4.1 PCI总线概述
9.4.2 PCI设备的配置空间
9.4.3 配置空间关键字段的说明
9.4.3.1 Device ID和Vendor ID
9.4.3.2 Class code
9.4.3.3 Header type
9.4.3.4 Base Address Register
Interrupt Line和Interrupt Pin
Primary、Secondary和Subordinate总线号
IO Base和IO Limit
Memory base和Memory Limit
Prefetch memory base和Prefetch memory limit
PCI配置空间的读取与设置
PCI总线驱动程序的实现
探测PCI总线是否存在
对普通PCI设备进行枚举
配置PCI桥接设备
第十章 驱动程序管理框架
10.1 设备驱动程序管理框架
10.1.1 概述
10.1.2 设备管理器和IO管理器
10.1.2.1 通用的设备管理机制
10.1.2.2 Hello China的设备管理机制
10.1.2.2.1设备管理器(DeviceManager)
10.1.2.2.2 I/O管理器(IOManager)
10.1.3 Hello China的设备管理框架
10.1.4 I/O管理器(I/OManager)
10.1.4.1驱动程序对象和设备对象
10.1.4.2 IOManager对设备对象和设备驱动程序的管理
10.1.4.3 IOManager的实现框架
10.1.4.4 初始化函数(Initialize)
10.1.4.5 IOManager对应用的接口
10.1.4.6 CreateFile的实现
10.1.4.7 ReadFile的实现
10.1.4.8 WriteFile的实现
10.1.4.9 CloseFile的实现
10.1.4.10 IOControl的实现
10.1.4.11 SetFilePointer的实现
10.1.4.12 FlushFile的实现
10.1.4.13IOManager对设备驱动程序的接口
10.1.4.14 驱动程序入口(DriverEntry)
10.1.4.15 设备驱动程序的卸载
10.2 文件系统的实现
10.2.1 文件系统与文件的命名
10.2.3 文件系统驱动程序
10.2.4 打开一个文件的操作流程
10.3 设备驱动程序框架
10.3.1 设备请求控制块(DRCB)
10.3.2 设备驱动程序的文件组织结构
10.3.3 设备驱动程序的功能实现
10.3.3.1 读操作(DeviceRead)的实现
10.3.3.2 写操作(DeviceWrite)的实现
10.3.3.3 设备控制(DeviceCtrl)的实现
10.3.4 设备驱动程序对象
10.3.5 DriverEntry的实现
10.3.6 UnloadEntry的实现
10.4 设备对象
10.4.1 设备对象的定义
10.4.2 设备对象的命名
10.4.3 设备对象的类型
10.4.4 设备对象的设备扩展
10.4.5 设备的打开操作
设备命名策略
采用全球唯一标识符来命名设备
采用网络接口卡硬件地址命名设备
10.5 设备的中断管理
第十一章 应用编程接口
11.1 核心线程操作接口
CreateKernelThread
DestroyKernelThread
SendMessage
GetMessage
SetKernelThreadPriority
GetKernelThreadPriority
GetKernelThreadID
内存操作接口
KMemAlloc
KMemFree
VirtualAlloc
VirtualFree
malloc
free
CreateHeap
DestroyHeap
HeapAlloc
HeapFree
定时器操作接口
SetTimer
CancelTimer
核心线程同步操作接口
Sleep
CreateMutex
ReleaseMutex
DestroyMutex
CreateEvent
SetEvent
ResetEvent
DestroyEvent
WaitForThisObject
WaitForThisObjectEx
系统中断操作接口
ConnectInterrupt
DisconnectInterrupt
输入/输出(IO)接口
CreateFile
ReadFile
WriteFile
IoControl
SetFilePointer
FlushFile
CloseFile
设备驱动程序接口
CreateDevice
DestroyDevice
相关辅助功能接口
StrLen
StrCpy
MemZero
MemCpy
PC服务接口
PrintLine
PrintChar
ChangeLine
GotoHome
第十二章 Hello China的应用开发方法
12.1 Hello China的开发方法概述
12.2 在Hello China基础上开发一个简单应用程序
附录A 串口交互程序及其实现
串行通信接口概述
串行通信编程方式
串口初始化
数据发送
基于轮询方式的数据发送
基于中断方式的数据发送
数据接收
基于轮询方式的数据接收
基于中断方式的数据接收
串口交互程序的实现
串口交互程序的使用
通过PC机的串口,控制特定功能的设备。
通过串口连接两台计算机,实现点对点通信
直连串口线的制作方法
轮询模式的串口交互程序实现
中断模式的串口交互程序实现
串行通信编程总结
轮询方式和中断方式编程的对比
串口交互程序的其它实现方式
附录B 核心线程CPU占用率统计功能
CPU占用率概述
核心线程CPU占用率统计的实现
统计周期和统计算法
核心线程统计对象
核心线程创建回调函数
核心线程调入CPU回调函数
核心线程调出CPU回调函数
核心线程结束回调函数
CPU统计对象
CPU统计对象的定义
CPU统计对象的初始化
核心线程CPU占用率统计
CPU占用率统计线程
进程和多CPU情况下的考虑
进程的用户态和核心态执行时间统计
多CPU环境下的考虑
附录C 系统核心HOOK机制的实现
Hook概述
线程Hook的实现
线程Hook的实现概述
线程调度前后的回调机制
ScheduleFromProc函数中的回调
ScheduleFromInt函数中的回调
线程创建和结束的回调机制
CallThreadHook例程的实现
线程Hook的应用
附录D 如何搭建一个基于Windows的操作系统开发平台
总体概述
Windows RAD开发工具概述
常用的Windows RAD
Microsoft Visual C++
Borland Delphi
JBuilder等Java开发工具
Borland C++
Windows RAD工具总结
Windows RAD工具不能直接用于OS开发的原因
缺省情况下,生成的目标文件的入口地址固定
缺省情况下,生成的目标文件的加载地址固定
RAD生成的目标文件,增加了一个特定文件头
目标模块加载到内存后,需要经过处理才能运行
RAD开发工具开发OS注意事项
避免调用任何Windows操作系统提供的系统调用
避免任何C运行期函数调用
避免使用C或C++提供的异常处理机制
使用Microsoft Visual C++搭建一个OS开发环境
操作系统开发中常用的Microsoft Visual C++特性
内嵌汇编代码
__declspec(naked)函数修饰
如何搭建一个OS映象文件开发环境
创建一个Windows DLL工程
设置项目编译与连接选项
对目标文件进行处理
映象文件的加载与运行
简单OS开发示例
创建一个名字为OSIMG_1的DLL工程
添加一个源程序文件,并编辑实现代码
设置编译连接选项,并进行编译连接
处理目标文件
创建引导磁盘
如何快速掌握汇编语言
掌握汇编语言的益处
可以充分利用在操作系统等系统软件开发中
可以充分理解高级语言特性
可以帮助程序员进行程序调试,寻找程序中的bug
熟练掌握汇编语言的困难所在
汇编语言没有建立起方便的输入/输出方法
汇编语言编译/连接复杂,开发工具难以使用
一种快速掌握汇编语言的方法
附录E 一种代码执行时间测量方法的实现
概述
执行时间计算方法
实现方式
对外接口
IA32硬件平台下的实现
误差分析
Hello China系统时钟中断测试结果
附录F 64bit整型数据类型的实现
概述
加法
__U64的加法
__I64的加法
减法
__U64的减法
__I64的减法
比较
__U64的比较
__I64的比较
移位
__U64的移位
__I64的移位
后续支持
附录G IOCTRL控制程序使用介绍及实例
概述
使用方式
Inputb
Inputw
Inputd
Outputb
Outputw
Outputd
Memwb
Memww
Memwd
Memrb
Memrw
Memrd
Help和exit
一个读取PCI设备配置空间的例子
PCI配置空间读取方法
PCI配置空间布局
PCI总线设备位置获取方法
一个读取PCI配置信息的例子
附录H 优先队列(Priority Queue)和环形缓冲区(RING BUFFER)的实现
优先队列概述
优先队列对象的定义和对外接口
中断安全和多CPU支持
优先队列的实现
InsertIntoQueue的实现
DeleteFromQueue的实现
GetHeaderElement的实现
初始化和销毁函数的实现
队列接口函数的复杂度分析
环形缓冲区概述
环形缓冲区的实现
初始化函数的实现
GetElement函数的实现
AddElement函数的实现