作品简介

相信很多同行和笔者以前一样,阅读过很多操作系统理论方面的书籍,感觉它们所讲述的理论大同小异且比较容易理解,但是真要我们自己去动手开发和实现操作系统时,我们可能连操作系统的第一行代码该怎么写都不知道。为什么会这样?

因为操作系统是硬件平台上的第—层软件,若不了解硬件平台的细节,是不能实现操作系统的,所以本书一开始就选择了一款常用的硬件平台,并对其进行了详细描述,重点介绍了硬件平台上的实时时钟、定时器、串口、中断控制器、内存芯片、flash芯片、CPU、MMU等,然后介绍操作系统架构设计和开发环境与开发工具,尤其开发工具,详细了解开发工具会大大方便后面的开发工作并解决一些困惑,最后介绍了操作系统的初始化、HAL、内存管理、中断管理、设备管理、进程管理、文件系统、系统调用接口、应用程序库。对这些组件的介绍都是先明确这个组件要完成什久功能,达到什么要求。接着详述这个组件必须要关注的硬件的细节,然后把我们的想法和设计归纳成数据结构。最后编写完成这些功能的代码。

作者:彭东

作品目录

  • 前言
  • 第1章 操作系统的功能及为什么需要它
  • 1.1 从hello world开始
  • 1.2 操作系统功能演进
  • 1.3 小结
  • 第2章 硬件平台
  • 2.1 选择平台
  • 2.1.1 mini2440
  • 2.1.2 mini2440平台的信息
  • 2.2 必须要关注的硬件
  • 2.2.1 原因
  • 2.2.2 RTC
  • 2.2.3 定时器
  • 2.2.4 串口
  • 2.2.5 中断控制器
  • 2.2.6 SDRAM
  • 2.2.7 Norflash
  • 2.2.8 Nandflash
  • 2.3 小结
  • 第3章 处理器
  • 3.1 ARM公司与其处理器
  • 3.2 ARM920T的结构与特性
  • 3.2.1 ARM920T CPU结构
  • 3.2.2 ARM920T CPU特性
  • 3.3 ARM920T存储体系
  • 3.3.1 ARM920T地址空间
  • 3.3.2 ARM920T存储器格式
  • 3.3.3 ARM920T存储地址对齐
  • 3.4 ARM920T状态
  • 3.4.1 ARM状态
  • 3.4.2 Thumb状态
  • 3.5 ARM920T处理器的7种工作模式
  • 3.6 寄存器
  • 3.7 异常和中断
  • 3.7.1 什么是异常和中断
  • 3.7.2 异常中断向量
  • 3.8 ARM920T指令集
  • 3.8.1 指令及其编码格式
  • 3.8.2 分支跳转指令
  • 3.8.3 数据处理指令
  • 3.8.4 装载和存储指令
  • 3.8.5 程序状态寄存器操作指令
  • 3.8.6 协处理器操作指令
  • 3.8.7 异常中断产生指令
  • 3.9 MMU
  • 3.9.1 MMU概述
  • 3.9.2 为什么要有MMU
  • 3.9.3 ARM920T CP15协处理器
  • 3.9.4 MMU页表
  • 3.9.5 MMU页面访问权限的控制
  • 3.9.6 MMU的快表TLB
  • 3.9.7 MMU的编程接口
  • 3.10 Cache
  • 3.10.1 ARM920T的Cache
  • 3.10.2 Cache的原理
  • 3.10.3 Cache的类型及要注意的问题
  • 3.10.4 ARM920T Cache的编程接口
  • 3.11 小结
  • 第4章 操作系统内核的设计与构建
  • 4.1 操作系统内核的设计
  • 4.1.1 内核要完成的功能
  • 4.1.2 内核的架构
  • 4.1.3 分离硬件的相关性
  • 4.1.4 我们的选择
  • 4.2 开发环境及相关工具
  • 4.2.1 Linux环境
  • 4.2.2 文本编辑器
  • 4.2.3 GCC
  • 4.2.4 LD
  • 4.2.5 make
  • 4.3 LMOSEM的构建系统
  • 4.3.1 LMOSEM的makefile
  • 4.3.2 LMOSEM的链接脚本
  • 4.4 开发板的安装
  • 4.5 小结
  • 第5章 语言间调用约定与基本数据结构
  • 5.1 寄存器使用约定
  • 5.1.1 寄存器别名
  • 5.1.2 参数传递与返回值
  • 5.2 基本数据结构
  • 5.2.1 C语言的基本数据结构
  • 5.2.2 list_h_t数据结构
  • 5.2.3 spinlock_t数据结构
  • 5.2.4 kwlst_t数据结构
  • 5.2.5 sem_t数据结构
  • 5.3 数据结构存在于内存中的形式
  • 5.4 C与汇编的混用
  • 5.5 小结
  • 第6章 内核初始化
  • 6.1 开始
  • 6.1.1 第一行汇编代码
  • 6.1.2 第一个C函数
  • 6.2 MMU和中断向量的初始化
  • 6.2.1 初始化MMU
  • 6.2.2 复制中断向量
  • 6.3 串口初始化
  • 6.3.1 串口硬件
  • 6.3.2 内核的printf
  • 6.4 机器数据结构
  • 6.4.1 设计数据结构
  • 6.4.2 确定一些重要数据结构与内核的地址
  • 6.5 初级内存管理初始化
  • 6.5.1 设计一些数据结构
  • 6.5.2 初始化mmapdsc_t结构数组
  • 6.5.3 建立起内存分配数据结构
  • 6.6 中断初始化
  • 6.6.1 设计一些数据结构
  • 6.6.2 初始中断源描述符
  • 6.7 初始化测试
  • 6.8 小结
  • 第7章 内存管理
  • 7.1 内核功能层入口
  • 7.2 内存管理组件的设计
  • 7.3 块级内存管理
  • 7.3.1 块级内存管理数据结构视图
  • 7.3.2 块级内存管理接口
  • 7.3.3 主分配函数
  • 7.3.4 分配时查找alcfrelst_t
  • 7.3.5 分配时查找和操作mmapdsc_t
  • 7.3.6 分配代码写得对吗
  • 7.3.7 主释放函数
  • 7.3.8 释放时查找alcfrelst_t
  • 7.3.9 释放时查找和操作mmapdsc_t
  • 7.3.10 测试块级内存管理层
  • 7.4 页级内存管理
  • 7.4.1 页级内存管理接口及调用流程
  • 7.4.2 相关的数据结构
  • 7.4.3 页级内存管理初始化
  • 7.4.4 分配主函数
  • 7.4.5 分配时查找mplhead_t
  • 7.4.6 分配时新建页级内存池
  • 7.4.7 分配时操作mplhead_t
  • 7.4.8 分配代码写得对吗
  • 7.4.9 释放主函数
  • 7.4.10 释放时查找mplhead_t
  • 7.4.11 释放时操作mplhead_t
  • 7.4.12 释放时删除页级内存池
  • 7.4.13 测试页级内存管理层
  • 7.5 字级内存管理
  • 7.5.1 字级内存接口及调用流程
  • 7.5.2 相关的数据结构
  • 7.5.3 分配主函数
  • 7.5.4 分配时查找mplhead_t
  • 7.5.5 分配时新建字级内存池
  • 7.5.6 分配时操作mplhead_t
  • 7.5.7 分配代码写得对吗
  • 7.5.8 释放主函数
  • 7.5.9 释放时查找mplhead_t
  • 7.5.10 释放时操作mplhead_t
  • 7.5.11 释放时删除字级内存池
  • 7.5.12 测试字级内存管理层
  • 7.6 小结
  • 第8章 中断管理
  • 8.1 中断与中断控制器
  • 8.1.1 什么是中断
  • 8.1.2 S3C2440A中断控制器
  • 8.2 中断管理的架构与相关数据结构
  • 8.2.1 中断管理的架构
  • 8.2.2 设计数据结构intfltdsc_t和intserdsc_t
  • 8.3 中断处理
  • 8.3.1 中断辅助例程
  • 8.3.2 从中断向量开始
  • 8.3.3 保存CPU上下文
  • 8.3.4 中断主分派例程
  • 8.3.5 确定中断源
  • 8.3.6 调用中断处理例程
  • 8.4 安装中断回调例程
  • 8.5 小结
  • 第9章 驱动模型
  • 9.1 操作系统内核如何管理设备
  • 9.1.1 分权而治
  • 9.1.2 设备类型
  • 9.1.3 驱动程序
  • 9.2 相关数据结构
  • 9.2.1 驱动
  • 9.2.2 派发例程类型
  • 9.2.3 设备ID
  • 9.2.4 设备
  • 9.2.5 IO包
  • 9.2.6 设备表
  • 9.3 驱动模型的基础设施
  • 9.3.1 驱动程序从哪里执行
  • 9.3.2 新建与注册设备
  • 9.3.3 注册回调函数
  • 9.3.4 发送IO包
  • 9.3.5 调用驱动程序函数
  • 9.3.6 等待服务
  • 9.3.7 完成服务
  • 9.3.8 驱动模型辅助函数
  • 9.4 systick驱动程序实例
  • 9.4.1 systick硬件
  • 9.4.2 systick驱动程序框架
  • 9.4.3 systick驱动程序实现
  • 9.4.4 测试systick驱动程序
  • 9.5 RTC驱动程序实例
  • 9.5.1 RTC硬件
  • 9.5.2 RTC驱动程序实现
  • 9.6 小结
  • 第10章 进程
  • 10.1 应用程序的运行
  • 10.1.1 程序运行需要什么资源
  • 10.1.2 任何时刻资源都可用吗
  • 10.1.3 提出多道程序模型
  • 10.2 相关的数据结构
  • 10.2.1 设计进程的数据结构
  • 10.2.2 调度进程表
  • 10.3 LMOSEM内核的第一个进程
  • 10.3.1 进程管理组件的初始化
  • 10.3.2 建立空转进程
  • 10.3.3 空转进程运行
  • 10.4 新建进程
  • 10.4.1 分配进程描述符
  • 10.4.2 分配内存空间
  • 10.4.3 加入进程调度表
  • 10.5 进程调度
  • 10.5.1 调度算法
  • 10.5.2 处理进程时间片
  • 10.5.3 检查调度状态
  • 10.5.4 选择进程
  • 10.5.5 进程切换
  • 10.5.6 进程等待与唤醒
  • 10.5.7 进程测试
  • 10.6 小结
  • 第11章 文件系统
  • 11.1 文件系统设计
  • 11.1.1 文件系统只是一个设备
  • 11.1.2 数据格式与存储块
  • 11.1.3 如何组织文件
  • 11.1.4 关于我们文件系统的限制
  • 11.2 相关的数据结构
  • 11.2.1 超级块
  • 11.2.2 位图
  • 11.2.3 目录
  • 11.2.4 文件管理头
  • 11.3 文件系统格式化
  • 11.3.1 建立超级块
  • 11.3.2 建立位图
  • 11.3.3 建立根目录
  • 11.4 文件系统基础操作
  • 11.4.1 获取与释放根目录文件
  • 11.4.2 字符串操作
  • 11.4.3 分解路径名
  • 11.4.4 检查文件是否存在
  • 11.5 文件操作
  • 11.5.1 新建文件
  • 11.5.2 删除文件
  • 11.5.3 打开文件
  • 11.5.4 读写文件
  • 11.5.5 关闭文件
  • 11.5.6 驱动整合
  • 11.6 文件系统测试
  • 11.6.1 格式化测试
  • 11.6.2 文件操作测试
  • 11.7 小结
  • 第12章 系统调用与应用程序库
  • 12.1 系统调用机制
  • 12.1.1 软中断指令
  • 12.1.2 传递系统调用参数
  • 12.1.3 系统调用分发器
  • 12.2 时间管理系统调用
  • 12.3 进程管理系统调用
  • 12.3.1 进程的运行与退出
  • 12.3.2 获取进程的ID
  • 12.4 内存管理系统调用
  • 12.5 设备与文件系统调用
  • 12.5.1 设备与文件的打开
  • 12.5.2 设备与文件的关闭
  • 12.5.3 设备与文件的读写
  • 12.5.4 设备与文件的控制
  • 12.6 应用程序库
  • 12.7 测试
  • 12.8 小结
  • 后记
展开全部