本書用一系列有趣的小故事講述計(jì)算機(jī)底層相關(guān)的技術(shù)知識(shí)。? 第1章:聚焦計(jì)算機(jī)中最核心的CPU,從最基礎(chǔ)的門電路開始,到基本的指令執(zhí)行過程,最后到CPU的一些高級(jí)技術(shù)。內(nèi)容涵蓋緩存、原子操作、指令流水線、分支預(yù)測(cè)、亂序執(zhí)行、超線程、SIMD、 內(nèi)存管理、TLB等。? 第2章:主要講述計(jì)算機(jī)中的存儲(chǔ)設(shè)施,包括CPU中的緩存,內(nèi)存、機(jī)械硬盤三者數(shù)據(jù)存儲(chǔ)的原理,以及硬盤上的數(shù)據(jù)管理組織的軟件——文件系統(tǒng)基本模型。? 第3章:主要講述計(jì)算機(jī)中的I/O和數(shù)據(jù)傳輸。內(nèi)容涵蓋總線系統(tǒng)、中斷機(jī)制、DMA技術(shù)、零拷貝技術(shù)。重點(diǎn)關(guān)注網(wǎng)卡相關(guān)的數(shù)據(jù)傳輸,包括網(wǎng)卡的基本工作機(jī)制,網(wǎng)卡接收數(shù)據(jù)包后的處理,最后介紹一種時(shí)下流行的數(shù)據(jù)包處理技術(shù)——DPDK。? 第4章:前面三章主要是在硬件層面,這一章開始介紹軟件。本章聚焦計(jì)算機(jī)中最重要的軟件——操作系統(tǒng)。本書默認(rèn)以Linux為參考,內(nèi)容涵蓋操作系統(tǒng)的一些基礎(chǔ)知識(shí),包括進(jìn)程、線程、系統(tǒng)調(diào)用、異常處理、信號(hào)、鎖、權(quán)限管理,最后介紹一個(gè)時(shí)下流行的容器技術(shù)Docker的原理。? 第5章:主要涉及系統(tǒng)編程中和操作系統(tǒng)緊密相關(guān)的一些技術(shù)點(diǎn)。包括進(jìn)程的創(chuàng)建過程、線程棧、進(jìn)程間通信、I/O多路復(fù)用、內(nèi)存映射文件、協(xié)程,最后簡(jiǎn)單介紹調(diào)試器GDB和可執(zhí)行文件ELF。? 第6章:本章的主題是安全。網(wǎng)絡(luò)安全涉及方方面面,本章挑選了和計(jì)算機(jī)系統(tǒng)底層相關(guān)的一些安全技術(shù),通過故事去感受計(jì)算機(jī)攻擊的原理,包含棧溢出攻擊、整數(shù)溢出攻擊、DDoS攻擊、TCP會(huì)話劫持、HTTPS原理,還有前幾年大火的CPU漏洞——熔斷與幽靈攻擊原理等。
軒轅之風(fēng)(@編程技術(shù)宇宙),前百度、360、奇安信高級(jí)安全研發(fā)工程師,專注網(wǎng)絡(luò)安全、流量分析、大數(shù)據(jù)處理領(lǐng)域的軟件研發(fā)。
第1章 計(jì)算機(jī)的大腦:中央處理器CPU
1.1 CPU的細(xì)胞:門電路
1.1.1 邏輯門
1.1.2 加法器
1.1.3 算術(shù)邏輯單元ALU
1.2 程序的本質(zhì):指令
1.2.1 指令集
1.2.2 寄存器
1.2.3 匯編語言
1.2.4 高級(jí)語言
1.2.5 指令執(zhí)行過程
1.3 像流水線一樣執(zhí)行指令
1.3.1 指令流水線
1.3.2 流水線的級(jí)數(shù)
1.3.3 流水線里的冒險(xiǎn)
1.4 CPU里的存儲(chǔ)設(shè)施:緩存
1.4.1 緩存
1.4.2 緩存行
1.4.3 指令緩存與數(shù)據(jù)緩存
1.5 多核緩存不一致引發(fā)的問題
1.5.1 原子操作
1.5.2 緩存引發(fā)的問題
1.5.3 緩存一致性協(xié)議MESI
1.6 指令還能亂序執(zhí)行
1.6.1 數(shù)據(jù)冒險(xiǎn)與流水線停頓
1.6.2 亂序執(zhí)行
1.7 跳還是不跳,這是一個(gè)問題
1.7.1 靜態(tài)預(yù)測(cè)
1.7.2 動(dòng)態(tài)預(yù)測(cè)
1.8 一條指令同時(shí)處理多個(gè)數(shù)據(jù)
1.8.1 一個(gè)簡(jiǎn)單的循環(huán)
1.8.2 并行計(jì)算
1.8.3 一條指令處理多個(gè)數(shù)據(jù)
1.9 一個(gè)核同時(shí)執(zhí)行兩個(gè)線程
1.9.1 資源閑置
1.9.2 超線程技術(shù)
1.10 CPU是如何管理內(nèi)存的
1.10.1 8086
1.10.2 32位時(shí)代
1.10.3 虛擬內(nèi)存
1.10.4 分頁交換
1.11 CPU地址翻譯的備忘錄
1.11.1 虛擬地址翻譯
1.11.2 地址翻譯緩存
1.11.3 翻譯后備緩沖區(qū)
1.12 GPU和CPU有什么區(qū)別
1.12.1 龐大的核心數(shù)量
1.12.2 GPU的SIMT與“超線程”
第2章 計(jì)算機(jī)中的存儲(chǔ)設(shè)施
2.1 緩存為什么比內(nèi)存還快
2.2 內(nèi)存條是如何存儲(chǔ)數(shù)據(jù)的
2.2.1 數(shù)據(jù)存儲(chǔ)
2.2.2 內(nèi)存編址
2.3 多個(gè)CPU如何共同訪問內(nèi)存
2.3.1 NUMA架構(gòu)
2.3.2 操作系統(tǒng)支持
2.3.3 內(nèi)存分配問題
2.4 機(jī)械硬盤存儲(chǔ)數(shù)據(jù)的原理
2.5 硬盤那么大,計(jì)算機(jī)如何管理
2.5.1 扇區(qū)和塊
2.5.2 塊位圖
2.5.3 inode
2.5.4 目錄
2.5.5 塊組、組描述符、超級(jí)塊
2.5.6 引導(dǎo)塊、分區(qū)DBR和MBR
第3章 數(shù)據(jù)的輸入與輸出
3.1 計(jì)算機(jī)中的高速公路
3.1.1 早期的總線系統(tǒng)
3.1.2 南橋與北橋
3.1.3 消失的北橋
3.2 其他設(shè)備如何與CPU通信
3.2.1 8259A可編程中斷控制器
3.2.2 APIC高級(jí)可編程中斷控制器
3.2.3 中斷親和性
3.3 計(jì)算機(jī)啟動(dòng)的過程
3.3.1 開始執(zhí)行
3.3.2 MBR
3.3.3 操作系統(tǒng)
3.4 CPU把數(shù)據(jù)搬運(yùn)的工作“外包”出去
3.4.1 PIO模式
3.4.2 DMA技術(shù)
3.4.3 DMA全面開花
3.5 神奇的零拷貝技術(shù)
3.5.1 數(shù)據(jù)的四次拷貝
3.5.2 零拷貝技術(shù)
3.6 網(wǎng)卡是如何工作的
3.6.1 集線器時(shí)代
3.6.2 數(shù)據(jù)收發(fā)過程
3.6.3 交換機(jī)時(shí)代
3.7 網(wǎng)卡收到數(shù)據(jù)包后發(fā)生什么
3.7.1 數(shù)據(jù)幀校驗(yàn)
3.7.2 DMA數(shù)據(jù)傳輸
3.7.3 軟中斷
3.7.4 輪詢收包
3.7.5 協(xié)議棧
3.8 繞過操作系統(tǒng),直接收發(fā)數(shù)據(jù)包
3.8.1 萬兆流量需求
3.8.2 中斷問題
3.8.3 超快的抓包技術(shù):DPDK
3.8.4 空轉(zhuǎn)問題
第4章 計(jì)算機(jī)的大管家:操作系統(tǒng)
4.1 一個(gè)控制程序的進(jìn)化
4.1.1 多道程序處理
4.1.2 時(shí)間分片
4.1.3 狀態(tài)
4.1.4 優(yōu)先級(jí)
4.1.5 多核時(shí)代
4.2 程序運(yùn)行的實(shí)體:進(jìn)程
4.2.1 進(jìn)程地址空間
4.2.2 進(jìn)程調(diào)度
4.2.3 進(jìn)程與線程
4.3 CPU的執(zhí)行流:線程
4.4 內(nèi)核地址空間歷險(xiǎn)記:系統(tǒng)調(diào)用
4.4.1 神秘的長(zhǎng)者
4.4.2 系統(tǒng)調(diào)用
4.4.3 內(nèi)核堆棧
4.5 當(dāng)除數(shù)為0時(shí),CPU發(fā)生了什么
4.5.1 中斷和異常
4.5.2 信號(hào)投遞
4.5.3 異常返回
4.6 發(fā)給進(jìn)程的信號(hào),到底去哪兒了
4.6.1 可靠信號(hào)與不可靠信號(hào)
4.6.2 信號(hào)的處理
4.6.3 多線程的信號(hào)處理
4.7 困住線程的鎖,到底是什么
4.7.1 原子操作
4.7.2 自旋鎖
4.7.3 互斥鎖
4.7.4 條件變量
4.7.5 信號(hào)量
4.8 Linux的權(quán)限管理
4.8.1 打開文件的過程
4.8.2 權(quán)限檢查
4.8.3 UGO與ACL檢查
4.8.4 Cgroup與SELinux的檢查
4.9 計(jì)算機(jī)中“楚門的世界”
4.9.1 隱藏文件系統(tǒng):chroot與pivot_root
4.9.2 進(jìn)程的隔離:命名空間
4.9.3 行為的限制:Cgroup
第5章 系統(tǒng)編程那些事兒
5.1 進(jìn)程是如何誕生的
5.1.1 奇怪的fork
5.1.2 寫時(shí)拷貝
5.1.3 消失的線程們
5.2 線程的棧里都裝了什么
5.2.1 自動(dòng)增長(zhǎng)
5.2.2 內(nèi)核棧
5.2.3 棧溢出
5.3 進(jìn)程間如何通信
5.3.1 信號(hào)
5.3.2 socket套接字
5.3.3 匿名管道
5.3.4 消息隊(duì)列
5.3.5 共享內(nèi)存
5.4 高性能基礎(chǔ):I/O多路復(fù)用
5.4.1 select模型
5.4.2 poll模型
5.4.3 epoll模型
5.5 像訪問內(nèi)存一樣讀寫文件
5.5.1 傳統(tǒng)文件讀寫
5.5.2 內(nèi)存映射文件
5.6 線程里的多個(gè)執(zhí)行流:協(xié)程
5.6.1 線程阻塞問題
5.6.2 多個(gè)執(zhí)行流的“調(diào)度”
5.7 調(diào)試器是如何工作的
5.7.1 軟件斷點(diǎn)
5.7.2 單步調(diào)試
5.7.3 內(nèi)存斷點(diǎn)
5.8 可執(zhí)行文件ELF
5.8.1 格式識(shí)別
5.8.2 ELF文件格式
5.8.3 加載過程
第6章 計(jì)算機(jī)的攻擊與安全防護(hù)
6.1 TCP序列號(hào)的秘密
6.1.1 TCP初始化序列號(hào)是多少
6.1.2 Linux協(xié)議棧里的計(jì)數(shù)器
6.2 “猜出”TCP的序列號(hào)
6.2.1 神秘的TCP計(jì)數(shù)器
6.2.2 奇怪的TCP連接
6.2.3 基于計(jì)數(shù)器的側(cè)信道攻擊
6.3 危險(xiǎn)的TCP SYN Flood
6.3.1 SYN洪水攻擊
6.3.2 安全防護(hù):SYN Cookie
6.4 從HTTP到HTTPS的進(jìn)化
6.4.1 第一版:直接簡(jiǎn)單加密
6.4.2 第二版:非對(duì)稱加密
6.4.3 第三版:非對(duì)稱與對(duì)稱加密結(jié)合
6.4.4 第四版:密鑰計(jì)算
6.4.5 第五版:數(shù)字證書
6.4.6 第六版:信任鏈
6.5 線程棧里的秘密行動(dòng)
6.5.1 棧溢出與Stack Canary
6.5.2 虛函數(shù)攻擊
6.6 CPU分支預(yù)測(cè)引發(fā)的危機(jī)
6.6.1 觸發(fā)分支預(yù)測(cè)
6.6.2 亂序執(zhí)行與緩存引發(fā)的攻擊
6.6.3 KPTI內(nèi)核頁表隔離
6.7 CPU中隱藏的秘密基地
6.7.1 神秘的SGX
6.7.2 CPU里的禁區(qū)
6.7.3 內(nèi)存加密
6.8 躲在暗處的挖礦病毒
6.9 服務(wù)器被挖礦,Redis竟是內(nèi)鬼
6.9.1 挖礦病毒的入侵
6.9.2 Redis持久化存儲(chǔ)“闖禍了”
6.10 整數(shù)+1引發(fā)的內(nèi)核攻擊
6.10.1 IDT被誰篡改了?
6.10.2 有符號(hào)與無符號(hào)大有不同
6.10.3 整數(shù)+1的悲劇
6.11 從虛擬機(jī)中逃脫
6.11.1 虛擬化技術(shù)
6.11.2 虛擬機(jī)逃逸技術(shù)