书籍详情
Linux源码趣读
作者:闪客
出版社:电子工业出版社
出版时间:2023-09-01
ISBN:9787121462870
定价:¥158.00
购买这本书可以去
内容简介
用读一本小说的心态来阅读本书,你会对整个操作系统的体系结构和逻辑细节有非常清晰的认识,从此爱上并阅读更多的操作系统源码。第1部分:进入内核前的苦力活。覆盖从开机到运行到Linux中的main函数的关键流程解析,帮你清晰认识Intel CPU的体系结构。第2部分:“大战”前期的初始化工作。讲述main中的各种初始化函数,这些函数是操作系统各个模块的交互桥梁,为理解后续操作系统各个模块的运作原理打好基础。第3部分:一个新进程的诞生。讲述从内核态切换至用户态,并建立起第一个用户进程的全部过程。学完这部分,你将会理解一个多进程的操作系统是如何建立和运作的。第4部分:shell程序的到来。主要讨论如何将磁盘中存储的shell程序加载到内存中来,并最终交给CPU去执行。通过这个过程你会看清一个程序从存储到硬盘到最终被执行的全部过程。第5部分:一条shell命令的执行。让我们跟着一条shell命令“走南闯北”,从用户输入给计算机一个字符串开始,一直到该程序的最终执行,这一过程能帮你把前面所学的知识融会贯通,整个操作系统的启动流程与运作原理,将会生动形象地浮现在你的脑海中。
作者简介
闪客,平时乐于研究计算机底层技术与技术分享。作为“无聊的”微信公众号作者,两年时间积累近10万粉丝,擅长使用通俗易懂的语言讲解复杂的技术原理,他的“破玩意”系列、“降妖除魔”系列、“操作系统源码”系列等,都深受读者喜爱。
目录
第1 部分 进入内核前的苦力活
第1回 最开始的两行代码 / 2
开机后初始化指向BIOS / 3
读取硬盘启动区(第一扇区) / 4
加载到内存 0x7c00 位置,并跳转到这里 / 5
第2回 从0x7c00 到0x90000 / 8
第3回 做好访问内存的基础准备工作 / 13
这些寄存器是干什么的 / 14
CPU 访问内存的三种途径 / 15
再次回顾一下前三回的内容 / 16
第4回 把全部的操作系统代码从硬盘搬到内存 / 17
把剩下的操作系统代码从硬盘请到内存 / 17
聊聊操作系统的编译过程 / 21
挪来挪去的真讨厌 / 22
扩展阅读:什么是中断 / 23
扩展阅读:什么是软中断 / 38
第5回 将重要的操作系统代码放在零地址处 / 48
第6回 解决段寄存器的历史包袱问题 / 56
保护模式下的物理地址计算方式 / 57
全局描述符表 / 59
第7回 六行代码进入保护模式 / 63
第8回 重新设置中断描述符表与全局描述符表 / 69
第9回 开启分页机制 / 75
第10 回 进入main 函数前的最后一跃 / 86
第1 部分总结与回顾 / 92
第2 部分 “大战”前期的初始化工作
第11 回 整个操作系统就二十几行代码 / 98
第12 回 管理内存前先划分出三个边界值 / 103
第13 回 主内存初始化mem_init / 106
第14 回 中断初始化trap_init / 110
第15 回 块设备请求项初始化blk_dev_init / 116
第16 回 控制台初始化tty_init / 123
第17 回 时间初始化time_init / 132
第18 回 进程调度初始化sched_init / 138
第19 回 缓冲区初始化buffer_init / 147
第20 回 硬盘初始化hd_init / 155
第2 部分总结与回顾 / 159
第3 部分 一个新进程的诞生
第21 回 第3 部分全局概述 / 172
move_to_user_mode / 173
fork / 174
init / 174
pause / 175
第22 回 从内核态切换到用户态 / 176
让进程无法跳出用户态 / 176
内核态与用户态的本质—特权级 / 177
特权级转换的方式 / 178
除了改变特权级还做了哪些事 / 181
第23 回 如果让你来设计进程调度 / 184
整体流程设计 / 185
上下文环境 / 186
运行时间信息 / 188
优先级 / 188
进程状态 / 189
第24 回 从一次定时器滴答来看进程调度 / 192
第25 回 通过fork 看一次系统调用 / 197
第26 回 fork 函数中进程基本信息的复制 / 205
第27 回 透过fork 来看进程的内存规划 / 213
LDT 的赋值 / 214
页表的复制 / 217
第28 回 番外篇——我居然会认为权威著作写错了 / 221
第29 回 番外篇——写时复制就这么几行代码 / 227
储备知识 / 227
写时复制的本质 / 230
看看代码是怎么写的 / 232
第30 回 番外篇——你管这破玩意儿叫文件系统 / 237
第3 部分总结与回顾 / 251
第4 部分展望 / 254
第4 部分 shell 程序的到来
第31 回 拿到硬盘信息 / 258
第32 回 加载根文件系统 / 264
硬盘中的文件系统格式是怎样的 / 266
内存中用于文件系统的数据结构有哪些 / 267
第33 回 打开终端设备文件 / 272
第34 回 进程2 的创建 / 281
fork / 282
close / 285
open / 285
execve / 286
第35 回 execve 加载并执行shell 程序 / 287
读取文件开头 1KB 的数据 / 289
将这 1KB 的数据解析为 exec 结构 / 290
判断是脚本文件还是可执行文件 / 291
准备参数空间 / 291
设置 eip 和 esp,完成摇身一变 / 296
计算机的世界没有魔法 / 297
第36 回 缺页中断 / 301
跳转到一个不存在的地址会发生什么 / 302
缺页中断do_no_page / 304
缺页中断返回 / 309
第37 回 shell 程序跑起来了 / 311
第38 回 操作系统启动完毕! / 317
第39 回 番外篇——调试Linux 最早期的代码 / 322
整体思路和效果 / 322
第一步:配置虚拟机 / 324
第二步:安装qemu / 324
第三步:下载并运行可调试的 Linux-0.11 源码 / 325
第四步:通过 vscode 远程调试 / 327
第40 回 番外篇——为什么有些技术原理你怎么看也看不懂 / 331
第4 部分总结与回顾 / 333
第5 部分 一条shell 命令的执行
第41 回 一条shell 命令的执行过程概述 / 338
第42 回 用键盘输入一条命令 / 342
第43 回 shell 程序读取你的命令 / 352
第44 回 进程的阻塞与唤醒 / 359
第45 回 解析并执行shell 命令 / 364
第46 回 读硬盘数据全流程 / 375
如果让你来设计这个函数 / 375
鸟瞰操作系统的读操作函数 / 376
执行读操作file_read / 382
第47 回 读取硬盘数据的细节 / 391
第48 回 信号 / 400
第49 回 番外篇——为什么你学得比别人慢 / 406
第5 部分总结与回顾 / 411
第1回 最开始的两行代码 / 2
开机后初始化指向BIOS / 3
读取硬盘启动区(第一扇区) / 4
加载到内存 0x7c00 位置,并跳转到这里 / 5
第2回 从0x7c00 到0x90000 / 8
第3回 做好访问内存的基础准备工作 / 13
这些寄存器是干什么的 / 14
CPU 访问内存的三种途径 / 15
再次回顾一下前三回的内容 / 16
第4回 把全部的操作系统代码从硬盘搬到内存 / 17
把剩下的操作系统代码从硬盘请到内存 / 17
聊聊操作系统的编译过程 / 21
挪来挪去的真讨厌 / 22
扩展阅读:什么是中断 / 23
扩展阅读:什么是软中断 / 38
第5回 将重要的操作系统代码放在零地址处 / 48
第6回 解决段寄存器的历史包袱问题 / 56
保护模式下的物理地址计算方式 / 57
全局描述符表 / 59
第7回 六行代码进入保护模式 / 63
第8回 重新设置中断描述符表与全局描述符表 / 69
第9回 开启分页机制 / 75
第10 回 进入main 函数前的最后一跃 / 86
第1 部分总结与回顾 / 92
第2 部分 “大战”前期的初始化工作
第11 回 整个操作系统就二十几行代码 / 98
第12 回 管理内存前先划分出三个边界值 / 103
第13 回 主内存初始化mem_init / 106
第14 回 中断初始化trap_init / 110
第15 回 块设备请求项初始化blk_dev_init / 116
第16 回 控制台初始化tty_init / 123
第17 回 时间初始化time_init / 132
第18 回 进程调度初始化sched_init / 138
第19 回 缓冲区初始化buffer_init / 147
第20 回 硬盘初始化hd_init / 155
第2 部分总结与回顾 / 159
第3 部分 一个新进程的诞生
第21 回 第3 部分全局概述 / 172
move_to_user_mode / 173
fork / 174
init / 174
pause / 175
第22 回 从内核态切换到用户态 / 176
让进程无法跳出用户态 / 176
内核态与用户态的本质—特权级 / 177
特权级转换的方式 / 178
除了改变特权级还做了哪些事 / 181
第23 回 如果让你来设计进程调度 / 184
整体流程设计 / 185
上下文环境 / 186
运行时间信息 / 188
优先级 / 188
进程状态 / 189
第24 回 从一次定时器滴答来看进程调度 / 192
第25 回 通过fork 看一次系统调用 / 197
第26 回 fork 函数中进程基本信息的复制 / 205
第27 回 透过fork 来看进程的内存规划 / 213
LDT 的赋值 / 214
页表的复制 / 217
第28 回 番外篇——我居然会认为权威著作写错了 / 221
第29 回 番外篇——写时复制就这么几行代码 / 227
储备知识 / 227
写时复制的本质 / 230
看看代码是怎么写的 / 232
第30 回 番外篇——你管这破玩意儿叫文件系统 / 237
第3 部分总结与回顾 / 251
第4 部分展望 / 254
第4 部分 shell 程序的到来
第31 回 拿到硬盘信息 / 258
第32 回 加载根文件系统 / 264
硬盘中的文件系统格式是怎样的 / 266
内存中用于文件系统的数据结构有哪些 / 267
第33 回 打开终端设备文件 / 272
第34 回 进程2 的创建 / 281
fork / 282
close / 285
open / 285
execve / 286
第35 回 execve 加载并执行shell 程序 / 287
读取文件开头 1KB 的数据 / 289
将这 1KB 的数据解析为 exec 结构 / 290
判断是脚本文件还是可执行文件 / 291
准备参数空间 / 291
设置 eip 和 esp,完成摇身一变 / 296
计算机的世界没有魔法 / 297
第36 回 缺页中断 / 301
跳转到一个不存在的地址会发生什么 / 302
缺页中断do_no_page / 304
缺页中断返回 / 309
第37 回 shell 程序跑起来了 / 311
第38 回 操作系统启动完毕! / 317
第39 回 番外篇——调试Linux 最早期的代码 / 322
整体思路和效果 / 322
第一步:配置虚拟机 / 324
第二步:安装qemu / 324
第三步:下载并运行可调试的 Linux-0.11 源码 / 325
第四步:通过 vscode 远程调试 / 327
第40 回 番外篇——为什么有些技术原理你怎么看也看不懂 / 331
第4 部分总结与回顾 / 333
第5 部分 一条shell 命令的执行
第41 回 一条shell 命令的执行过程概述 / 338
第42 回 用键盘输入一条命令 / 342
第43 回 shell 程序读取你的命令 / 352
第44 回 进程的阻塞与唤醒 / 359
第45 回 解析并执行shell 命令 / 364
第46 回 读硬盘数据全流程 / 375
如果让你来设计这个函数 / 375
鸟瞰操作系统的读操作函数 / 376
执行读操作file_read / 382
第47 回 读取硬盘数据的细节 / 391
第48 回 信号 / 400
第49 回 番外篇——为什么你学得比别人慢 / 406
第5 部分总结与回顾 / 411
猜您喜欢