- 從零開始寫Linux內(nèi)核:一書學透核心原理與實現(xiàn)
- 海納
- 2005字
- 2025-04-09 18:37:34
前言
為何要寫作本書
作為當今世界上最成功的開源項目之一,Linux內(nèi)核源碼具有巨大的學習價值。學習內(nèi)核不僅僅能提升編碼水平、架構(gòu)能力,更能全面地了解硬件接口和計算機原理。但是隨著Linux內(nèi)核的功能越來越強大,內(nèi)核變得越來越復雜,代碼量也在急劇地膨脹。這就給剛?cè)腴T的新手帶來了巨大的學習困難。
學習一個復雜的系統(tǒng)有兩種常用的方式。
一種是直接扎進系統(tǒng)源碼中,按邏輯順序逐個分析各個模塊。但復雜系統(tǒng)的特點是模塊之間的關(guān)聯(lián)非常強,相關(guān)的數(shù)據(jù)結(jié)構(gòu)非常龐大,調(diào)試環(huán)境的搭建也往往比較煩瑣。這就使得很多人在開始階段就困難重重,要想堅持下去,往往需要很大的定力。
另一種是從零開始將系統(tǒng)從簡單到復雜地實現(xiàn)一遍。這種學習方式的優(yōu)點非常明顯,入門階段比較容易,每次新增幾十行甚至幾行代碼就可以實現(xiàn)一個新的功能,整個學習過程是循序漸進的。但對Linux系統(tǒng)來說,從零開始寫一遍并不容易。這是因為Linux誕生于1991年,當時Linus Torvalds所使用的很多構(gòu)建工具現(xiàn)在已經(jīng)很難找到了,例如ld86等編譯工具,有些工具即使找到了也很難運行在現(xiàn)代的操作系統(tǒng)上。
為了解決這個問題,我編寫了本書。本書的目標是使用現(xiàn)代的操作系統(tǒng)(例如Ubuntu 20)和編譯器(例如GCC7或者GCC9)從零開始實現(xiàn)Linux 0.12的內(nèi)核代碼。在這個過程中,我改寫了很多不適用于現(xiàn)代編譯器的代碼,并且通過鏈接選項或者鏈接腳本重現(xiàn)了早期的文件系統(tǒng)和可執(zhí)行文件格式,讓操作系統(tǒng)可以運行在現(xiàn)代的Bochs或者QEMU等仿真軟件上。
讀者對象
本書面向的人群主要是對操作系統(tǒng)感興趣的人,尤其是那些想深入學習Linux內(nèi)核但又不知道該如何入門的人。對于計算機專業(yè)的學生而言,本書則是一本非常好的實驗指導書,通過一步步地跟隨本書實現(xiàn)全部的功能,不僅可以深入地掌握操作系統(tǒng)的基本功能,還可以加深對計算機接口的了解。
如何閱讀本書
本書共8章,從邏輯上分為四部分。
第一部分(第1和2章)是基礎(chǔ)知識,介紹開發(fā)內(nèi)核所需的基礎(chǔ)知識,包括開發(fā)環(huán)境和調(diào)試環(huán)境的搭建,以及i386保護模式等。
第二部分(第3~6章)是核心模塊,逐步實現(xiàn)進程、中斷、系統(tǒng)調(diào)用、內(nèi)存管理、字符設(shè)備驅(qū)動和塊設(shè)備驅(qū)動等模塊。這一部分涉及的也是傳統(tǒng)操作系統(tǒng)內(nèi)核最主要的模塊,這些模塊之間相互依賴,彼此聯(lián)系,實現(xiàn)起來難度很大。在寫這一部分的時候,我花了很多心思進行構(gòu)思,自始至終堅持每次只實現(xiàn)一個小功能,這樣閱讀的難度就不大了。
第三部分(第7章)是文件系統(tǒng)。Linux 0.12沿用了Minix這一早期的文件系統(tǒng),早期的文件系統(tǒng)所支持的文件大小、磁盤大小都不算大,數(shù)據(jù)結(jié)構(gòu)相對比較簡單。這一部分篇幅雖然不小,但是難度并不大,因為這一部分幾乎不涉及硬件操作,相比前面的章節(jié),文件系統(tǒng)實現(xiàn)起來沒有那么煩瑣。Linux 0.12的文件系統(tǒng)雖然相對簡單,但是它的超級塊、inode等設(shè)計卻被一直沿用下來,文件系統(tǒng)中的mount、unmount等系統(tǒng)調(diào)用,以及將管道、字符設(shè)備都抽象成文件的設(shè)計也一直沿用至今。現(xiàn)代Linux的VFS(Virtual File System,虛擬文件系統(tǒng))的設(shè)計哲學是“一切皆文件”,這種設(shè)計思想在早期的文件系統(tǒng)中已經(jīng)初見端倪。相比現(xiàn)代文件系統(tǒng)的完備和龐大,學習早期的文件系統(tǒng)無疑要簡單很多。
在文件系統(tǒng)中還有一個非常重要的話題,那就是如何加載運行一個可執(zhí)行程序。在現(xiàn)代操作系統(tǒng)中,可執(zhí)行程序的文件格式是ELF,但在Linux 1.0版本之前,則主要使用a.out格式。a.out格式是一種古老但非常簡單的二進制文件格式,它只有代碼段和數(shù)據(jù)段,而代碼會被加載到進程空間的0地址處,所以它的加載過程非常簡單。ELF文件是由專門的加載器(也稱為loader,在Linux上主要就是ld.so)加載運行的,而a.out則由內(nèi)核直接實現(xiàn)。鑒于此,我們采用Minix文件系統(tǒng)和a.out格式。
在這三個主要部分之外,本書第四部分(第8章)實現(xiàn)了一些重要的系統(tǒng)服務(wù)接口,例如用于管理系統(tǒng)時間的一大類函數(shù),用于管理輸入/輸出的ioctl等,這一部分的篇幅不算大,不是內(nèi)核的主要部分,但為了讓shell程序正確地運行,這些函數(shù)也是必須要實現(xiàn)的。
本書是一本非常偏重實踐的書,實踐性遠強于理論性。跟隨本書可以一步步地實現(xiàn)一個完整的操作系統(tǒng),學習曲線非常平緩,這對新手非常友好。但這樣的安排也會帶來一個問題:本書不適宜段落式地閱讀和學習,因為后面的很多功能都依賴于前面的實現(xiàn)。當然,如果你完全掌握了本書的內(nèi)容,再回頭閱讀本書的代碼,完全可以根據(jù)自己的喜好重新安排進程,那時就不必遵循本書的章節(jié)順序了。等到那個時候,讀者也完全有能力沿著Linux的主線代碼繼續(xù)深入學習,如進一步支持圖形界面、網(wǎng)絡(luò)等功能。
勘誤與支持
由于水平有限,編寫時間倉促,書中難免會出現(xiàn)一些錯誤或者不準確的地方,懇請讀者批評指正。如果讀者有更多的寶貴意見,可以通過郵箱hinus@163.com聯(lián)系我,期待得到讀者的反饋,讓我們在技術(shù)之路上互勉共進。
致謝
在本書寫作期間,王帥負責內(nèi)存管理部分的資料整理與校對,段富臣則負責編譯和可執(zhí)行程序加載部分的資料整理與校對,在此向他們表示感謝。本書在編寫的過程中還得到了華為公司操作系統(tǒng)首席架構(gòu)師陳海波老師的指導,在這里向海波老師表示誠摯的謝意。顧波飛對本書進行了仔細的校對,也向他表示感謝。
海納
- 構(gòu)建高可用Linux服務(wù)器(第4版)
- 發(fā)布!設(shè)計與部署穩(wěn)定的分布式系統(tǒng)(第2版)
- Ansible權(quán)威指南
- Moodle 3.x Teaching Techniques(Third Edition)
- Windows Server 2019 Administration Fundamentals
- 新編電腦辦公(Windows 10+ Office 2013版)從入門到精通
- AWS SysOps Cookbook
- Kali Linux高級滲透測試(原書第3版)
- Building Telephony Systems With Asterisk
- Learn SwiftUI
- Linux內(nèi)核修煉之道
- Learning IBM Watson Analytics
- Linux深度攻略
- Mastering AWS CloudFormation
- OpenStack Trove Essentials