网站颜色:

多省包邮 操作系统 真象还原 操作系统真相还原


书名:操作系统真象还原

原价:108.(咨询特价)

作者:郑钢 著

出版社:人民邮电出版社

出版日期:2016-(咨询特价)

ISBN(咨询特价)

字数:

页码:759

版次:01

装帧:平装

开本:16开

 

前度高级工程师精心写作。操作系统并不深奥,本书给予解读。
历时19个月,行文60余字,用6000多行代码实现了一个完整的操作系统。
彻底剖析操作系统的原理,实现内核线程、特权级变换、用户进程、任务调度、文件系统等操作系统基本的组成单。
用实际代码解释了锁、信号量、生产者消费者问题。
实现了shell,帮助大家理解内部命令、外部命令、管道等操作。
本书用诙谐幽默的语言,把深奥的操作系统尽量讲解清楚,读者在轻松阅读中就学通了深奥的知识,学完后不但明白了操作系统,读者可以轻松自制一个操作系统,是一本难得的好书。
本书适合操作系统快速入门并希望快速提高的读者、具备一定基础、但不能灵活运用的读者、也适用于那些已经在操作系统领域有一定造诣、但依然存在误用的读者
绝大多数技术人都对操作系统怀着好奇的心,他们渴望一本告诉操作系统到底是什么的书,里面不要掺杂太多无关的管理性的东西,代码量不大且是现代操作系统雏形,渴望很快看到操作系统的本质而不花费大量的时间成本。操作系统并不深奥,本书给予解读。

 

本书共分16章,讲解了开发一个操作系统需要的技术和知识,主要内容有:操作系统基础、部署工作环境、编写MBR主引导记录、完善MBR错误、保护模式入门、保护模式进阶和向内核迈进、中断、内存管理系统、线程、输入输出系统、用户进程、完善内核、编写硬盘驱动程序、文件系统、系统交互等核心技术。
本书适合程序员、系统底层开发人员、操作系统爱好者阅读,也可作为大专院校相关专业师生用书和培训学校的教材。

 

