內容簡介
本書從只有二十行的引導扇區代碼出發,一步一步地向讀者呈現一個作業系統框架的完成過程。書中不僅關注代碼本身,同時關注完成這些代碼的思路和過程。本書不同於其他的理論型書籍,而是提供給讀者一個動手實踐的路線圖。讀者可以根據路線圖逐步完成各部分的功能,從而避免了一開始就面對整個作業系統數萬行代碼時的迷茫和挫敗感。書中講解了大量在開發作業系統中需注意的細節問題,這些細節不僅能使讀者更深刻地認識作業系統的核心原理,而且使整個開發過程少走彎路。本書分上下兩篇,共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還是*nix
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 改造printf
9.23 總結
第10章 記憶體管理
10.1 fork
10.1.1 認識fork
10.1.2 fork前要做的工作(為fork所做的準備)
10.1.3 fork()庫函式
10.1.4 MM
10.1.5 運行
10.2 exit和wait
10.3 exec
10.3.1 認識exec
10.3.2 為自己的作業系統編寫應用程式
10.3.3 “安裝”應用程式
10.3.4 實現exec
10.4 簡單的shell
10.5 總結
第11章 尾聲
11.1 讓mkfs()只執行一次
11.2 從硬碟引導
11.2.1 編寫硬碟引導扇區和硬碟版loader
11.2.2 “安裝”hdboot.bin和hdldr.bin
11.2.3 grub
11.2.4 小結
11.3 將OS安裝到真實的計算機
11.3.1 準備工作
11.3.2 安裝Linux
11.3.3 編譯原始碼
11.3.4 開始安裝
11.4 總結