操作系統(tǒng)設計與實現(xiàn):基于LoongArch架構 周慶國 楊虎斌 劉剛 陳玉聰 張福新
定 價:59 元
- 作者:周慶國 楊虎斌 劉剛 陳玉聰 張福新
- 出版時間:2024/4/1
- ISBN:9787111746683
- 出 版 社:機械工業(yè)出版社
- 中圖法分類:TP316
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書以基于LoongArch架構的教學版操作系統(tǒng)MaQueOS為主線,詳細介紹了操作系統(tǒng)內核的設計和實現(xiàn)方法。在介紹MaQueOS的功能的基礎上,依次介紹了顯示器驅動、時鐘中斷、鍵盤驅動、進程0和進程1的創(chuàng)建與運行、進程的掛起與喚醒、硬盤驅動、xtfs文件系統(tǒng)、進程1加載可執(zhí)行文件、頁例外、進程間通信和文件操作的實現(xiàn)方法。本書結構清晰、循序漸進,既突出操作系統(tǒng)的基本原理,又強調動手實現(xiàn),適合作為高校計算機類專業(yè)操作系統(tǒng)相關的教材,也適合作為技術人員的參考書。
親自動手設計和實現(xiàn)一個具備基本功能的操作系統(tǒng)內核是學習操作系統(tǒng)的有效方式。本書以作者團隊開發(fā)的基于龍芯指令集的MaQueOS為主線,詳細介紹了操作系統(tǒng)的進程管理、內存管理、文件系統(tǒng)、中斷管理和外設驅動等功能的實現(xiàn)方法。本書采用循序漸進的寫作方式,每一章的內容均是在前一章內容基礎上對功能進行迭代而實現(xiàn)的,最終形成一個完整的操作系統(tǒng)。書中提供了各個關鍵函數(shù)、功能的源代碼,并附有詳細的說明和注釋,讀者可通過研讀代碼理解操作系統(tǒng)不同功能的實現(xiàn)方法以及各個功能間如何實現(xiàn)協(xié)同工作。
前 言
編寫初衷
早在2019年,我們就計劃撰寫一本用于操作系統(tǒng)實驗課程的教材。當時的思路是對基于x86架構的Linux 0.11內核進行深入分析后,從零開始一步一步實現(xiàn)一個用于教學的Linux 0.11操作系統(tǒng)內核。但是,按照這個思路,要分析1萬多行源代碼,所以進展緩慢。幸運的是,龍芯中科基于二十年的CPU研發(fā)經驗和生態(tài)建設積累,于2020年推出了LoongArch架構。我們實驗室于2021年和龍芯中科合作了產學合作項目—“基于LoongArch架構的教學版操作系統(tǒng)內核”。2022年,作為該項目的重要成果,MaQueOS誕生了。
MaQueOS簡介
MaQueOS是一個開源的基于LoongArch架構的教學版操作系統(tǒng)。作為一個教學版操作系統(tǒng),MaQueOS的代碼雖然只有1000多行,但是它實現(xiàn)了操作系統(tǒng)核心的進程管理、內存管理、文件系統(tǒng)、中斷管理和外設驅動等功能子系統(tǒng),并為應用程序提供了16個系統(tǒng)調用接口。
MaQueOS由Linux 0.11內核深度裁剪而來,并完成了從x86架構到LoongArch架構的移植。其中,對所有外設驅動程序(硬盤、鍵盤和顯示器)進行了重寫。除此之外,不同于Linux 0.11支持MINIX文件系統(tǒng)、a.out可執(zhí)行文件和基于管道操作的進程間通信機制,MaQueOS支持自定義的xtfs格式的文件系統(tǒng)、xt格式的可執(zhí)行文件和基于共享內存的進程間通信機制。
其中,xtfs文件系統(tǒng)是一個極小型的文件系統(tǒng),僅用100多行代碼就實現(xiàn)了文件的創(chuàng)
建/刪除、打開/關閉和讀/寫操作,以及文件系統(tǒng)掛載功能。xt可執(zhí)行文件包括一個大小為512字節(jié)的可執(zhí)行文件頭和代碼數(shù)據被鏈接在一起的二進制可執(zhí)行代碼,因此對xt可執(zhí)行文件的加載過程相當簡潔;诠蚕韮却娴倪M程間通信機制的實現(xiàn)也比基于管道操作的進程間通信機制的實現(xiàn)更簡單、高效。
目標讀者
本書詳細地介紹了MaQueOS的實現(xiàn)過程,適合作為高校計算機及相關專業(yè)操作系統(tǒng)原理課程的補充讀物和實驗課程的教材。除此之外,本書也可以作為學習Linux內核原理的讀者的入門參考書。
各章內容簡介
本書以MaQueOS的實現(xiàn)過程為主線,介紹了如何從零開始實現(xiàn)一個操作系統(tǒng)。本書最大的特點是采用循序漸進的方式組織內容,每章的內容都是在上一章內容的基礎上實現(xiàn)的。通過第1~12章內容的迭代,讀者可以對操作系統(tǒng)的實現(xiàn)過程有更加深入的理解。
本書大部分章都有一個(或者多個)實例,用于驗證該章實現(xiàn)的功能。第1~12章的最后都安排了數(shù)量不等的任務,讀者可以通過完成這些任務,更好地掌握各章的內容。本書各章的主要內容如下:
第0章:簡述MaQueOS支持的功能,以及驗證這些功能的測試應用程序。
第1章:介紹顯示器的組成以及顯示原理,在此基礎上詳細地描述MaQueOS的顯示器驅動程序的實現(xiàn)細節(jié),包括字符的顯示和擦除操作、回車換行的處理、卷屏的操作和刪除字符的過程以及panic函數(shù)。
第2章:介紹LoongArch架構提供的用于產生時鐘中斷的恒定頻率定時器的使用原理,以及LoongArch架構支持的13個中斷類型。然后,介紹時鐘中斷的初始化過程、開中斷的過程,并詳細地描述產生時鐘中斷后MaQueOS處理時鐘中斷的過程。
第3章:介紹MaQueOS的物理內存管理機制,描述MaQueOS在內核態(tài)下使用的虛擬地址到物理地址的地址轉換模式,并重點介紹3A處理器和7A橋片中與中斷有關的控制器的功能,以及鍵盤驅動程序的實現(xiàn)。
第4章:介紹MaQueOS使用的虛擬內存管理機制,重點描述MaQueOS使用的基于二級頁表結構的頁表映射;描述MaQueOS在用戶態(tài)下使用的虛擬地址到物理地址的地址轉換模式,以及如何在二級頁表結構中建立虛擬頁和物理頁之間的映射關系;描述用于進程管理的數(shù)據結構(進程描述符)、進程0的創(chuàng)建過程,以及從內核態(tài)進入用戶態(tài)運行進程0的可執(zhí)行代碼的過程、TLB重填例外的處理過程和時鐘中斷處理過程。
第5章:介紹MaQueOS為應用程序提供服務的系統(tǒng)調用的處理過程,主要包括在用戶態(tài)下調用系統(tǒng)調用、從用戶態(tài)進入內核態(tài)后保存中斷現(xiàn)場、系統(tǒng)調用的處理過程和系統(tǒng)調用的返回等。最后,介紹在CPU上運行多個進程時,MaQueOS引入的基于時間片的進程間切換機制。
第6章:討論MaQueOS的進程掛起、喚醒與終止機制,重點描述子進程如何向父進程發(fā)送終止信號、父進程如何接收并處理終止信號以及最終父進程如何釋放子進程占用的系統(tǒng)資源。
第7章:介紹SATA硬盤的接口標準AHCI,并基于AHCI接口標準詳細描述SATA硬盤的初始化和讀寫過程。在讀寫硬盤過程中涉及的硬盤中斷處理過程類似于第3章中介紹的鍵盤中斷處理過程。
第8章:介紹MaQueOS目前唯一支持的xtfs文件系統(tǒng),包括xtfs文件系統(tǒng)的格式和涉及的數(shù)據結構;詳細地描述如何將一個硬盤鏡像文件格式化為xtfs文件系統(tǒng),以及如何將一個普通文件復制到xtfs文件系統(tǒng)。
第9章:介紹MaQueOS如何掛載第8章中介紹的xtfs文件系統(tǒng),以及MaQueOS目前唯一支持的xt可執(zhí)行文件格式;描述專門為MaQueOS開發(fā)的用于和用戶進行交互的shell程序xtsh的實現(xiàn);著重介紹MaQueOS加載運行xt可執(zhí)行文件的過程。
第10章:介紹頁無效例外和頁修改例外的觸發(fā)條件,以及可能發(fā)生頁無效例外和頁修改例外的場景;描述在前幾章內容的基礎上實現(xiàn)的MaQueOS對頁無效例外和頁修改例外的支持;介紹頁無效例外和頁修改例外在LoongArch架構中的觸發(fā)條件,以及發(fā)生頁無效例外和頁修改例外后的處理過程。
第11章:介紹MaQueOS支持的基于共享內存的進程間通信機制,以及共享內存機制在MaQueOS中的具體實現(xiàn);說明由于共享內存機制的引入,對復制和釋放頁表操作的修改;詳細介紹MaQueOS支持的軟件定時器的實現(xiàn)原理。
第12章:介紹xtfs文件系統(tǒng)中基本文件操作的具體實現(xiàn),包括文件的創(chuàng)建、刪除、打開、關閉和讀寫等。
附錄:附錄A介紹如何搭建實驗環(huán)境;附錄B介紹在MaQueOS中使用的LoongArch匯編指令;附錄C對MaQueOS涉及的LoongArch控制狀態(tài)寄存器進行說明;附錄D介紹MaQueOS內核代碼使用的庫函數(shù),這些庫函數(shù)都位于include目錄下的xtos.h頭文件中;附錄E描述飛機大戰(zhàn)程序的概要設計。
致謝
感謝參與“基于LoongArch架構的教學版操作系統(tǒng)內核”項目的蘭州大學信息科學與工程學院的研究生和本科生。他們是:
前期在分析、裁剪Linux 0.11內核源碼過程中,參與文件系統(tǒng)部分工作的錢浩萊、李城煒、葉楚瑋同學,參與內存管理部分工作的邵嵐曄、陳之帆、張昱寬同學,參與引導系統(tǒng)部分工作的魯葉木、孔俊同學,參與進程管理部分工作的陶蒙媛、王天同、馮柳源同學,參與中斷系統(tǒng)部分工作的孫川卜同學,參與字符設備部分工作的徐楚佳、張浩文同學,參與塊設備部分工作的張芝林、張鈞同學。
后期在從x86架構移植到LoongArch架構過程中,參與移植工作的邵若忱、蔣遠博、呂銳、王天一、葉清揚、聶嘉一同學。
在本書撰寫過程中,參與資料準備和部分編寫工作的程延博、張斯奕、王鶴陽、楊柳、吳鴻杰、李豐耘同學,以及參與校稿的安卓君同學。
最后特別感謝機械工業(yè)出版社的各位編輯為本書出版提供的專業(yè)意見和建議。
聯(lián)系我們
如果您發(fā)現(xiàn)書中有任何問題,或者對本書有任何意見、建議,請通過郵箱dslab@lzu.edu.cn與作者聯(lián)系。
作 者
2024年1月
周慶國,1973年出生,福建人,理學博士,教授,博士生導師,蘭州谷歌開發(fā)者社區(qū)(Lanzhou GDG)負責人,現(xiàn)任蘭州大學分布式與嵌入式系統(tǒng)實驗室主任、開源軟件與實時系統(tǒng)工程研究中心副主任。已在國內外學術期刊上發(fā)表論文 51 篇(SCI 7 篇,EI 24 篇)。
目 錄
前言
第0章 緒論1
0.1 MaQueOS的功能1
0.1.1 進程管理2
0.1.2 內存管理4
0.1.3 文件系統(tǒng)4
0.1.4 外設驅動5
0.1.5 中斷管理5
0.2 系統(tǒng)功能測試5
第1章 顯示器驅動7
1.1 顯示器的顯示原理7
1.1.1 顯示模式7
1.1.2 字符顯示7
1.2 printk函數(shù)10
1.2.1 顯示字符串10
1.2.2 字符擦除12
1.2.3 回車換行13
1.2.4 卷屏13
1.2.5 刪除字符14
1.2.6 panic函數(shù)15
1.3 本章任務15
第2章 時鐘中斷16
2.1 時鐘中斷初始化16
2.1.1 恒定頻率定時器16
2.1.2 初始化17
2.1.3 開中斷18
2.2 時鐘中斷的處理過程18
2.2.1 中斷硬件18
2.2.2 中斷現(xiàn)場保存與恢復19
2.2.3 中斷處理21
2.2.4 中斷返回21
2.3 本章任務22
第3章 鍵盤驅動23
3.1 物理內存管理23
3.1.1 初始化24
3.1.2 申請25
3.1.3 釋放26
3.2 初始化鍵盤中斷27
3.3 鍵盤中斷的處理過程29
3.4 本章任務32
第4章 進程0的創(chuàng)建與運行34
4.1 虛擬內存管理34
4.1.1 初始化35
4.1.2 建立頁表映射37
4.2 創(chuàng)建進程038
4.3 進程0的運行41
4.3.1 進程0進入用戶態(tài)41
4.3.2 TLB重填例外的處理過程42
4.4 時鐘中斷的處理過程44
4.4.1 中斷響應及處理44
4.4.2 中斷返回46
4.5 本章任務46
第5章 進程1的創(chuàng)建與運行48
5.1 創(chuàng)建進程148
5.1.1 系統(tǒng)調用48
5.1.2 fork系統(tǒng)調用51
5.1.3 系統(tǒng)調用返回54
5.2 進程切換55
5.2.1 時鐘中斷55
5.2.2 從進程0切換到進程156
5.2.3 進程1的運行59
5.3 本章任務59
第6章 進程的掛起、喚醒與終止60
6.1 不可中斷掛起與喚醒60
6.1.1 不可中斷掛起62
6.1.2 喚醒不可中斷掛起進程64
6.2 可中斷掛起與喚醒65
6.3 進程終止66
6.3.1 exit系統(tǒng)調用66
6.3.2 釋放進程資源67
6.4 本章實例69
6.5 本章任務72
第7章 硬盤驅動73
7.1 初始化硬盤73
7.2 讀寫硬盤77
7.2.1 發(fā)送讀寫命令77
7.2.2 硬盤中斷處理78
7.3 硬盤讀寫實例80
7.3.1 創(chuàng)建硬盤鏡像文件81
7.3.2 讀硬盤82
7.3.3 寫硬盤85
7.4 本章任務86
第8章 xtfs文件系統(tǒng)87
8.1 xtfs文件系統(tǒng)概述87
8.2 格式化xtfs文件系統(tǒng)87
8.2.1 格式化xtfs.img88
8.2.2 格式化實例88
8.3 文件復制89
8.3.1 加載0/1號數(shù)據塊90
8.3.2 復制數(shù)據塊90
8.3.3 創(chuàng)建數(shù)據塊索引表92
8.3.4 初始化inode數(shù)據結構93
8.3.5 寫回0/1號數(shù)據塊94
8.3.6 復制實例94
8.4 本章任務97
第9章 進程1加載可執(zhí)行文件98
9.1 掛載xtfs文件系統(tǒng)98
9.2 xt可執(zhí)行文件100
9.2.1 編譯xt可執(zhí)行文件100
9.2.2 shell程序102
9.3 加載可執(zhí)行文件104
9.4 進程1的運行108
9.5 本章實例109
9.6 本章任務109
第10章 頁例外111
10.1 頁無效例外111
10.1.1 觸發(fā)頁無效例外112
10.1.2 處理頁無效例外114
10.2 頁修改例外116
10.2.1 觸發(fā)頁修改例外118
10.2.2 處理頁修改例外118
10.3 本章實例120
10.4 本章任務122
第11章 進程間通信123
11.1 共享內存123
11.1.1 初始化123
11.1.2 與共享頁建立映射的
虛擬頁125
11.1.3 shmem系統(tǒng)調用127
11.1.4 復制頁表128
11.1.5 釋放頁表129
11.1.6 共享內存實例130
11.2 軟件定時器131
11.2.1 軟件定時器的實現(xiàn)原理131
11.2.2 軟件定時器實例133
11.3 本章任務134
第12章 文件操作135
12.1 創(chuàng)建文件135
12.1.1 創(chuàng)建文件的過程135
12.1.2 創(chuàng)建文件實例137
12.2 寫文件140
12.2.1 打開文件的過程140
12.2.2 寫文件的過程141
12.2.3 關閉文件的過程142
12.2.4 寫文件實例144
12.3 讀文件146
12.3.1 讀文件的過程146
12.3.2 讀文件實例146
12.4 刪除文件147
12.4.1 刪除文件的過程147
12.4.2 刪除文件實例149
12.5 本章任務150
附 錄151
附錄A 實驗環(huán)境的搭建151
附錄B LoongArch匯編指令153
附錄C LoongArch控制狀態(tài)寄存器157
附錄D MaQueOS庫函數(shù)159
附錄E 飛機大戰(zhàn)程序設計163