內容簡介
《Orange S:一個作業系統的實現》從只有二十行的引導扇區代碼出發,一步一步地向讀者呈現一個作業系統框架的完成過程。書中不僅關注代碼本身,同時關注完成這些代碼的思路和過程。本書不同於其他的理論型書籍,而是提供給讀者一個動手實踐的路線圖。讀者可以根據路線圖逐步完成各部分的功能,從而避免了一開始就面對整個作業系統數萬行代碼時的迷茫和挫敗感。書中講解了大量在開發作業系統中需注意的細節問題,這些細節不僅能使讀者更深刻地認識作業系統的核心原理,而且使整個開發過程少走彎路。本書分上下兩篇,共11章。其中每一章都以前一章的工作成果為基礎,實現一項新的功能。而在章的內部,一項大的功能被分解成許多小的步驟,通過完成每個小的步驟,讀者可以不斷獲得階段性的成果,從而讓整個開發過程變得輕鬆並且有趣。
本書適合各類程式設計師、程式開發愛好者閱讀,也可作為高等院校作業系統課程的實踐參考書。
編輯推薦
·暢銷書《自己動手寫作業系統》第二版。
·從只有二十行的引導扇區代碼出發,一步一步地向讀者呈現一個作業系統框架的完成過程。
翔實的文字,豐富的圖表,清晰的代碼,作者親自用LAATEX排版,內容與形式並重。
人性化的代碼組織,幫讀者關注每節重點,完備的行號標識,便於讀者對照實際代碼。
專屬網站和郵件列表,方便讀者交流。
立足實踐層面,關注動於操作過程中的細節,一步一步熟讀者完成自己的作業系統:最簡單的Boot Sector-由Boot Sector和Loader載入的核心-實現一個和多個進程-多控制台-進程間通信-輕巧的FS-簡單的MM-自己的C運行時庫-運行自己的應用程式-在真機進行自己作業系統。
作者簡介
於淵自述——性懶,好靜,涉獵甚廣,然所精者少。遇所好之事,譬如程式,必沉迷其中,恍恍然如癲如痴。 讀書非多,然每讀必思,偶有心得,自得其樂。遇知其所云者,欣然以為知音,必邀之共飲,所飲不必多,喜聞觥籌鏗鏘之聲,與談笑交錯,快意淋漓。 本性固執,喜鑽研,求本質,不滿於浮光掠影,故凡可能之事,必躬親而後快。以求甚解之心,究作業系統之原委,並親為之,耗時數月,鹹雛形。回顧此歷程,自有一番甘苦,乃以此記錄,與同道分享。雖有貽笑方家之慮,然凡此種種,皆切身之感受,所感所想,點滴皆為領悟,故心下坦然。若恰能為後來者借鑑一二,心當甚慰。
目錄
上篇
第1章 馬上動手寫一個最小的“作業系統”
1.1 準備工作
1.2 十分鐘完成的作業系統
1.3 引導扇區
1.4 代碼解釋
1.5 水面下的冰山
1.6 回顧
第2章 搭建你的工作環境
2.1 虛擬計算機Bochs
2.1.1 Bochs初體驗
2.1.2 Bochs的安裝
2.1.3 Bochs的使用
2.1.4 用Bochs調試作業系統
2.2 QEMU
2.3 平台之爭:Windows還是Linux
2.4 GNU/Linux下的開發環境
2.5 Windows下的開發環境
2.6 總結
第3章 保護模式(Protect Mode)
3.1 認識保護模式
3.1.1 保護模式的運行環境
3.1.2 GDT(Global Descriptor Table)
3.1.3 實模式到保護模式,不一般的jmp
3.1.4 描述符屬性
3.2 保護模式進階
3.2.1 海闊憑魚躍
3.2.2 LDT(Local Descriptor Table)
3.2.3 特權級概述
3.2.4 特權級轉移
3.2.5 關於“保護”二字的一點思考
3.3 頁式存儲
3.3.1 分頁機制概述
3.3.2 編寫代碼啟動分頁機制
3.3.3 PDE和PTE
3.3.4 cr3
3.3.5 回頭看代碼
3.3.6 克勤克儉用記憶體
3.3.7 進一步體會分頁機制
3.4 中斷和異常
3.4.1 中斷和異常機制
3.4.2 外部中斷
3.4.3 編程操作8259A
3.4.4 建立IDT
3.4.5 實現一個中斷
3.4.6 時鐘中斷試驗
3.4.7 幾點額外說明
3.5 保護模式下的I/O
3.5.1 IOPL
3.5.2 I/O許可點陣圖(I/O Permission Bitmap)
3.6 保護模式小結
第4章 讓作業系統走進保護模式
4.1 突破512位元組的限制
4.1.1 FAT12
4.1.2 DOS可以識別的引導盤
4.1.3 一個最簡單的Loader
4.1.4 載入Loader入記憶體
4.1.5 向Loader交出控制權
4.1.6 整理boot.asm
4.2 保護模式下的“作業系統”
第5章 核心雛形
5.1 在Linux下用彙編寫Hello World
5.2 再進一步,彙編和C同步使用
5.3 ELF(Executable and Linkable Format)
5.4 從Loader到核心
5.4.1 用Loader載入ELF
5.4.2 跳入保護模式
5.4.3 重新放置核心
5.4.4 向核心交出控制權
5.5 擴充核心
5.5.1 切換堆疊和GDT
5.5.2 整理我們的資料夾
5.5.3 Makefile
5.5.4 添加中斷處理
5.5.5 兩點說明
5.6 小結
第6章 進程
6.1 遲到的進程
6.2 概述
6.2.1 進程介紹
6.2.2 未雨綢繆——形成進程的必要考慮
6.2.3 參考的代碼
6.3 最簡單的進程
6.3.1 簡單進程的關鍵技術預測
6.3.2 第一步——ring0→ring1
6.3.3 第二步——豐富中斷處理程式
6.4 多進程
6.4.1 添加一個進程體
6.4.2 相關的變數和宏
6.4.3 進程表初始化代碼擴充
6.4.4 LDT
6.4.5 修改中斷處理程式
6.4.6 添加一個任務的步驟總結
6.4.7 號外:Minix的中斷處理
6.4.8 代碼回顧與整理
6.5 系統調用
6.5.1 實現一個簡單的系統調用
6.5.2 get_ticks的套用
6.6 進程調度
6.6.1 避免對稱——進程的節奏感
6.6.2 優先權調度總結
第7章 輸入/輸出系統
7.1 鍵盤
7.1.1 從中斷開始——鍵盤初體驗
7.1.2 AT、PS/2鍵盤
7.1.3 鍵盤敲擊的過程
7.1.4 用數組表示掃描碼
7.1.5 鍵盤輸入緩衝區
7.1.6 用新加的任務處理鍵盤操作
7.1.7 解析掃描碼
7.2 顯示器
7.2.1 初識TTY
7.2.2 基本概念
7.2.3 暫存器
7.3 TTY任務
7.3.1 TTY任務框架的搭建
7.3.2 多控制台
7.3.3 完善鍵盤處理
7.3.4 TTY任務總結
7.4 區分任務和用戶進程
7.5 printf
7.5.1 為進程指定TTY
7.5.2 printf()的實現
7.5.3 系統調用write()
7.5.4 使用printf()
下篇
第8章 進程間通信
8.1 微核心還是宏核心
8.1.1 Linux的系統調用
8.1.2 Minix的系統調用
8.1.3 我們的選擇
8.2 IPC
8.3 實現IPC
8.3.1 assert()和panic()
8.3.2 msg_send()和msg_receive()
8.3.3 增加訊息機制之後的進程調度
8.4 使用IPC來替換系統調用get_ticks
8.5 總結
第9章 檔案系統
9.1 硬碟簡介
9.2 硬碟操作的I/O 連線埠
9.3 硬碟驅動程式
9.4 檔案系統
9.5 硬碟分區表
9.6 設備號
9.7 用代碼遍歷所有分區
9.8 完善硬碟驅動程式
9.9 在硬碟上製作一個檔案系統
9.9.1 檔案系統涉及的數據結構
9.9.2 編碼建立檔案系統
9.10 創建檔案
9.10.1 Linux下的檔案操作
9.10.2 檔案描述符(file descriptor)
9.10.3 open()
9.11 創建檔案所涉及的其他函式
9.11.1 strip_path()
9.11.2 search_file()
9.11.3 get_inode()和sync_inode()
9.11.4 init_fs()
9.11.5 read_super_block()和get_super_block()
9.12 關閉檔案
9.13 查看已創建的檔案
9.14 打開檔案
9.15 讀寫檔案
9.16 測試檔案讀寫
9.17 檔案系統調試
9.18 刪除檔案
9.19 插曲:奇怪的異常
9.20 為檔案系統添加系統調用的步驟
9.21 將TTY納入檔案系統
9.22
序言
做真正 Hacker的樂趣──自己動手去實踐
2004年我聽編輯說有個年輕人寫了本《自己動手寫作業系統》,第一反應是不可能,恐怕是翻譯稿,寫這種書籍是要考作者硬功夫的,不但需要深入掌握作業系統的原理,還需要實際動手寫出原型。
歷史上的 Linux就是這么產生的,Linus Torvalds當時是一名赫爾辛基大學計算機科學系的二年級學生,經常要用自己的電腦去訪問大學主機上的新聞組和郵件,為了方便讀寫和下載檔案,他自己編寫了磁碟驅動程式和檔案系統,這成為了 Linux第一個核心的雛形。
我想中國有能力寫出核心原型的程式設計師應該也有,但把這個題目寫成一本書,感覺上不會有人願意做這件事情,作者要花很多時間,加上主題比較硬,銷售量不會太高,經濟上回報有限。
但拿來文稿一看,整個編輯部大為驚艷,內容文筆俱佳,而且絕對原創,馬上決定在《程式設計師》連載。2005年博文視點出版的第一版也廣受好評。
不過有很多讀者還是質疑:現在軟體編程主要領域是框架和套用,還需要了解作業系統底層嗎?
經過四年的磨練成長,於淵又拿出第二版的書稿《Orange’S:一個作業系統的實現》,這本書是屬於真正 Hacker的。我雖然已經有多年不寫代碼了,但看這本書的時候,讓我又重新感受到做程式設計師的樂趣:用代碼建設屬於自己的系統,讓電腦聽從自己的指令,對系統的每個部分都了如指掌。
黑客(hacker)實際是褒義詞,維基百科的解釋是喜歡用智力通過創造性方法來挑戰腦力極限的人,特別是他們所感興趣的領域,例如軟體編程或電氣工程。個人電腦、軟體和網際網路等劃時代的產品都是黑客創造出來的,如蘋果的 Apple電腦、微軟的 Basic解釋器、網際網路的 Mosaic瀏覽器。
回答前面讀者的質疑,學軟體編程並不需要看這本書,想成為優秀程式設計師和黑客的朋友,我強烈建議你花時間來閱讀這本書,並親自動手實踐。正如於淵在本書結尾中所說“我們寫自己的作業系統是出於一種好奇,或者說一種求知慾。我希望這樣不停地‘過把癮’能讓這種好奇不停地延續”。
好奇心是動力的源泉,追究問題的本質是優秀黑客的必備素質,只有充分掌握了系統原理,才能在技術上遊刃有餘,才能有真正的創新和發展。中國需要更多真正的黑客,也希望更多的程式設計師能享受屬於黑客的創造樂趣。