猜你喜欢
趣话计算机底层技术

趣话计算机底层技术

书籍作者:轩辕之风 ISBN:9787121455292
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:7334
创建日期:2024-04-03 发布日期:2024-04-03
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介


本书用一系列有趣的小故事讲述计算机底层相关的技术知识。

?? 第1章:聚焦计算机中最核心的CPU,从最基础的门电路开始,到基本的指令执行过程,最后到CPU的一些高级技术。内容涵盖缓存、原子操作、指令流水线、分支预测、乱序执行、超线程、SIMD、 内存管理、TLB等。

?? 第2章:主要讲述计算机中的存储设施,包括CPU中的缓存,内存、机械硬盘三者数据存储的原理,以及硬盘上的数据管理组织的软件——文件系统基本模型。

?? 第3章:主要讲述计算机中的I/O和数据传输。内容涵盖总线系统、中断机制、DMA技术、零拷贝技术。重点关注网卡相关的数据传输,包括网卡的基本工作机制,网卡接收数据包后的处理,最后介绍一种时下流行的数据包处理技术——DPDK。

?? 第4章:前面三章主要是在硬件层面,这一章开始介绍软件。本章聚焦计算机中最重要的软件——操作系统。本书默认以Linux为参考,内容涵盖操作系统的一些基础知识,包括进程、线程、系统调用、异常处理、信号、锁、权限管理,最后介绍一个时下流行的容器技术Docker的原理。

?? 第5章:主要涉及系统编程中和操作系统紧密相关的一些技术点。包括进程的创建过程、线程栈、进程间通信、I/O多路复用、内存映射文件、协程,最后简单介绍调试器GDB和可执行文件ELF。

?? 第6章:本章的主题是安全。网络安全涉及方方面面,本章挑选了和计算机系统底层相关的一些安全技术,通过故事去感受计算机攻击的原理,包含栈溢出攻击、整数溢出攻击、DDoS攻击、TCP会话劫持、HTTPS原理,还有前几年大火的CPU漏洞——熔断与幽灵攻击原理等。


作者简介

轩辕之风(@编程技术宇宙),前百度、360、奇安信高级安全研发工程师,专注网络安全、流量分析、大数据处理领域的软件研发。


编辑推荐

这本书主要是用讲故事的方式介绍计算机底层相关的技术,用通俗易懂的表达方式帮助大家学习底层技术。

故事的主人公可能是计算机里的一个程序、一个进程、一个线程、一个函数、一个数据包、一个文件等这样的软件角色,也可能是CPU、内存、网卡等这样的硬件角色。

本书透过这些角色的视角去讲述发生在计算机世界里的故事,帮助大家在故事中学习和了解计算机底层技术的工作原理。

整本书由几十个故事构成,故事之间既有关联性,让你像“追剧”一样学习技术,也有一定的独立性,让你随时翻开一篇都能看下去。

本书主要涵盖计算机中的CPU、存储、I/O、操作系统、系统编程、安全六个主题,每个主题一章,你不必从头到尾逐篇阅读,完全可以挑选自己感兴趣的任何章节开始阅读。


前言

你好,我是轩辕之风,熟悉我的读者喜欢叫我轩辕。

相信不少人都有过这样的感受:当我们去学习一项新的技术时,会有一大堆的技术名词和专业术语向我们袭来。而当我们试图去学习和理解它们时,网络上的各种学习资料,要么是非常晦涩的原理阐述,要么是大段的代码讲解,看得云里雾里。在我们对一项技术还没有一个全局和整体的认识之前,一下就陷入到细节中,这对新手学习的效率和信心都有不少负面影响。

除了学习,在工作中也有类似的现象,经常会有技术分享和技术讲座,很多时候,负责分享和讲述的人都只顾着单方面的信息输出,把自己要讲的东西说完就算完事,至于下面的人听懂没有,听懂多少,似乎并不关心。

上面的两种现象,在我十一年的编程生涯中,就经常遇到。

每到这个时候,我就在想:为什么不能站在读者/观众的角度来想一想呢,想一想什么样的方式更容易让他们接受和理解。如果是我来讲、我来写,该用什么样的语言让大

家更好理解呢?

后来,我总结了自己的一套方法,那就是举例子、打比方、讲故事,把一个晦涩的

概念用我们熟知的事物表达出来,去降低技术名词本身的神秘感,让我们能快速知道这个技术是干什么的,要解决什么问题,然后才关注它具体是怎么工作的。

运用上面的表达方式,我曾经在大学的时候通过远程语音讲述的方式,帮助一个学经济学专业的高中同学从零基础开始学C语言并通过了计算机二级考试。

