自研操作系统:DIM-SUM设计与实现
  • 推荐2
  • 收藏4
  • 浏览2.6K

自研操作系统:DIM-SUM设计与实现

谢宝友 (作者) 

  • 书  号:978-7-121-39186-6
  • 出版日期:2020-07-16
  • 页  数:456
  • 开  本:16(185*260)
  • 出版状态:上市销售
  • 维护人:符隆美
电子书 ¥90.30
购买电子书
纸质版 ¥129.00
本书详细阐述了自研操作系统DIM-SUM的设计与实现,提供了在ARM 64虚拟机中动手实践DIM-SUM及参与DIM-SUM开发的方法。针对DIM-SUM操作系统的同步与互斥、调度、内存、中断与定时器、块设备、文件系统模块进行了详细的分析,包括这些模块的设计思路、数据结构定义、关键API说明。最重要的是,本书对各个模块的主要函数进行了逐行解释,有助于读者深刻理解如何实现一款实用的操作系统。最后,本书还展望了接下来10年DIM-SUM操作系统的发展目标,希望最终其能发展为可以在服务器系统、桌面系统中实用的自研操作系统。
本书适合于对操作系统研发有兴趣的大学生、研究生,以及从事操作系统相关工作的一线工程师。对于Linux操作系统工程师,本书也极具实用价值。
中国人自己的迈向可用于生产环境的服务器操作系统!
谢宝友,曾任中兴嵌入式实时操作系统技术总工,该系统获第四届中国工业大奖;中兴通讯2010年度金银奖获得者;阿里集团2019年度安全生产之星金奖获得者;2018年和2019年阿里集团“双11”卓越贡献奖获得者;《深入理解并行编程》译者;Linux ZTE架构维护者;DIM-SUM自研操作系统发起者和创始人。
前 言

如果说DIM-SUM操作系统是一个完美的操作系统,那无疑是一个谎言。如果说DIM-SUM操作系统只是大家茶余饭后的谈资,那无疑是另一个谎言。
30年前,计算机逐渐进入公众的视野。笔者在使用DOS操作系统命令的时候,就对操作系统非常好奇,想搞清楚系统如何启动并响应输入的命令。于是在同学的帮助下,笔者将部分DOS操作系统文件进行了反汇编,通过阅读汇编代码的方式了解到一些操作系统的知识。
那时很难找到硬件相关的资料,也没有合适的操作系统设计方面的书。因此,笔者对操作系统的探索只能浅尝辄止。
但是,这并没有引起笔者对国内操作系统现状的担忧,因为笔者曾看到一则报道,从20世纪80年代中期开始,国内就有专家团队在系统性地研发国产操作系统、编译器这样的基础软件。我们只不过是落后一些时日,迟早会有自研操作系统问世的。
在20世纪90年代,Linux和BSD操作系统慢慢发展成为可用于生产的稳定操作系统。由于这些操作系统是开源的,所以在全球范围内得到了极大的普及,这也间接压缩了自研操作系统的生存空间。
另外,从20世纪80年代开始,自研的国产操作系统最终都失败了,国内工程技术人员和研究者纷纷开始基于Linux开展他们的工作。
进入21世纪以后,Linux在国内发展得如火如荼。虽然“核高基”项目仍然坚持在操作系统领域投入数十亿元人民币,但是从笔者亲身参与的操作系统项目来看,这些项目均以Linux为基础,严格来说,并不是从头开始自研的操作系统。
笔者对这样的现状深感忧心,在2010年就预测Android系统可能会走向封闭,或者限制国内厂商的使用。可惜业界同人对此不以为然,认为国内可以基于Android系统持续使用。
从目前的现状来看,谷歌公司已经开始限制国内厂商使用Android系统了。这进一步加深了笔者的担忧:如果某一天,我们不能免费使用基于Linux的这些开源操作系统,我们是否有替代操作系统可用?
正是这样的忧患意识,促使笔者潜心研究Linux开源操作系统。从2008年进入中兴通讯操作系统团队开始,在随后的6年时间内,笔者利用业余时间认真阅读了《深入理解Linux内核》、《深入理解Linux网络内幕》、《深入理解Linux虚拟内存管理》,以及其他一些与存储、网络相关的内核图书,并做了2200页、88万字的学习笔记,同时翻译并出版了《深入理解并行编程》一书。
在潜心研究Linux之时,笔者也尝试编写自研操作系统DIM-SUM,并在2018年完成了第一个版本:HOT-POT操作系统。业界同人亲切地将这个系统称为火锅操作系统。笔者是四川人,在成都生活了将近30年,对火锅有一种亲切感,因此将第一个版本命名为HOT-POT。
实际上,DIM-SUM仅仅是一个快速原型操作系统,它可以运行在ARM 64 的QEMU模拟器中。读者可以随便找一台机器,通过QEMU模拟器将它运行起来。在这个原型操作系统中,实现了同步与互斥、调度、内存、中断、定时器、块设备、文件系统模块,并且有一个简单的命令行控制台。虽然它的很多思想是借鉴Linux的,你甚至可以毫不留情地批评这个操作系统大量抄袭了Linux,但是笔者可以自豪地声称:DIM-SUM操作系统进行了重大的代码重构,同时也有不少原创的元素包含在里面。在一线工作的工匠程序员们应该会满含热泪地认同这项工作的艰辛。
本书详细阐述了自研操作系统DIM-SUM的设计与实现,提供了在ARM 64虚拟机中动手实践DIM-SUM及参与DIM-SUM开发的方法。本书也针对DIM-SUM操作系统的各个模块进行了详细的分析,包括这些模块的设计思路、数据结构定义、关键API说明。本书最大的特点是对各个模块的主要函数进行了逐行解释,这样有助于读者深刻理解如何实现一款实用的操作系统。
最后,本书还展望了接下来10年DIM-SUM操作系统的发展目标,希望最终将DIM-SUM发展成可以在服务器系统、桌面系统中实用的自研操作系统。
笔者不能妄言10年之后DIM-SUM会发展成什么样,但是希望借本书的出版,督促自己不忘初心,沿着自研操作系统的道路坚持走下去。
最后,笔者要表达的一个很重要的观点是:DIM-SUM不属于某一个公司,当然它更不是个人用来谋私的工具。
DIM-SUM是属于所有操作系统爱好者的!

