操作系统真象还原
¥
54
5.0折
¥
108
全新
仅1件
作者郑钢 著
出版社人民邮电出版社
出版时间2016-03
版次1
装帧平装
上书时间2024-08-21
商品详情
- 品相描述:全新
图书标准信息
-
作者
郑钢 著
-
出版社
人民邮电出版社
-
出版时间
2016-03
-
版次
1
-
ISBN
9787115414342
-
定价
108.00元
-
装帧
平装
-
开本
16开
-
纸张
胶版纸
-
页数
759页
-
字数
1281千字
-
正文语种
简体中文
- 【内容简介】
-
本书共分16章,讲解了开发一个操作系统需要的技术和知识,主要内容有:操作系统基础、部署工作环境、编写MBR主引导记录、完善MBR错误、保护模式入门、保护模式进阶和向内核迈进、中断、内存管理系统、线程、输入输出系统、用户进程、完善内核、编写硬盘驱动程序、文件系统、系统交互等核心技术。
本书适合程序员、系统底层开发人员、操作系统爱好者阅读,也可作为大专院校相关专业师生用书和培训学校的教材。
- 【作者简介】
-
郑钢,毕业于北京大学,前百度运维高级工程师,对操作系统有深入的研究。好运动,喜钻研,热衷于尝试前沿技术,乐于分享学习成果。
- 【目录】
-
第0章一些你可能正感到迷惑的问题1
0.1操作系统是什么1
0.2你想研究到什么程度2
0.3写操作系统,哪些需要我来做2
0.4软件是如何访问硬件的2
0.5应用程序是什么,和操作系统是如何
配合到一起的3
0.6为什么称为“陷入”内核4
0.7内存访问为什么要分段4
0.8代码中为什么分为代码段、数据段?
这和内存访问机制中的段是一回事吗6
0.9物理地址、逻辑地址、有效地址、线性
地址、虚拟地址的区别11
0.10什么是段重叠12
0.11什么是平坦模型12
0.12cs、ds这类sreg段寄存器,位宽是
多少12
0.13什么是工程,什么是协议13
0.14为什么Linux系统下的应用程序不能在
Windows系统下运行14
0.15局部变量和函数参数为什么要放在
栈中14
0.16为什么说汇编语言比C语言快15
0.17先有的语言,还是先有的编译器,第1个
编译器是怎么产生的16
0.18编译型程序与解释型程序的区别19
0.19什么是大端字节序、小端字节序19
0.20BIOS中断、DOS中断、Linux中断的
区别21
0.21Section和Segment的区别25
0.22什么是魔数29
0.23操作系统是如何识别文件系统的30
0.24如何控制CPU的下一条指令30
0.25指令集、体系结构、微架构、编程
语言30
0.26库函数是用户进程与内核的桥梁33
0.27转义字符与ASCII码37
0.28MBR、EBR、DBR和OBR各是
什么39
第1章部署工作环境42
1.1工欲善其事,必先利其器42
1.2我们需要哪些编译器42
1.2.1世界顶级编译器GCC42
1.2.2汇编语言编译器新贵NASM43
1.3操作系统的宿主环境43
1.3.1什么是虚拟机44
1.3.2盗梦空间般的开发环境,虚拟机
中再装一个虚拟机45
1.3.3virtualBox下载,安装46
1.3.4Linux发行版下载46
1.3.5Bochs下载安装46
1.4配置bochs48
1.5运行bochs49
第2章编写MBR主引导记录,让我们开始
掌权52
2.1计算机的启动过程52
2.2软件接力第一棒,BIOS52
2.2.1实模式下的1MB内存布局52
2.2.2BIOS是如何苏醒的54
2.2.3为什么是0x7c0056
2.3让MBR先飞一会儿58
2.3.1神奇好用的$和$$,令人迷惑的
section58
2.3.2NASM简单用法60
2.3.3请下一位选手MBR同学做
准备60
第3章完善MBR65
3.1地址、section、vstart浅尝辄止65
3.1.1什么是地址65
3.1.2什么是section67
3.1.3什么是vstart68
3.2CPU的实模式70
3.2.1CPU的工作原理71
3.2.2实模式下的寄存器72
3.2.3实模式下内存分段由来76
3.2.4实模式下CPU内存寻址方式78
3.2.5栈到底是什么玩意儿81
3.2.6实模式下的ret84
3.2.7实模式下的call85
3.2.8实模式下的jmp92
3.2.9标志寄存器flags97
3.2.10有条件转移99
3.2.11实模式小结101
3.3让我们直接对显示器说点什么吧101
3.3.1CPU如何与外设通信—IO
接口101
3.3.2显卡概述105
3.3.3显存、显卡、显示器106
3.3.4改进MBR,直接操作显卡110
3.4bochs调试方法112
3.4.1bochs一般用法113
3.4.2bochs调试实例118
3.5硬盘介绍122
3.5.1硬盘发展简史122
3.5.2硬盘工作原理123
3.5.3硬盘控制器端口126
3.5.4常用的硬盘操作方法128
3.6让MBR使用硬盘129
3.6.1改造MBR130
3.6.2实现内核加载器134
第4章保护模式入门136
4.1保护模式概述136
4.1.1为什么要有保护模式136
4.1.2实模式不是32位CPU,变成了
16位137
4.2初见保护模式137
4.2.1保护模式之寄存器扩展137
4.2.2保护模式之寻址扩展140
4.2.3保护模式之运行模式反转141
4.2.4保护模式之指令扩展145
4.3全局描述符表150
4.3.1段描述符150
4.3.2全局描述符表GDT、局部描述
符表LDT及选择子155
4.3.3打开A20地址线157
4.3.4保护模式的开关,CR0寄存器的
PE位158
4.3.5让我们进入保护模式158
4.4处理器微架构简介165
4.4.1流水线166
4.4.2乱序执行168
4.4.3缓存168
4.4.4分支预测169
4.5使用远跳转指令清空流水线,更新段描述
符缓冲寄存器172
4.6保护模式之内存段的保护173
4.6.1向段寄存器加载选择子时的
保护173
4.6.2代码段和数据段的保护174
4.6.3栈段的保护175
第5章保护模式进阶,向内核迈进177
5.1获取物理内存容量177
5.1.1学习Linux获取内存的方法177
5.1.2利用BIOS中断0x15子功能
0xe820获取内存177
5.1.3利用BIOS中断0x15子功能
0xe801获取内存179
5.1.4利用BIOS中断0x15子功能
0x88获取内存180
5.1.5实战内存容量检测181
5.2启用内存分页机制,畅游虚拟空间186
5.2.1内存为什么要分页186
5.2.2一级页表188
5.2.3二级页表192
5.2.4规划页表之操作系统与用户
进程的关系197
5.2.5启用分页机制198
5.2.6用虚拟地址访问页表204
5.2.7快表TLB(TranslationLookaside
Buffer)简介206
5.3加载内核207
5.3.1用C语言写内核207
5.3.2二进制程序的运行方法211
5.3.3elf格式的二进制文件213
5.3.4elf文件实例分析218
5.3.5将内核载入内存222
5.4特权级深入浅出229
5.4.1特权级那点事229
5.4.2TSS简介230
5.4.3CPL和DPL入门232
5.4.4门、调用门与RPL序235
5.4.5调用门的过程保护240
5.4.6RPL的前世今生243
5.4.7IO特权级248
第6章完善内核252
6.1函数调用约定简介252
6.2汇编语言和C语言混合编程256
6.2.1浅析C库函数与系统调用256
6.2.2汇编语言和C语言共同协作259
6.3实现自己的打印函数261
6.3.1显卡的端口控制261
6.3.2实现单个字符打印265
6.3.3实现字符串打印275
6.3.4实现整数打印277
6.4内联汇编281
6.4.1什么是内联汇编281
6.4.2汇编语言AT&T语法简介281
6.4.3基本内联汇编283
6.4.4扩展内联汇编284
6.4.5扩展内联汇编之机器模式简介294
第7章中断298
7.1中断是什么,为什么要有中断298
7.2操作系统是中断驱动的299
7.3中断分类299
7.3.1外部中断299
7.3.2内部中断301
7.4中断描述符表304
7.4.1中断处理过程及保护306
7.4.2中断发生时的压栈308
7.4.3中断错误码310
7.5可编程中断控制器8259A311
7.5.18259A介绍311
7.5.28259A的编程314
7.6编写中断处理程序319
7.6.1从最简单的中断处理程序
开始319
7.6.2改进中断处理程序335
7.6.3调试实战:处理器进入中断时
压栈出栈完整过程339
7.7可编程计数器/定时器8253简介346
7.7.1时钟—给设备打拍子346
7.7.28253入门348
7.7.38253控制字349
7.7.48253工作方式350
7.7.58253初始化步骤353
7.8提高时钟中断的频率,让中断来得更
猛烈一些354
第8章内存管理系统357
8.1makefile简介357
8.1.1makefile是什么357
8.1.2makefile基本语法358
8.1.3跳到目标处执行360
8.1.4伪目标361
8.1.5make:递归式推导目标362
8.1.6自定义变量与系统变量363
8.1.7隐含规则365
8.1.8自动化变量366
8.1.9模式规则367
8.2实现assert断言367
8.2.1实现开、关中断的函数367
8.2.2实现ASSERT370
8.2.3通过makefile来编译372
8.3实现字符串操作函数374
8.4位图bitmap及其函数的实现377
8.4.1位图简介377
8.4.2位图的定义与实现378
8.5内存管理系统381
8.5.1内存池规划381
8.5.2内存管理系统第一步,分配页
内存388
第9章线程398
9.1实现内核线程398
9.1.1执行流398
9.1.2线程到底是什么399
9.1.3进程与线程的关系、区别简述402
9.1.4进程、线程的状态405
9.1.5进程的身份证—PCB405
9.1.6实现线程的两种方式—内核或
用户进程406
9.2在内核空间实现线程409
9.2.1简单的PCB及线程栈的实现409
9.2.2线程的实现413
9.3核心数据结构,双向链表417
9.4多线程调度421
9.4.1简单优先级调度的基础421
9.4.2任务调度器和任务切换425
第10章输入输出系统439
10.1同步机制——锁439
10.1.1排查GP异常,理解原子操作439
10.1.2找出代码中的临界区、互斥、
竞争条件444
10.1.3信号量445
10.1.4线程的阻塞与唤醒447
10.1.5锁的实现449
10.2用锁实现终端输出452
10.3从键盘获取输入456
10.3.1键盘输入原理简介456
10.3.2键盘扫描码457
10.3.38042简介463
10.3.4测试键盘中断处理程序465
10.4编写键盘驱动468
10.4.1转义字符介绍468
10.4.2处理扫描码469
10.5环形输入缓冲区476
10.5.1生产者与消费者问题简述476
10.5.2环形缓冲区的实现478
10.5.3添加键盘输入缓冲区481
10.5.4生产者与消费者实例测试482
第11章用户进程485
11.1为什么要有任务状态段TSS485
11.1.1多任务的起源,很久很久
以前……485
11.1.2LDT简介486
11.1.3TSS的作用488
11.1.4CPU原生支持的任务切换
方式492
11.1.5现代操作系统采用的任务
切换方式495
11.2定义并初始化TSS497
11.3实现用户进程501
11.3.1实现用户进程的原理501
11.3.2用户进程的虚拟地址空间501
11.3.3为进程创建页表和3特权
级栈502
11.3.4进入特权级3505
11.3.5用户进程创建的流程506
11.3.6实现用户进程—上507
11.3.7bss简介513
11.3.8实现用户进程—下515
11.3.9让进程跑起来—用户进程的
调度519
11.3.10测试用户进程520
第12章进一步完善内核523
12.1Linux系统调用浅析523
12.2系统调用的实现527
12.2.1系统调用实现框架527
12.2.2增加0x80号中断描述符527
12.2.3实现系统调用接口528
12.2.4增加0x80号中断处理例程528
12.2.5初始化系统调用和实现
sys_getpid530
12.2.6添加系统调用getpid531
12.2.7在用户进程中的系统调用532
12.2.8系统调用之栈传递参数534
12.3让用户进程“说话”536
12.3.1可变参数的原理536
12.3.2实现系统调用write538
12.3.3实现printf539
12.3.4完善printf542
12.4完善堆内存管理545
12.4.1malloc底层原理545
12.4.2底层初始化548
12.4.3实现sys_malloc550
12.4.4内存的释放555
12.4.5实现sys_free558
12.4.6实现系统调用malloc和free562
第13章编写硬盘驱动程序566
13.1硬盘及分区表566
13.1.1创建从盘及获取安装的
磁盘数566
13.1.2创建磁盘分区表567
13.1.3磁盘分区表浅析571
13.2编写硬盘驱动程序578
13.2.1硬盘初始化578
13.2.2实现thread_yield和idle线程582
13.2.3实现简单的休眠函数584
13.2.4完善硬盘驱动程序585
13.2.5获取硬盘信息,扫描分区表590
第14章文件系统595
14.1文件系统概念简介595
14.1.1inode、间接块索引表、文件
控制块FCB简介595
14.1.2项与简介597
14.1.3超级块与文件系统布局599
14.2创建文件系统601
14.2.1创建超级块、i结点、项601
14.2.2创建文件系统603
14.2.3挂载分区609
14.3文件描述符简介612
14.3.1文件描述符原理612
14.3.2文件描述符的实现614
14.4文件操作相关的基础函数615
14.4.1inode操作有关的函数616
14.4.2文件相关的函数620
14.4.3相关的函数623
14.4.4路径解析相关的函数628
14.4.5实现文件检索功能630
14.5创建文件633
14.5.1实现file_create633
14.5.2实现sys_open636
14.5.3在文件系统上创建第1个
文件639
14.6文件的打开与关闭640
14.6.1文件的打开640
14.6.2文件的关闭642
14.7实现文件写入643
14.7.1实现file_write643
14.7.2改进sys_write及write系统
调用648
14.7.3把数据写入文件650
14.8读取文件651
14.8.1实现file_read651
14.8.2实现sys_read与功能验证653
14.9实现文件读写指针定位功能655
14.10实现文件删除功能657
14.10.1回收inode657
14.10.2删除项660
14.10.3实现sys_unlink与功能验证663
14.11创建665
14.11.1实现sys_mkdir创建666
14.11.2创建功能验证669
14.12遍历671
14.12.1打开和关闭671
14.12.2读取1个项673
14.12.3实现sys_readdir及sys_
rewinddir674
14.13删除676
14.13.1删除与判断空676
14.13.2实现sys_rmdir及功能验证677
14.14任务的工作679
14.14.1显示当前工作的原理及
基础代码679
14.14.2实现sys_getcwd681
14.14.3实现sys_chdir改变工作683
14.15获得文件属性684
14.15.1ls命令的幕后功臣684
14.15.2实现sys_stat685
第15章系统交互687
15.1fork的原理与实现687
15.1.1什么是fork687
15.1.2fork的实现689
15.1.3添加fork系统调用与实现init
进程695
15.2添加read系统调用,获取键盘输入696
15.3添加putchar、clear系统调用697
15.4实现一个简单的shell699
15.4.1shell雏形699
15.4.2添加Ctrl+u和Ctrl+l快捷键701
15.4.3解析键入的字符703
15.4.4添加系统调用705
15.4.5路径解析转换708
15.4.6实现ls、cd、mkdir、ps、rm等
命令712
15.5加载用户进程717
15.5.1实现exec717
15.5.2让shell支持外部命令723
15.5.3加载硬盘上的用户程序执行724
15.5.4使用户进程支持参数727
15.6实现系统调用wait和exit731
15.6.1wait和exit的作用731
15.6.2孤儿进程和僵尸进程732
15.6.3一些基础代码733
15.6.4实现wait和exit737
15.6.5实现cat命令741
15.7管道745
15.7.1管道的原理745
15.7.2管道的设计747
15.7.3管道的实现748
15.7.4利用管道实现进程间通信752
15.7.5在shell中支持管道754
参考文献760
点击展开
点击收起
— 没有更多了 —
以下为对购买帮助不大的评价