我们再来看另外一个问题。

在我面试过的很多人中,以及在如今的互联网上,我发现很多程序员都在忙着学习各种编程语言、各种开发框架和各种中间件的使用,却对计算机底层相关的技术知之甚少。我思考造成这一现象主要有几个原因:

1. 很多程序员都是半路出家的,没有系统地学习过计算机底层知识。

2. 科班出身的程序员由于大学里陈旧的教学方式对这些底层技术也提不起兴趣。

3. 实际工作中的很多岗位只需要具备增删查改(CRUD)能力,对计算机底层技术没那么看重。

由于这些原因,很多程序员的基础知识欠缺,在工作中涉及技术原理的时候就会发现不足。

随着越来越多新人的加入,计算机软件开发行业的竞争也越来越激烈,只靠CRUD技能很大程度上会限制程序员在技术领域的发展。而学习这些底层技术知识,修炼好程序员的内功,可以帮助我们知其然还能知其所以然。

举个简单的例子,如果不知道零拷贝技术和I/O多路复用技术底层的原理,就很难理解Nginx为什么能支持高并发。

由于我从事的是网络安全方向的软件研发工作,经常会与计算机底层技术打交道,如CPU、操作系统内核等,这些通常给人的印象就是艰深、晦涩。所以我就在想,我能不能试着用通俗易懂的方式去把这些晦涩的东西讲清楚?

在2019年年底的时候,我注册了一个微信公众号:编程技术宇宙,开始尝试用写故事的方式去讲述编程相关的技术知识。

刚开始的时候方向比较分散,没有什么起色。后来我开始专注在计算机底层相关的方向上,收到不少好评,尤其是我的CPU系列故事,吸引了很多粉丝的追更,并在CSDN、博客园、知乎等平台获得多次精选推荐。

后来不知不觉就写了一百多篇故事,帮助许许多多的读者“解锁”了原来一直感觉很艰深难懂的知识,对我而言也是很有成就感的一件事。

在这期间,还发生了一个让我感动的小故事。

一位叫“未来永劫”的网友,由于非常喜欢我的这些用故事讲解技术的文章,特地把公众号里这几个系列的文章打印出来装订成了一本“书”寄给了我。看着自己创作的内容变成手里沉甸甸的一本书,心里还是非常开心和激动的。那时候我就在想,要是以后真能写一本书就好了。

果然,后来成都道然科技有限责任公司的姚新军(@长颈鹿27)老师找到了我,对我的创作内容很认可,也给了我很多写书方面的介绍和建议,我俩聊得很尽兴,于是我决定在原来公众号文章的基础上,继续创作更多计算机底层技术文章,汇集成大家手里拿到的这本书。

本书特色

这本书主要是用讲故事的方式介绍计算机底层相关的技术,用通俗易懂的表达方式帮助大家学习底层技术。

故事的主人公可能是计算机里的一个程序、一个进程、一个线程、一个函数、一个数据包、一个文件等这样的软件角色,也可能是CPU、内存、网卡等这样的硬件角色。

本书透过这些角色的视角去讲述发生在计算机世界里的故事,帮助大家在故事中学习和了解计算机底层技术的工作原理。

整本书由几十个故事构成,故事之间既有关联性,让你像“追剧”一样学习技术,也有一定的独立性,让你随时翻开一篇都能看下去。

本书主要涵盖计算机中的CPU、存储、I/O、操作系统、系统编程、安全六个主题,每个主题一章,你不必从头到尾逐篇阅读,完全可以挑选自己感兴趣的任何章节开始阅读。

读者对象

这不是一本讲述如何编程的书,也不是一本技术知识的工具书。如果你是没有任何计算机知识背景的纯小白,那建议先去学习一些基本课程后阅读本书会更加合适。

如果你是一个程序员,懂一些编程知识,但希望学习一些计算机底层技术原理,去夯实自己的技术内功,那这本书很适合你。

如果你是一个学生,学了一些计算机基础课程,但希望用另一种有趣的方式理解得更透彻,那这本书很适合你。

如果你是一个学生,未来想从事C/C++编程或者系统底层相关软件开发,那这本书很适合你。

勘误与支持

由于作者水平有限,书中难免会出现一些错误或不准确的地方,恳请广大读者朋友批评指正。

大家可以在我的微信公众号“编程技术宇宙”后台留言,我会认真回复并解答读者提出的书中的问题。

致谢

感谢微信公众号“编程技术宇宙”的读者们,没有你们的支持,就不会有这本书的诞生,是大家的一次次留言、转发、点赞、打赏、催更让我坚持了下来。还要感谢“未来永劫”这位网友,感谢你亲手为我制作的“书”,给了当时的我很大的鼓舞。

