Linux源碼趣讀 ( 簡體 字) |
作者:閃客 | 類別:1. -> 作業系統 -> Linux |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 56329 詢問書籍請說出此書號!【有庫存】 NT售價: 790 元 |
出版日:9/1/2023 |
頁數:424 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787121462870 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:每個程序員都有一個操作系統夢,而操作系統也是每個程序員的心結。
一知半解地了解一點兒操作系統的知識,已經無法滿足當下程序員的需求。但要深入剖析操作系統,又是大部分程序員都很惶恐的一件事。如果要讓程序員讀一遍操作系統源碼,那簡直跟要了命一樣。其實,操作系統的源碼并沒有那么可怕。
有很多優秀的操作系統圖書都是以 Linux-0.11 這個經典版本為研究對象進行講解的,可為什么即便是 Linux-0.11 這種代碼量最少的版本,仍然令很多人望而卻步呢?
先不直接回答這個問題,我們看一下《天龍八部》的開頭:
青光閃動,一柄青鋼劍倏地刺出,指向中年漢子左肩,使劍少年不待劍招用老,腕抖劍斜,劍鋒已削向那漢子右頸。那中年漢子……
記住這個感覺沒?我們再看某本Linux圖書的開頭:
對于操作系統而言,穩定且可靠地運行是最重要的。現行技術方案是將用戶進程與用戶進程之間、用戶進程與操作系統之間進行分離,操作系統可以管理用戶進程,但是用戶進程之間不能相互干預……
好了,不用讀下去了,這句話高瞻遠矚地從宏觀上幫我們梳理了操作系統的體系結構,但對于尚不了解操作系統的人來說,可能完全不知道這句話在說什么。
雖然說思想很重要,但在沒有任何細節做積累時強行進行思想的拔高,是拔不上去的,還不如一直保持一張白紙的狀態。
反觀《天龍八部》的開頭,連人物的名字都沒有,更別說梳理整個體系結構了,上來直接一個精彩鏡頭,讓你迅速進入故事情節。可是讀完整部小說的讀者,無一不對里面的人物如數家珍,對大理的風光仿佛親眼看見了一般,對宋遼矛盾的激烈感同身受。
為什么會這樣呢?因為一切的愛恨情仇,都是讀者通過一個個人物和事件的刻畫感悟出來的。只有自己感悟出來的知識和靠自己總結出來的結論,才真正屬于自己。而那些一上來就試圖把整個脈絡梳理清楚的嘗試,對于新手來說可能徒勞無功,即便是死記硬背記住了,也終究不是屬于自己的知識,無法感同身受。
我在學習操作系統的過程中,就有這樣的感覺。
我曾一次次試圖從較高的視角來看操作系統的知識體系,從宏觀層面跟著大部頭圖書梳理操作系統的整體邏輯,但無一例外地以失敗告終。而當我放下包袱,用讀一本小說的心態去閱讀 Linux源碼時,我發現,我從來沒有去想著梳理出什么體系,但不知道從哪一行代碼開始,整個操作系統的體系結構已經較為清晰地出現在我面前了,竟是那么不知不覺。而且我也清晰地知道,這樣的體系是怎么一步步從第一行代碼開始,逐步建立起來的。
所以,我想把這個過程毫無保留地分享給大家,于是在 2021 年 11 月 8 日,我在我的微信公眾號“程序員閃客”上開始連載 Linux-0.11 源碼趣讀這個系列,于 2022 年 9 月6 日發布最后一篇文章完結,共 50 回。
在這個過程中,我收獲了一大批對該系列感興趣的讀者,不斷有讀者對這個系列提出自己的想法、改進建議、內容勘誤,甚至有不少讀者將自己的讀書筆記發給我。這些事讓我非常感動,也是我能堅持下來不斷更新并優化的動力。
后來,越來越多的讀者建議我把這個系列整理成書,沉淀下來,我也越來越覺得這件事情非常有意義,同時也十分愿意去做,于是便有了這本書。
本書特色
我將用讀一本小說的心態帶你一起閱讀 Linux-0.11 的源碼,用通俗的語言幫你克服對操作系統源碼的恐懼。
當然,只是用讀小說的心態,并不是將各種技術都采用擬人化的方式講解。你將按照 Linux-0.11 源碼的執行順序,像按照時間線讀一本小說一樣,本著探索與發現的心態來閱讀源碼。你會發現,原來閱讀源碼這么有趣,可以像讀小說一樣有種“上頭”的感覺。
同時,本書在講解晦澀難懂的技術原理和細節時,配有大量生動形象且準確的圖解,會給你帶來十足的畫面感。
讀者對象
如果你是一名程序員,但是計算機底層知識相對薄弱,又一直沒有一個深入學習的突破口,那本書很適合你。
如果你是一名學生,不想僅停留在課堂中對操作系統概念上的學習,想要深入源碼細節來加深自己的理解,那本書很適合你。
如果你是非技術領域的朋友,但是對操作系統非常感興趣,或者想找到一個契機來較為深入地了解計算機原理,那本書也很適合你。 |
內容簡介:用讀一本小說的心態來閱讀本書,你會對整個操作系統的體系結構和邏輯細節有非常清晰的認識,從此愛上并閱讀更多的操作系統源碼。第1部分:進入內核前的苦力活。覆蓋從開機到運行到Linux中的main函數的關鍵流程解析,幫你清晰認識Intel CPU的體系結構。第2部分:“大戰”前期的初始化工作。講述main中的各種初始化函數,這些函數是操作系統各個模塊的交互橋梁,為理解后續操作系統各個模塊的運作原理打好基礎。第3部分:一個新進程的誕生。講述從內核態切換至用戶態,并建立起第一個用戶進程的全部過程。學完這部分,你將會理解一個多進程的操作系統是如何建立和運作的。第4部分:shell程序的到來。主要討論如何將磁盤中存儲的shell程序加載到內存中來,并最終交給CPU去執行。通過這個過程你會看清一個程序從存儲到硬盤到最終被執行的全部過程。第5部分:一條shell命令的執行。讓我們跟著一條shell命令“走南闖北”,從用戶輸入給計算機一個字符串開始,一直到該程序的最終執行,這一過程能幫你把前面所學的知識融會貫通,整個操作系統的啟動流程與運作原理,將會生動形象地浮現在你的腦海中。 |
目錄:第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 |
序: |