趣話計算機底層技術

軒轅之風(@編程技術宇宙)

買這商品的人也買了...

商品描述

本書用一系列有趣的小故事講述電腦底層相關的技術知識。? 第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漏洞——熔斷與幽靈攻擊原理等。

目錄大綱

第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 虛擬機逃逸技術