谢宝友
2020年4月25日
于杭州

目录

目 录
第 1章 准备工作 1
1.1 DIM-SUM简介 1
1.2 DIM-SUM是什么 1
1.2.1 DIM-SUM的第一个版本为什么是HOT-POT 1
1.2.2 DIM-SUM欢迎什么 2
1.2.3 DIM-SUM不欢迎什么 3
1.3 获得源代码 3
1.3.1 通过网页下载源代码 3
1.3.2 通过Git获取源代码 3
1.4 搭建调试开发环境 4
1.4.1 安装ubuntu 16.04 4
1.4.2 ubuntu 16.04环境配置 5
1.4.3 搭建编译环境 6
1.4.4 编译HOT-POT 7
1.4.5 运行HOT-POT 8
1.4.6 开始调试 10
1.5 向DIM-SUM操作系统提交补丁 11
1.5.1 心态 11
1.5.2 准备工作 11
1.5.3 制作补丁 13
1.5.4 制作正确的补丁 14
1.5.5 发送补丁 16
1.6 获得帮助 17
1.7 提醒 17
第 2章 算法基础 18
2.1 链表 18
2.2 散列表 19
2.3 红黑树 20
2.4 基树 22


第 3章 计数与互斥同步 23
3.1 计数 23
3.1.1 计数的难题 24
3.1.2 精确计数器 24
3.1.3 近似计数器 27
3.1.4 引用计数 31
3.2 内核互斥原语 32
3.2.1 每CPU变量 32
3.2.2 自旋锁 38
3.2.3 自旋位锁 42
3.2.4 自旋顺序锁 44
3.2.5 自旋读/写锁 47
3.2.6 读/写信号量 50
3.2.7 互斥锁 56
3.3 内核同步原语 60
3.3.1 信号量的设计原理 60
3.3.2 信号量的数据结构 61
3.3. 3 信号量API 61
3.3.4 信号量的实现 62
第 4章 调度 65
4.1 基本概念 65
4.1.1 进程和线程 65
4.1.2 任务 66
4.1.3 任务抢占 66
4.1.4 idle线程 66
4.2 SMP CPU初始化 66
4.3 数据结构 71
4.3.1 线程 71
4.3.2 调度队列 76
4.3.3 杂项 77
4.4 调度子系统初始化 77
4.4.1 init_sched_early函数 78
4.4.2 init_idle_process函数 78
4.4.3 init_sched函数 79
4.5 线程调度 79
4.5.1 上下文切换 79
4.5.2 唤醒线程 82
4.6 高级调度API 85
4.6.1 等待队列 85
4.6.2 位等待队列 89
4.6.3 线程睡眠 93
4.6.4 消息队列 96
第 5章 中断及定时器 108
5.1 中断控制器初始化 108
5.1.1 主CPU中断控制器初始化 109
5.1.2 从CPU中断控制器初始化 110
5.2 中断控制器维护 110
5.2.1 中断号映射 110
5.2.2 逻辑中断的控制 113
5.2.3 设备中断处理函数 116
5.3 中断处理 119
5.3.1 序言 119
5.3.2 中断处理通用流程 120
5.3.3 处理外部设备中断 122
5.3.4 处理核间中断 126
5.3.5 软中断 126
5.3.6 尾声 126
5.4 工作队列 128
5.4.1 工作队列的数据结构 128
5.4.2 工作队列的全局变量 130
5.4.3 工作队列的API 130
5.4.4 工作队列的实现 131
5.5 定时器与时间管理 139
5.5.1 初始化 139
5.5.2 定时器的数据结构 139
5.5.3 定时器的全局变量 141
5.5.4 定时器的API 141
5.5.5 定时器的实现 141
5.5.6 定时器中断处理 144
5.5.7 时间管理 148
第 6章 内存管理 151
6.1 内存初始化 151
6.1.1 艰难地准备C运行环境 151
6.1.2 准备BOOT内存空间 152
6.1.3 物理内存块管理 152
6.1.4 早期设备内存映射 153
6.1.5 初始化每CPU变量 157
6.1.6 初始化线性映射 157
6.1.7 其他内存初始化工作 160
6.2 BOOT内存分配器 160
6.2.1 BOOT内存分配API 161
6.2.2 BOOT内存分配器的实现 161
6.2.3 BOOT内存分配器的销毁 163
6.3 页面编号 163
6.3.1 页面编号的数据结构 164
6.3.2 页面编号的全局变量 165
6.3.3 页面编号的API 165
6.3.4 页面编号的实现 165
6.4 页面分配器 168
6.4.1 页面分配器的设计原理 168
6.4.2 页面分配器的数据结构 169
6.4.3 页面分配器的全局变量 174
6.4.4 页面分配器的API 175
6.4.5 页面分配器的实现 176
6.4.6 页面分配器的初始化 192
6.5 Beehive内存分配器 193
6.5.1 Beehive内存分配器的设计原理 193
6.5.2 Beehive内存分配器的数据结构 195
6.5.3 Beehive内存分配器的全局变量 197
6.5.4 Beehive内存分配器的API 199
6.5.5 Beehive内存分配器的实现 199
6.5.6 Beehive内存分配器的初始化 214
6.6 I/O内存映射 216
第 7章 块设备 219
7.1 磁盘及其分区 220
7.1.1 磁盘及其分区的数据结构 220
7.1.2 磁盘及其分区的全局变量 222
7.1.3 磁盘及其分区的API 222
7.1.4 磁盘及其分区的实现 222
7.2 块设备维护 228
7.2.1 块设备的数据结构 228
7.2.2 块设备的全局变量 230
7.2.3 块设备的API 231
7.2.4 块设备的实现 231
7.3 I/O请求 242
7.3.1 I/O请求的数据结构 243
7.3.2 I/O请求的全局变量 250
7.3.3 I/O请求的API 250
7.3.4 I/O请求的实现 251
7.4 I/O调度 265
7.4.1 I/O调度的数据结构 265
7.4.2 I/O调度的全局变量 267
7.4.3 I/O调度的API 267
7.4.4 I/O调度的实现 268
第 8章 虚拟文件系统 271
8.1 挂载、卸载文件系统 271
8.1.1 挂载、卸载文件系统的数据结构 272
8.1.2 挂载、卸载文件系统的全局变量 277
8.1.3 挂载、卸载文件系统的API 278
8.1.4 挂载、卸载文件系统的实现 278
8.2 文件节点缓存 285
8.2.1 文件节点缓存的数据结构 286
8.2.2 文件节点缓存的全局变量 288
8.2.3 文件节点缓存的API 289
8.2.4 文件节点缓存的实现 290
8.3 打开、关闭文件 304
8.3.1 打开、关闭文件的数据结构 305
8.3.2 打开、关闭文件的全局变量 308
8.3.3 打开、关闭文件的API 309
8.3.4 打开、关闭文件的实现 309
8.4 读/写文件 319
8.4.1 读/写文件的数据结构 320
8.4.2 读/写文件的全局变量 323
8.4.3 读/写文件的API 323
8.4.4 读/写文件的实现 323
8.5 其他功能 337
第 9章 杂项文件系统 338
9.1 文件系统的挂载 338
9.1.1 第一次加载根文件系统 338
9.1.2 第二次加载根文件系统 340
9.2 内存文件系统 340
9.2.1 内存文件系统的数据结构 340
9.2.2 内存文件系统的全局变量 340
9.2.3 内存文件系统的API 341
9.2.4 内存文件系统的实现 341
9.3 设备文件系统 349
9.3.1 设备文件系统的数据结构 349
9.3.2 设备文件系统的全局变量 350
9.3.3 设备文件系统的API 351
9.3.4 设备文件系统的实现 351
第 10章 LEXT3文件系统 358
10.1 简介 358
10.1.1 超级块 359
10.1.2 块组描述符 359
10.1.3 块位图 360
10.1.4 文件节点位图 360
10.1.5 文件节点表 360
10.1.6 文件节点 360
10.1.7 文件日志 362
10.2 LEXT3 363
10.2.1 LEXT3的数据结构 363
10.2.2 LEXT3的全局变量 371
10.2.3 LEXT3的API 372
10.2.4 LEXT3的实现 373
10.3 文件系统日志 397
10.3.1 日志的数据结构 397
10.3.2 日志的全局变量 405
10.3.3 日志的API 405
10.3.4 日志的实现 406
第 11章 杂项 438
11.1 klibc 438
11.2 网络子系统 440
11.3 SIMPLE-KSHELL 440

