内容简介
本书将是操作系统实践领域和嵌入式操作系统领域的又一里程碑之作。
作者是计算机领域“鬼才”,独立编写出了多进程、多线程、多CPU、支持虚拟内存的x86_64体系下的操作系统内核,一共6个测试版本,10万余行代码;在此基础之上,作者又开发出了基于ARM平台的嵌入式系统内核。这两个内核都可以完全运行于物理机上。
本书从硬件和软件两个维度系统、深度阐述嵌入式操作系统的构成、原理和实现方法,真正可以实现教读者从零开始设计、架构和开发一个完整的、可工作的嵌入式操作系统。
硬件部分分析了所选择的平台及其之上的组件。先宏观地方式分析了平台的外围组件:如实时时钟、定时器、串口、中断控制器、内存芯片、flash芯片、CPU、MMU等……让读者先有个初步的印象,在写代码用到某个组件时再详述其内部编程细节。接着重点分析了CPU和MMU的细节,以及内存芯片,这三个部件是程序运行的基石所以在写代码之前必须详细了解它们的细节。
软件部分首先分析和讲解了操作系统内核的功能及其所包含的组件、操作系统的架构设计、构建操作系统的工具,以及C语言的调用约定、基本的数据结构和C数据结构在内存中的镜像;然后详细讲解了如何编写代码完成这些组件:初始化、内存管理、中断管理、设备管理、进程管理、文件系统、系统调用接口、应用程序库。对这些组件的功能、要求、硬件细节、数据结构和功能代码做了完整且详细的讲解。系统调用接口为了顾及读者们已有的知识体系,模拟了类UNIX调用接口,方便读者理解核心原理。
本书始终保持这样的结构:从硬件平台到架构设计到数据结构最后落实到每行代码,无论是针对整个操作系统,还是操作系统中的每一个组件,每一个功能模块都保持着这样的结构,正是因为这样的结构,学完这本书我们每一个人都可以豪迈地说一句:“我是一个真正的操作系统实践者。”
封面图
目录
- 前言
- 第1章操作系统的功能及为什么需要它1
- 1.1从hello world开始1
- 1.2操作系统功能演进3
- 1.3小结7
- 第2章硬件平台8
- 2.1选择平台8
- 2.1.1mini24408
- 2.1.2mini2440平台的信息9
- 2.2必须要关注的硬件13
- 2.2.1原因14
- 2.2.2RTC15
- 2.2.3定时器16
- 2.2.4串口17
- 2.2.5中断控制器18
- 2.2.6SDRAM19
- 2.2.7Norflash23
- 2.2.8Nandflash24
- 2.3小结26
- 第3章处理器28
- 3.1ARM公司与其处理器28
- 3.2ARM920T的结构与特性29
- 3.2.1ARM920T CPU结构29
- 3.2.2ARM920T CPU特性32
- 3.3ARM920T存储体系33
- 3.3.1ARM920T地址空间33
- 3.3.2ARM920T存储器格式34
- 3.3.3ARM920T存储地址对齐35
- 3.4ARM920T 状态35
- 3.4.1ARM状态36
- 3.4.2Thumb 状态36
- 3.5ARM920T处理器的7种工作模式37
- 3.6寄存器38
- 3.7异常和中断43
- 3.7.1什么是异常和中断43
- 3.7.2异常中断向量46
- 3.8ARM920T指令集47
- 3.8.1指令及其编码格式48
- 3.8.2分支跳转指令50
- 3.8.3数据处理指令53
- 3.8.4装载和存储指令63
- 3.8.5程序状态寄存器操作指令73
- 3.8.6协处理器操作指令76
- 3.8.7异常中断产生指令79
- 3.9MMU80
- 3.9.1MMU概述80
- 3.9.2为什么要有MMU82
- 3.9.3ARM920T CP15协处理器85
- 3.9.4MMU 页表98
- 3.9.5MMU页面访问权限的控制113
- 3.9.6MMU的快表TLB113
- 3.9.7MMU的编程接口114
- 3.10Cache115
- 3.10.1ARM920T的Cache115
- 3.10.2Cache的原理116
- 3.10.3Cache的类型及要注意的问题117
- 3.10.4ARM920T Cache的编程接口119
- 3.11小结120
- 第4章操作系统内核的设计与构建122
- 4.1操作系统内核的设计122
- 4.1.1内核要完成的功能123
- 4.1.2内核的架构124
- 4.1.3分离硬件的相关性126
- 4.1.4我们的选择127
- 4.2开发环境及相关工具129
- 4.2.1Linux环境129
- 4.2.2文本编辑器132
- 4.2.3GCC134
- 4.2.4LD136
- 4.2.5make139
- 4.3LMOSEM的构建系统142
- 4.3.1LMOSEM的makefile142
- 4.3.2LMOSEM的链接脚本147
- 4.4开发板的安装150
- 4.5小结154
- 第5章语言间调用约定与基本数据结构156
- 5.1寄存器使用约定156
- 5.1.1寄存器别名157
- 5.1.2参数传递与返回值157
- 5.2基本数据结构159
- 5.2.1C语言的基本数据结构160
- 5.2.2list_h_t数据结构161
- 5.2.3spinlock_t数据结构164
- 5.2.4kwlst_t数据结构165
- 5.2.5sem_t数据结构166
- 5.3数据结构存在于内存中的形式168
- 5.4C与汇编的混用170
- 5.5小结174
- 第6章内核初始化175
- 6.1开始175
- 6.1.1第一行汇编代码175
- 6.1.2第一个C函数178
- 6.2MMU和中断向量的初始化181
- 6.2.1初始化MMU181
- 6.2.2复制中断向量186
- 6.3串口初始化190
- 6.3.1串口硬件190
- 6.3.2内核的printf196
- 6.4机器数据结构201
- 6.4.1设计数据结构201
- 6.4.2确定一些重要数据结构与内核的地址203
- 6.5初级内存管理初始化205
- 6.5.1设计一些数据结构205
- 6.5.2初始化mmapdsc_t结构数组209
- 6.5.3建立起内存分配数据结构212
- 6.6中断初始化215
- 6.6.1设计一些数据结构215
- 6.6.2初始中断源描述符220
- 6.7初始化测试222
- 6.8小结225
- 第7章内存管理226
- 7.1内核功能层入口226
- 7.2内存管理组件的设计228
- 7.3块级内存管理229
- 7.3.1块级内存管理数据结构视图229
- 7.3.2块级内存管理接口230
- 7.3.3主分配函数232
- 7.3.4分配时查找alcfrelst_t 234
- 7.3.5分配时查找和操作mmapdsc_t236
- 7.3.6分配代码写得对吗239
- 7.3.7主释放函数240
- 7.3.8释放时查找alcfrelst_t 241
- 7.3.9释放时查找和操作mmapdsc_t242
- 7.3.10测试块级内存管理层246
- 7.4页级内存管理248
- 7.4.1页级内存管理接口及调用流程248
- 7.4.2相关的数据结构251
- 7.4.3页级内存管理初始化254
- 7.4.4分配主函数256
- 7.4.5分配时查找mplhead_t257
- 7.4.6分配时新建页级内存池258
- 7.4.7分配时操作mplhead_t262
- 7.4.8分配代码写得对吗263
- 7.4.9释放主函数265
- 7.4.10释放时查找mplhead_t266
- 7.4.11释放时操作mplhead_t268
- 7.4.12释放时删除页级内存池269
- 7.4.13测试页级内存管理层271
- 7.5字级内存管理273
- 7.5.1字级内存接口及调用流程274
- 7.5.2相关的数据结构275
- 7.5.3分配主函数276
- 7.5.4分配时查找mplhead_t278
- 7.5.5分配时新建字级内存池279
- 7.5.6分配时操作mplhead_t282
- 7.5.7分配代码写得对吗283
- 7.5.8释放主函数285
- 7.5.9释放时查找mplhead_t285
- 7.5.10释放时操作mplhead_t287
- 7.5.11释放时删除字级内存池288
- 7.5.12测试字级内存管理层289
- 7.6小结292
- 第8章中断管理293
- 8.1中断与中断控制器293
- 8.1.1什么是中断293
- 8.1.2S3C2440A中断控制器294
- 8.2中断管理的架构与相关数据结构298
- 8.2.1中断管理的架构298
- 8.2.2设计数据结构intfltdsc_t和intserdsc_t298
- 8.3中断处理301
- 8.3.1中断辅助例程301
- 8.3.2从中断向量开始305
- 8.3.3保存CPU上下文306
- 8.3.4中断主分派例程310
- 8.3.5确定中断源314
- 8.3.6调用中断处理例程317
- 8.4安装中断回调例程319
- 8.5小结322
- 第9章驱动模型323
- 9.1操作系统内核如何管理设备323
- 9.1.1分权而治323
- 9.1.2设备类型325
- 9.1.3驱动程序327
- 9.2相关数据结构328
- 9.2.1驱动329
- 9.2.2派发例程类型329
- 9.2.3设备ID330
- 9.2.4设备331
- 9.2.5IO包332
- 9.2.6设备表333
- 9.3驱动模型的基础设施335
- 9.3.1驱动程序从哪里执行335
- 9.3.2新建与注册设备340
- 9.3.3注册回调函数344
- 9.3.4发送IO包345
- 9.3.5调用驱动程序函数346
- 9.3.6等待服务347
- 9.3.7完成服务350
- 9.3.8驱动模型辅助函数352
- 9.4systick驱动程序实例356
- 9.4.1systick硬件356
- 9.4.2systick驱动程序框架360
- 9.4.3systick驱动程序实现362
- 9.4.4测试systick驱动程序368
- 9.5RTC驱动程序实例370
- 9.5.1RTC硬件370
- 9.5.2RTC驱动程序实现375
- 9.6小结385
- 第10章进程386
- 10.1应用程序的运行386
- 10.1.1程序运行需要什么资源387
- 10.1.2任何时刻资源都可用吗388
- 10.1.3提出多道程序模型389
- 10.2相关的数据结构390
- 10.2.1设计进程的数据结构391
- 10.2.2调度进程表392
- 10.3LMOSEM内核的第一个进程394
- 10.3.1进程管理组件的初始化395
- 10.3.2建立空转进程396
- 10.3.3空转进程运行399
- 10.4新建进程404
- 10.4.1分配进程描述符404
- 10.4.2分配内存空间406
- 10.4.3加入进程调度表408
- 10.5进程调度410
- 10.5.1调度算法410
- 10.5.2处理进程时间片411
- 10.5.3检查调度状态414
- 10.5.4选择进程415
- 10.5.5进程切换418
- 10.5.6进程等待与唤醒421
- 10.5.7进程测试425
- 10.6小结428
- 第11章文件系统430
- 11.1文件系统设计430
- 11.1.1文件系统只是一个设备430
- 11.1.2数据格式与存储块432
- 11.1.3如何组织文件433
- 11.1.4关于我们文件系统的限制434
- 11.2相关的数据结构434
- 11.2.1超级块435
- 11.2.2位图435
- 11.2.3目录437
- 11.2.4文件管理头438
- 11.3文件系统格式化440
- 11.3.1建立超级块440
- 11.3.2建立位图445
- 11.3.3建立根目录448
- 11.4文件系统基础操作452
- 11.4.1获取与释放根目录文件453
- 11.4.2字符串操作455
- 11.4.3分解路径名457
- 11.4.4检查文件是否存在459
- 11.5文件操作460
- 11.5.1新建文件461
- 11.5.2删除文件463
- 11.5.3打开文件466
- 11.5.4读写文件469
- 11.5.5关闭文件472
- 11.5.6驱动整合473
- 11.6文件系统测试475
- 11.6.1格式化测试475
- 11.6.2文件操作测试479
- 11.7小结482
- 第12章系统调用与应用程序库483
- 12.1系统调用机制483
- 12.1.1软中断指令484
- 12.1.2传递系统调用参数486
- 12.1.3系统调用分发器488
- 12.2时间管理系统调用489
- 12.3进程管理系统调用492
- 12.3.1进程的运行与退出492
- 12.3.2获取进程的ID494
- 12.4内存管理系统调用496
- 12.5设备与文件系统调用498
- 12.5.1设备与文件的打开498
- 12.5.2设备与文件的关闭506
- 12.5.3设备与文件的读写508
- 12.5.4设备与文件的控制512
- 12.6应用程序库514
- 12.7测试520
- 12.8小结526
- 后记528