第0章 一些你可能正感到迷惑的问题t1
0.1 操作系统是什么t1
0.2 你想研究到什么程度t2
0.3 写操作系统,哪些需要我来做t2
0.4 软件是如何访问硬件的t2
0.5 应用程序是什么,和操作系统是如何
配合到一起的t3
0.6 为什么称为“陷入”内核t4
0.7 内存访问为什么要分段t4
0.8 代码中为什么分为代码段、数据段?
这和内存访问机制中的段是一回事吗t6
0.9 物理地址、逻辑地址、有效地址、线性
地址、虚拟地址的区别t11
0.10 什么是段重叠t12
0.11 什么是平坦模型t12
0.12 cs、ds这类sreg段寄存器,位宽是
多少t12
0.13 什么胜程,什么是协议t13
0.14 为什么Linux系统下的应用程序不能在
Windos系统下运行t14
0.15 局部变量和函数参数为什么要放在
栈中t14
0.16 为什么说汇编语言比C语言快t15
0.17 先有的语言,还是先有的编译器,第1个
编译器是怎么产生的t16
0.18 编译型程序与解释型程序的区别t19
0.19 什么是大端字节序、小端字节序t19
0.20 BIOS中断、DOS中断、Linux中断的
区别t21
0.21 Section和Segment的区别t25
0.22 什么是魔数t29
0.23 操作系统是如何识别文件系统的t30
0.24 如何控制CPU的下一条指令t30
0.25 指令集、体系结构、微架构、编程
语言t30
0.26 库函数是用户进程与内核的桥梁t33
0.27 转义字符与ASCII码t37
0.28 MBR、EBR、DBR和OBR各是
什么t39
第1章 部署工作环境t42
1.1 工欲善其事,必先利其器t42
1.2 我们需要哪些编译器t42
1.2.1 世界编译器GCCt42
1.2.2 汇编语言编译器新贵NASMt43
1.3 操作系统的宿主环境t43
1.3.1 什么是虚拟机t44
1.3.2 盗梦空间般的开发环境,虚拟机
中再装一个虚拟机t45
1.3.3 virtualBox下载,安装t46
1.3.4 Linux发行版下载t46
1.3.5 Bochs下载安装t46
1.4 配置bochst48
1.5 运行bochst49
第2章 编写MBR主引导记录,让我们开始
掌权t52
2.1 计算机的启动过程t52
2.2 软件接力棒,BIOSt52
2.2.1 实模式下的1MB内存布局t52
2.2.2 BIOS是如何苏醒的t54
2.2.3 为什么是0x7c(咨询特价)
2.3 让MBR先飞一会儿t58
2.3.1 神奇好用的$和$$,令人迷惑的
sectiont58
2.3.2 NASM简单用法t60
2.3.3 请下一位选手MBR同学做
准备t60
第3章 完善MBRt65
3.1 地址、section、vstart浅尝辄止t65
3.1.1 什么是地址t65
3.1.2 什么是sectiont67
3.1.3 什么是vstartt68
3.2 CPU的实模式t70
3.2.1 CPU的工作原理t71
3.2.2 实模式下的寄存器t72
3.2.3 实模式下内存分段由来t76
3.2.4 实模式下CPU内存寻址方式t78
3.2.5 栈到底是什么玩意儿t81
3.2.6 实模式下的rett84
3.2.7 实模式下的callt85
3.2.8 实模式下的jmpt92
3.2.9 标志寄存器flagst97
3.2.10 有条件转移t99
3.2.11 实模式小结t101
3.3 让我们直接对显示器说点什么吧t101
3.3.1 CPU如何与外设通信—IO
接口t101
3.3.2 显卡概述t105
3.3.3 显存、显卡、显示器t106
3.3.4 改进MBR,直接操作显卡t110
3.4 bochs调试方法t112
3.4.1 bochs一般用法t113
3.4.2 bochs调试实例t118
3.5 硬盘介绍t122
3.5.1 硬盘发展简史t122
3.5.2 硬盘工作原理t123
3.5.3 硬盘控制器端口t126
3.5.4 常用的硬盘操作方法t128
3.6 让MBR使用硬盘t129
3.6.1 改造MBRt130
3.6.2 实现内核加载器t134
第4章 保护模式入门t136
4.1 保护模式概述t136
4.1.1 为什么要有保护模式t136
4.1.2 实模式不是32位CPU,变成了
16位t137
4.2 初见保护模式t137
4.2.1 保护模式之寄存器扩展t137
4.2.2 保护模式之寻址扩展t140
4.2.3 保护模式之运行模式反转t141
4.2.4 保护模式之指令扩展t145
4.3 全局描述符表t150
4.3.1 段描述符t150
4.3.2 全局描述符表GDT、局部描述
符表LDT及选择子t155
4.3.3 打开A20地址线t157
4.3.4 保护模式的开关,CR0寄存器的
PE位t158
4.3.5 让我们进入保护模式t158
4.4 处理器微架构简介t165
4.4.1 流水线t166
4.4.2 乱序执行t168
4.4.3 缓存t168
4.4.4 分支预测t169
4.5 使用远跳转指令清空流水线,更新段描述
符缓冲寄存器t172
4.6 保护模式之内存段的保护t173
4.6.1 向段寄存器加载选择子时的
保护t173
4.6.2 代码段和数据段的保护t174
4.6.3 栈段的保护t175
第5章 保护模式进阶,向内核迈进t177
5.1 获取物理内存容量t177
5.1.1 学习Linux获取内存的方法t177
5.1.2 利用BIOS中断0x15子功能
0xe820获取内存t177
5.1.3 利用BIOS中断0x15子功能
0xe801获取内存t179
5.1.4 利用BIOS中断0x15子功能
(咨询特价)获取内存t180
5.1.5 实战内存容量检测t181
5.2 启用内存分页机制,畅游虚拟空间t186
5.2.1 内存为什么要分页t186
5.2.2 一级页表t188
5.2.3 二级页表t192
5.2.4 规划页表之操作系统与用户
进程的关系t197
5.2.5 启用分页机制t198
5.2.6 用虚拟地址访问页表t204
5.2.7 快表TLB(TranslatioLookaside
Buffer)简介t206
5.3 加载内核t207
5.3.1 用C语言写内核t207
5.3.2 二进制程序的运行方法t211
5.3.3 elf格式的二进制文件t213
5.3.4 elf文件实例分析t218
5.3.5 将内核载入内存t222
5.4 特权级深入浅出t229
5.4.1 特权级那点事t229
5.4.2 TSS简介t230
5.4.3 CPL和DPL入门t232
5.4.4 门、调用门与RPL序t235
5.4.5 调用门的过程保护t240
5.4.6 RPL的前世今生t243
5.4.7 IO特权级t248
第6章 完善内核t252
6.1 函数调用约定简介t252
6.2 汇编语言和C语言混合编程t256
6.2.1 浅析C库函数与系统调用t256
6.2.2 汇编语言和C语言共同协作t259
6.3 实现自己的打印函数t261
6.3.1 显卡的端口控制t261
6.3.2 实现单个字符打印t265
6.3.3 实现字符串打印t275
6.3.4 实现整数打印t277
6.4 内联汇编t281
6.4.1 什么是内联汇编t281
6.4.2 汇编语言AT&T语法简介t281
6.4.3 基本内联汇编t283
6.4.4 扩展内联汇编t284
6.4.5 扩展内联汇编之机器模式简介t294
第7章 中断t298
7.1 中断是什么,为什么要有中断t298
7.2 操作系统是中断驱动的t299
7.3 中断分类t299
7.3.1 外部中断t299
7.3.2 内部中断t301
7.4 中断描述符表t304
7.4.1 中断处理过程及保护t306
7.4.2 中断发生时的压栈t308
7.4.3 中断错误码t310
7.5 可编程中断控制器8259At311
7.5.1 8259A介绍t311
7.5.2 8259A的编程t314
7.6 编写中断处理程序t319
7.6.1 从最简单的中断处理程序
开始t319
7.6.2 改进中断处理程序t335
7.6.3 调试实蘸处理器进入中断时
压栈出栈完整过程t339
7.7 可编程计数器/定时器8253简介t346
7.7.1 时钟—给设备打拍子t346
7.7.2 8253入门t348
7.7.3 8253控制字t349
7.7.4 8253工作方式t350
7.7.5 8253初始化步骤t353
7.8 提高时钟中断的频率,让中断来得更
猛烈一些t354
第8章 内存管理系统t357
8.1 makefile简介t357
8.1.1 makefile是什么t357
8.1.2 makefile基本语法t358
8.1.3 跳到目标处执行t360
8.1.4 伪目标t361
8.1.5 make:递归式推导目标t362
8.1.6 自定义变量与系统变量t363
8.1.7 隐含规则t365
8.1.8 自动化变量t366
8.1.9 模式规则t367
8.2 实现assert断言t367
8.2.1 实现开、关中断的函数t367
8.2.2 实现ASSERTt370
8.2.3 通过makefile来编译t372
8.3 实现字符串操作函数t374
8.4 位图bitmap及其函数的实现t377
8.4.1 位图简介t377
8.4.2 位图的定义与实现t378
8.5 内存管理系统t381
8.5.1 内存池规划t381
8.5.2 内存管理系统铂分配页
内存t388
第9章 线程t398
9.1 实现内核线程t398
9.1.1 执行流t398
9.1.2 线程到底是什么t399
9.1.3 进程与线程的关系、区别简述t402
9.1.4 进程、线程的状态t405
9.1.5 进程的—PCBt405
9.1.6 实现线程的两种方式—内核或
用户进程t406
9.2 在内核空间实现线程t409
9.2.1 简单的PCB及线程栈的实现t409
9.2.2 线程的实现t413
9.3 核心数据结构,双向链表t417
9.4 多线程调度t421
9.4.1 简单优先级调度的基础t421
9.4.2 任务调度器和任务切换t425
第10章 输入输出系统t439
10.1 同步机制——锁t439
10.1.1 排查GP异常,理解原子操作t439
10.1.2 找出代码中的临界区、互斥、
竞争条件t444
10.1.3 信号量t445
10.1.4 线程的阻塞与唤醒t447
10.1.5 锁的实现t449
10.2 用锁实现终端输出t452
10.3 从键盘获取输入t456
10.3.1 键盘输入原理简介t456
10.3.2 键盘扫描码t457
10.3.3 8042简介t463
10.3.4 测试键盘中断处理程序t465
10.4 编写键盘驱动t468
10.4.1 转义字符介绍t468
10.4.2 处理扫描码t469
10.5 环形输入缓冲区t476
10.5.1 生产者与消费者问题简述t476
10.5.2 环形缓冲区的实现t478
10.5.3 添加键盘输入缓冲区t481
10.5.4 生产者与消费者实例测试t482
第11章 用户进程t485
11.1 为什么要有任务状态段TSSt485
11.1.1 多任务的起源,很久很久
以前…… t485
11.1.2 LDT简介t486
11.1.3 TSS的作用t488
11.1.4 CPU原生支持的任务切换
方式t492
11.1.5 现代操作系统采用的任务
切换方式t495
11.2 定义并初始化TSSt497
11.3 实现用户进程t501
11.3.1 实现用户进程的原理t501
11.3.2 用户进程的虚拟地址空间t501
11.3.3 为进程创建页表和3特权
级栈t502
11.3.4 进入特权级3t505
11.3.5 用户进程创建的流程t506
11.3.6 实现用户进程—上t507
11.3.7 bss简介t513
11.3.8 实现用户进程—下t515
11.3.9 让进程跑起来—用户进程的
调度t519
11.3.10 测试用户进程t520
第12章 进一步完善内核t523
12.1 Linux系统调用浅析t523
12.2 系统调用的实现t527
12.2.1 系统调用实现框架t527
12.2.2 增加0x80号中断描述符t527
12.2.3 实现系统调用接口t528
12.2.4 增加0x80号中断处理例程t528
12.2.5 初始化系统调用和实现
sys_getpidt530
12.2.6 添加系统调用getpidt531
12.2.7 在用户进程中的系统调用t532
12.2.8 系统调用之栈传递参数t534
12.3 让用户进程“说话”t536
12.3.1 可变参数的原理t536
12.3.2 实现系统调用ritet538
12.3.3 实现printft539
12.3.4 完善printft542
12.4 完善堆内存管理t545
12.4.1 malloc底层原理t545
12.4.2 底层初始化t548
12.4.3 实现sys_malloct550
12.4.4 内存的释放t555
12.4.5 实现sys_freet558
12.4.6 实现系统调用malloc和freet562
第13章 编写硬盘驱动程序t566
13.1 硬盘及分区表t566
13.1.1 创建从盘及获取安装的
磁盘数t566
13.1.2 创建磁盘分区表t567
13.1.3 磁盘分区表浅析t571
13.2 编写硬盘驱动程序t578
13.2.1 硬盘初始化t578
13.2.2 实现thread_yield和idle线程t582
13.2.3 实现简单的休眠函数t584
13.2.4 完善硬盘驱动程序t585
13.2.5 获取硬盘信息,扫描分区表t590
第14章 文件系统t595
14.1 文件系统概念简介t595
14.1.1 inode、间接块索引表、文件
控制块FCB简介t595
14.1.2 目录项与目录简介t597
14.1.3 超级块与文件系统布局t599
14.2 创建文件系统t601
14.2.1 创建超级块、i结点、目录项t601
14.2.2 创建文件系统t603
14.2.3 挂载分区t609
14.3 文件描述符简介t612
14.3.1 文件描述符原理t612
14.3.2 文件描述符的实现t614
14.4 文件操作相关的基础函数t615
14.4.1 inode操作有关的函数t616
14.4.2 文件相关的函数t620
14.4.3 目录相关的函数t623
14.4.4 路径解析相关的函数t628
14.4.5 实现文件检索功能t630
14.5 创建文件t633
14.5.1 实现file_createt633
14.5.2 实现sys_opent636
14.5.3 在文件系统上创建第1个
文件t639
14.6 文件的打开与关闭t640
14.6.1 文件的打开t640
14.6.2 文件的关闭t642
14.7 实现文件写入t643
14.7.1 实现file_ritet643
14.7.2 改进sys_rite及rite系统
调用t648
14.7.3 把数据写入文件t650
14.8 读取文件t651
14.8.1 实现file_readt651
14.8.2 实现sys_read与功能验证t653
14.9 实现文件读写指针定位功能t655
14.10 实现文件删除功能t657
14.10.1 回收inodet657
14.10.2 删除目录项t660
14.10.3 实现sys_unlink与功能验证t663
14.11 创建目录t665
14.11.1 实现sys_mkdir创建目录t666
14.11.2 创建目录功能验证t669
14.12 遍历目录t671
14.12.1 打开目录和关闭目录t671
14.12.2 读取1个目录项t673
14.12.3 实现sys_readdir及sys_
reinddirt674
14.13 删除目录t676
14.13.1 删除目录与判断空目录t676
14.13.2 实现sys_rmdir及功能验证t677
14.14 任务的工作目录t679
14.14.1 显示当前工作目录的原理及
基础代码t679
14.14.2 实现sys_getcdt681
14.14.3 实现sys_chdir改变工作目录t683
14.15 获得文件属性t684
14.15.1 ls命令的幕后功臣t684
14.15.2 实现sys_statt685
第15章 系统交互t687
15.1 fork的原理与实现t687
15.1.1 什么是forkt687
15.1.2 fork的实现t689
15.1.3 添加fork系统调用与实现init
进程t695
15.2 添加read系统调用,获取键盘输入t696
15.3 添加putchar、clear系统调用t697
15.4 实现一个简单的shellt699
15.4.1 shell雏形t699
15.4.2 添加Ctrl+u和Ctrl+l快捷键t701
15.4.3 解析键入的字符t703
15.4.4 添加系统调用t705
15.4.5 路径解析转换t708
15.4.6 实现ls、cd、mkdir、ps、rm等
命令t712
15.5 加载用户进程t717
15.5.1 实现exect717
15.5.2 让shell支持外部命令t723
15.5.3 加载硬盘上的用户程序执行t724
15.5.4 使用户进程支持参数t727
15.6 实现系统调用ait和exitt731
15.6.1 ait和exit的作用t731
15.6.2 孤儿进程和僵尸进程t732
15.6.3 一些基础代码t733
15.6.4 实现ait和exitt737
15.6.5 实现cat命令t741
15.7 管道t745
15.7.1 管道的原理t745
15.7.2 管道的设计t747
15.7.3 管道的实现t748
15.7.4 利用管道实现进程间通信t752
15.7.5 在shell中支持管道t754
参考文献t760

 

郑钢,毕业于北京大学,前度运维高级工程师,对操作系统有深入的研究。好运动,喜钻研,热衷于尝试前沿技术,乐于分享学习成果。

热门设计服务