读者评论

电子书版本

  • Epub

推荐用户

相关图书

看漫画学Python:有趣、有料、好玩、好用(全彩修订版)

ython是一门既简单又强大的编程语言,被广泛应用于数据分析、大数据、网络爬虫、自动化运维、科学计算和人工智能等领域。Python也越来越重要,成为国家计算机等...

 

Linux从入门到精通

张启玉 (作者)

本书以CentOS 7.8为演示系统,以阿里云为演示服务器,从Linux常用命令入手,从一毕业就要入职公司的上手要求出发,重实战、轻原理,目的就是要带领读者从一...

 

看漫画学Python 2:有趣、有料、好玩、好用(全彩进阶版)

关东升 ,赵大羽 (作者)

本书是《看漫画学Python》的进阶版本,继续秉承有趣、有料、好玩、好用的理念,并继续采用《看漫画学Python》一书中3个不同的漫画人物角色,通过这3个角色之...

 

趣玩Python:自动化办公真简单(双色+视频版)

本书以数据收集→数据清洗→数据分析→数据可视化→根据数据可视化结果(即图表)做决策为脉络,介绍Python在实际工作场景中的应用,侧重于用Python解决工作中...

 

软件交付通识

董越 (作者)

软件交付过程是指在编程序改代码之后,直到将软件发布给用户使用之前的一系列活动,如提交、集成、构建、部署、测试等。本书作为通识类图书,对软件交付过程的各个方面进行...

¥89.00

Python一行流:像专家一样写代码

Christian Mayer (作者) 苏丹 (译者)

本书专注于从初学迈向进阶的Python编码技术:如何像专家一样写出优雅、准确、简洁高效的Python 单行代码;阅读任意一行Python 代码时,如何系统性地对...

¥89.00