本書用一系列有趣的小故事講述計算機底層相關的技術知識。
• 第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 編程或者系統底層相關軟件開發,那這本書很適合你。
第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 虛擬機逃逸技術
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。