用讀一本小說的心態來閱讀本書,你會對整個操作系統的體系結構和邏輯細節有非常清晰的認識,從此愛上並閱讀更多的操作系統源碼。第1部分:進入內核前的苦力活。覆蓋從開機到運行到Linux中的main函數的關鍵流程解析,幫你清晰認識Intel CPU的體系結構。第2部分:“大戰”前期的初始化工作。講述main中的各種初始化函數,這些函數是操作系統各個模塊的交互橋梁,為理解後續操作系統各個模塊的運作原理打好基礎。第3部分:一個新進程的誕生。講述從內核態切換至用戶態,並建立起第一個用戶進程的全部過程。學完這部分,你將會理解一個多進程的操作系統是如何建立和運作的。第4部分:shell程序的到來。主要討論如何將磁盤中存儲的shell程序加載到內存中來,並最終交給CPU去執行。通過這個過程你會看清一個程序從存儲到硬盤到最終被執行的全部過程。第5部分:一條shell命令的執行。讓我們跟著一條shell命令“走南闖北”,從用戶輸入給計算機一個字符串開始,一直到該程序的最終執行,這一過程能幫你把前面所學的知識融會貫通,整個操作系統的啟動流程與運作原理,將會生動形象地浮現在你的腦海中。
閃客,平時樂於研究計算機底層技術與技術分享。作為“無聊的閃客”自媒體作者,兩年時間積累近10萬粉絲,擅長使用通俗易懂的語言講解複雜的技術原理,他的“破玩意”系列、“降妖除魔”系列、“操作系統源碼”系列等,都深受讀者喜愛。
了解操作系統的體系結構,以及這樣的體系是怎樣一步步從第一行代碼開始,逐步建立起來的。
用讀一本小說的心態閱讀Linux的源碼,用通俗的語言幫你克服對操作系統源碼的恐懼。
按照Linux源碼的執行順序,像按照時間線讀一本小說一樣,本著探索與發現的心態來閱讀源碼。你會發現,原來閱讀源碼這麼有趣,可以像讀小說一樣有種“上頭”的感覺。
本書在講解晦澀難懂的技術原理和細節時,配有大量生動形象且準確的圖解,會給你帶來十足的畫面感。
《深入理解Linux網絡》作者張彥飛、《碼農翻身》作者劉欣等專家力薦。
前言
每個程序員都有一個操作系統夢,而操作系統也是每個程序員的心結。
一知半解地了解一點兒操作系統的知識,已經無法滿足當下程序員的需求。但要深入剖析操作系統,又是大部分程序員都很惶恐的一件事。如果要讓程序員讀一遍操作系統源碼,那簡直跟要了命一樣。其實,操作系統的源碼並沒有那麼可怕。
有很多優秀的操作系統圖書都是以 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部分 進入內核前的苦力活
第1回 最開始的兩行代碼
第2回 從0x7c00到0x90000
第3回 做好訪問內存的基礎準備工作
第4回 把全部的操作系統代碼從硬盤搬到內存
第5回 將重要的操作系統代碼放在零地址處
第6回 解決段寄存器的歷史包袱問題
第7回 六行代碼進入保護模式
第8回 重新設置中斷描述符表與全局描述符表
第9回 開啟分頁機制
第10回 進入main函數前的最後一躍
第2部分 “大戰”前期的初始化工作
第11回 整個操作系統就二十幾行代碼
第12回 管理內存前先劃分出三個邊界值
第13回 主內存初始化mem_init
第14回 中斷初始化trap_init
第15回 塊設備請求項初始化blk_dev_init
第16回 控制臺初始化tty_init
第17回 時間初始化time_init
第18回 進程調度初始化sched_init
第19回 緩衝區初始化buffer_init
第20回 硬盤初始化hd_init
第3部分 一個新進程的誕生
第21回 第3 部分全局概述
第22 回 從內核態切換到用戶態
第23回 如果讓你來設計進程調度
第24回 從一次定時器滴答來看進程調度
第25回 通過fork 看一次系統調用
第26回 fork 函數中進程基本信息的復制
第27回 透過fork 來看進程的內存規劃
第28回 番外篇——我居然會認為權威著作寫錯了
第29回 番外篇——寫時復制就這麼幾行代碼
第30回 番外篇——你管這破玩意兒叫文件系統
第4部分 shell程序的到來
第31回 拿到硬盤信息
第32回 加載根文件系統
第33回 打開終端設備文件
第34回 進程2的創建
第35回 execve 加載並執行shell程序
第36回 缺頁中斷
第37回 shell程序跑起來了
第38回 操作系統啟動完畢!
第39回 番外篇——調試Linux最早期的代碼
第40回 番外篇——為什麼有些技術原理你怎麼看也看不懂
第5部分 一條shell命令的執行
第41回 一條shell命令的執行過程概述
第42回 用鍵盤輸入一條命令
第43回 shell程序讀取你的命令
第44回 進程的阻塞與喚醒
第45回 解析並執行shell命令
第46回 讀硬盤數據全流程
第47回 讀取硬盤數據的細節
第48回 信號
第49回 番外篇——為什麼你學得比別人慢
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。