感谢微信公众号“帅地玩编程”的作者帅地,在我微信公众号创作的道路上给了我很多支持,不仅帮助我拥有了最早的一批读者,还教了我很多微信公众号运营的知识。

感谢成都道然科技有限责任公司的姚新军(@长颈鹿27)老师,在本书的萌芽、创作、后期等各个阶段,姚老师都给我提供了很多建议和帮助,还安排插画师对本书的全部插图进行了统一绘制,省去了我很多操心劳神的事情,姚老师认真负责的工作态度让我觉得他是非常可靠的合作伙伴。

最后要特别感谢我的爱人,在我开心的时候陪我开心,在我失落的时候给我加油。

我在公众号创作的过程中,很多次想要放弃,但她总是给我加油和打气,而且不厌其烦的帮助我分析文章阅读低迷的原因,给我提出很多建议和努力的方向。在写作这本书的过程中,我几乎没有时间陪伴她,但她不仅没有怨言,还承担了各种家务琐事,烹饪各种美食,让我可以安心的创作。除此之外,她还经常和我一起探讨创作思路,并作为本书的第一个读者,帮助我发现书稿中的错误,提出了很多修改意见。如果说创作一本书算是一点小小的成绩,那这成绩有一半都来自于她。

谨以此书献给我的家人和一路关注我支持我的读者朋友,希望所有喜欢计算机的朋友都能在书中收获知识和快乐!

轩辕之风


目录

第1章 计算机的大脑:中央处理器CPU

1.1 CPU的细胞:门电路

1.1.1 逻辑门

1.1.2 加法器

1.1.3 算术逻辑单元ALU

1.2 程序的本质:指令

1.2.1 指令集

1.2.2 寄存器

1.2.3 汇编语言

1.2.4 高级语言

1.2.5 指令执行过程

1.3 像流水线一样执行指令

1.3.1 指令流水线

1.3.2 流水线的级数

1.3.3 流水线里的冒险

1.4 CPU里的存储设施:缓存

1.4.1 缓存

1.4.2 缓存行

1.4.3 指令缓存与数据缓存

1.5 多核缓存不一致引发的问题

1.5.1 原子操作

1.5.2 缓存引发的问题

1.5.3 缓存一致性协议MESI

1.6 指令还能乱序执行

1.6.1 数据冒险与流水线停顿

1.6.2 乱序执行

1.7 跳还是不跳,这是一个问题

1.7.1 静态预测

1.7.2 动态预测

1.8 一条指令同时处理多个数据

1.8.1 一个简单的循环

1.8.2 并行计算

1.8.3 一条指令处理多个数据

1.9 一个核同时执行两个线程

1.9.1 资源闲置

1.9.2 超线程技术

1.10 CPU是如何管理内存的

1.10.1 8086

1.10.2 32位时代

1.10.3 虚拟内存

1.10.4 分页交换

1.11 CPU地址翻译的备忘录

1.11.1 虚拟地址翻译

1.11.2 地址翻译缓存

1.11.3 翻译后备缓冲区

1.12 GPU和CPU有什么区别

1.12.1 庞大的核心数量

1.12.2 GPU的SIMT与“超线程”

第2章 计算机中的存储设施

2.1 缓存为什么比内存还快

2.2 内存条是如何存储数据的

2.2.1 数据存储

2.2.2 内存编址

2.3 多个CPU如何共同访问内存

2.3.1 NUMA架构

2.3.2 操作系统支持

2.3.3 内存分配问题

2.4 机械硬盘存储数据的原理

2.5 硬盘那么大,计算机如何管理

2.5.1 扇区和块

2.5.2 块位图

2.5.3 inode

2.5.4 目录

2.5.5 块组、组描述符、超级块

2.5.6 引导块、分区DBR和MBR

第3章 数据的输入与输出

3.1 计算机中的高速公路

3.1.1 早期的总线系统

3.1.2 南桥与北桥

3.1.3 消失的北桥

3.2 其他设备如何与CPU通信

3.2.1 8259A可编程中断控制器

3.2.2 APIC高级可编程中断控制器

3.2.3 中断亲和性

3.3 计算机启动的过程

3.3.1 开始执行

3.3.2 MBR

3.3.3 操作系统

3.4 CPU把数据搬运的工作“外包”出去

3.4.1 PIO模式

3.4.2 DMA技术

3.4.3 DMA全面开花

3.5 神奇的零拷贝技术

3.5.1 数据的四次拷贝

3.5.2 零拷贝技术

3.6 网卡是如何工作的

3.6.1 集线器时代

3.6.2 数据收发过程

3.6.3 交换机时代

3.7 网卡收到数据包后发生什么

3.7.1 数据帧校验

3.7.2 DMA数据传输

3.7.3 软中断

3.7.4 轮询收包

3.7.5 协议栈

3.8 绕过操作系统,直接收发数据包

3.8.1 万兆流量需求

3.8.2 中断问题

3.8.3 超快的抓包技术:DPDK

3.8.4 空转问题

第4章 计算机的大管家:操作系统

4.1 一个控制程序的进化

4.1.1 多道程序处理

4.1.2 时间分片

4.1.3 状态

4.1.4 优先级

4.1.5 多核时代

4.2 程序运行的实体:进程

4.2.1 进程地址空间

4.2.2 进程调度

4.2.3 进程与线程

4.3 CPU的执行流:线程

4.4 内核地址空间历险记:系统调用

4.4.1 神秘的长者

4.4.2 系统调用

4.4.3 内核堆栈

4.5 当除数为0时,CPU发生了什么

4.5.1 中断和异常

4.5.2 信号投递

4.5.3 异常返回

4.6 发给进程的信号,到底去哪儿了

4.6.1 可靠信号与不可靠信号

4.6.2 信号的处理

4.6.3 多线程的信号处理

4.7 困住线程的锁,到底是什么

4.7.1 原子操作

4.7.2 自旋锁

4.7.3 互斥锁

4.7.4 条件变量

4.7.5 信号量

4.8 Linux的权限管理

4.8.1 打开文件的过程

4.8.2 权限检查

4.8.3 UGO与ACL检查

4.8.4 Cgroup与SELinux的检查

4.9 计算机中“楚门的世界”

4.9.1 隐藏文件系统:chroot与pivot_root

4.9.2 进程的隔离:命名空间

4.9.3 行为的限制:Cgroup

第5章 系统编程那些事儿

5.1 进程是如何诞生的

5.1.1 奇怪的fork

5.1.2 写时拷贝

5.1.3 消失的线程们

5.2 线程的栈里都装了什么

5.2.1 自动增长

5.2.2 内核栈

5.2.3 栈溢出

5.3 进程间如何通信

5.3.1 信号

5.3.2 socket套接字

5.3.3 匿名管道

5.3.4 消息队列

5.3.5 共享内存

5.4 高性能基础:I/O多路复用

5.4.1 select模型

5.4.2 poll模型

5.4.3 epoll模型

5.5 像访问内存一样读写文件

5.5.1 传统文件读写

5.5.2 内存映射文件

5.6 线程里的多个执行流:协程

5.6.1 线程阻塞问题

5.6.2 多个执行流的“调度”

5.7 调试器是如何工作的

5.7.1 软件断点

5.7.2 单步调试

5.7.3 内存断点

5.8 可执行文件ELF

5.8.1 格式识别

5.8.2 ELF文件格式

5.8.3 加载过程

第6章 计算机的攻击与安全防护

6.1 TCP序列号的秘密

6.1.1 TCP初始化序列号是多少

6.1.2 Linux协议栈里的计数器

6.2 “猜出”TCP的序列号

6.2.1 神秘的TCP计数器

6.2.2 奇怪的TCP连接

6.2.3 基于计数器的侧信道攻击

6.3 危险的TCP SYN Flood

6.3.1 SYN洪水攻击

6.3.2 安全防护:SYN Cookie

6.4 从HTTP到HTTPS的进化

6.4.1 第一版:直接简单加密

6.4.2 第二版:非对称加密

6.4.3 第三版:非对称与对称加密结合

6.4.4 第四版:密钥计算

6.4.5 第五版:数字证书

6.4.6 第六版:信任链

6.5 线程栈里的秘密行动

6.5.1 栈溢出与Stack Canary

6.5.2 虚函数攻击

6.6 CPU分支预测引发的危机

6.6.1 触发分支预测

6.6.2 乱序执行与缓存引发的攻击

6.6.3 KPTI内核页表隔离

6.7 CPU中隐藏的秘密基地

6.7.1 神秘的SGX

6.7.2 CPU里的禁区

6.7.3 内存加密

6.8 躲在暗处的挖矿病毒

6.9 服务器被挖矿,Redis竟是内鬼

6.9.1 挖矿病毒的入侵

6.9.2 Redis持久化存储“闯祸了”

6.10 整数+1引发的内核攻击

6.10.1 IDT被谁篡改了?

6.10.2 有符号与无符号大有不同

6.10.3 整数+1的悲剧

6.11 从虚拟机中逃脱

6.11.1 虚拟化技术

6.11.2 虚拟机逃逸技术


产品特色