前言
時(shí)隔四個(gè)多月,終于把 這個(gè)系列寫完了,我把它們整合起來做成了這個(gè) ,并命名為給操作系統(tǒng)捋條線。在寫第一篇計(jì)算機(jī)啟動(dòng)的時(shí)候,我就說過想要通過 給操作系統(tǒng)的前前后后,里里外外捋一條線出來,讓自己讓大家都對(duì)操作系統(tǒng)有個(gè)清晰的認(rèn)識(shí)。
可能有朋友還不知道 是個(gè)什么東西,都說 的 課程是學(xué)習(xí)操作系統(tǒng)的神級(jí)課程,而 就是其教學(xué)使用的操作系統(tǒng)。 這個(gè)系統(tǒng)本身很小,但麻雀雖小五臟俱全,基本的機(jī)制它都具備,用它來學(xué)習(xí)理清操作系統(tǒng)再好不過。從第一篇寫到現(xiàn)在私以為把線捋得還是挺清楚的,有一個(gè)完整的邏輯閉環(huán)。在寫之前我就有想過要用一條線一張圖把操作系統(tǒng)各個(gè)方面給串起來,整個(gè)系列寫完之后, 發(fā)覺有點(diǎn)異想天開了,嘗試了很久沒成功。
我分為了五個(gè)大的部分:?jiǎn)?dòng),中斷,文件系統(tǒng),進(jìn)程,控制臺(tái),其他部分比如說內(nèi)存管理,鎖等等都是分散在那五大部分里面。每個(gè)部分我都盡量細(xì)致到各個(gè)方面,并且附有詳細(xì)的文字描述或者流程圖
比如說啟動(dòng)流程圖

再比如中斷流程圖

又比如讀寫文件的流程圖

看著這些圖感覺還行是吧,較為繁雜的部分基本都有類似的流程圖,私以為將 捋得還是很順很清楚的。《給操作系統(tǒng)捋條線》主要講述了下面這些問題,看看你是否清楚:
計(jì)算機(jī)啟動(dòng): 的計(jì)算機(jī)啟動(dòng)過程與常見的一些啟動(dòng)過程稍稍不同,主要是 和 揉在一起了,其他的沒什么,比較常規(guī),可能就是多處理器的情況可能大家不太熟悉,這一塊大概有這么一些問題:
->->->-> 啟動(dòng)的大概過程? 實(shí)模式如何到保護(hù)模式? 如何開啟分頁機(jī)制? 邏輯地址,虛擬地址,線性地址,物理地址如何轉(zhuǎn)化的? 如何讀取磁盤加載內(nèi)核? 多處理器的話又是如何啟動(dòng)的?
中斷與系統(tǒng)調(diào)用:兩者的過程差不太多,只不過一個(gè)中斷源來源于外部,一個(gè)來源內(nèi)部,在內(nèi)核部分,兩者的處理過程基本一樣,這一塊兒大概有這些問題:
中斷與異常的關(guān)系?
什么是軟件中斷? 軟件中斷和軟中斷是一個(gè)東西嗎?
中斷控制器 PIC、APIC 的基本認(rèn)識(shí)?
多個(gè)處理器多種中斷,哪個(gè)處理器處理哪個(gè)中斷呢?
中斷的處理過程
向量號(hào),IDT,中斷服務(wù)程序(如何定位中斷服務(wù)程序)? 現(xiàn)場(chǎng)的保存與恢復(fù)到底什么意思? 發(fā)生中斷期間棧是如何變化的? 系統(tǒng)調(diào)用大致過程?
系統(tǒng)調(diào)用時(shí)用戶程序的參數(shù)如何傳遞給內(nèi)核?
文件系統(tǒng): 將文件系統(tǒng)分為了 7 層,,大概有這些問題:
磁盤驅(qū)動(dòng)程序(磁盤如何讀寫)? 一個(gè)簡(jiǎn)單的日志系統(tǒng)如何設(shè)計(jì)? 為什么日志系統(tǒng)能夠保證數(shù)據(jù)的一致性? ,文件,目錄,目錄項(xiàng),文件描述符,文件結(jié)構(gòu)體它們之間到底什么關(guān)系? 一切皆文件怎么理解,為什么 , 這兩個(gè)系統(tǒng)調(diào)用就可以讀寫任意類型的文件? 目錄項(xiàng),硬鏈接,軟鏈接到底什么意思,有什么關(guān)系? 常見的文件系統(tǒng)調(diào)用比如 如何實(shí)現(xiàn)的?
進(jìn)程
如何創(chuàng)建一個(gè)進(jìn)程( 實(shí)現(xiàn))? 第一個(gè)進(jìn)程如何創(chuàng)建的? 程序是如何從磁盤加載到內(nèi)存的( 實(shí)現(xiàn))? 一個(gè)進(jìn)程如何被調(diào)度上 ? 常見的調(diào)度算法及其利弊? 進(jìn)程如何切換(頁表,,棧,上下文等是如何變化的)? 進(jìn)程的休眠喚醒如何實(shí)現(xiàn)? 進(jìn)程的等待退出如何實(shí)現(xiàn)? 孤兒進(jìn)程,僵尸進(jìn)程什么意思? 程序從 開始執(zhí)行(簡(jiǎn)單了解了解運(yùn)行庫(kù))? 堆到底是個(gè)什么玩意兒?如何實(shí)現(xiàn)?如何組織管理?
內(nèi)存管理:
的物理內(nèi)存是如何管理的,虛擬內(nèi)存又是如何管理的? 虛擬地址空間應(yīng)該如何理解? 地址 0 真的就不能訪問? 所謂的分配內(nèi)存做了些什么事
鎖:
自旋鎖如何設(shè)計(jì)? 休眠鎖如何設(shè)計(jì)? 常見死鎖判斷
控制臺(tái):
鍵盤的簡(jiǎn)單認(rèn)識(shí) 顯卡的簡(jiǎn)單認(rèn)識(shí) 串口的簡(jiǎn)單認(rèn)識(shí) 按下一個(gè)鍵到輸出到屏幕這之間的詳細(xì)過程? 函數(shù)如何實(shí)現(xiàn)的 為什么文件描述符 0、1、2 就表示標(biāo)準(zhǔn)輸入輸出錯(cuò)誤呢? 如何實(shí)現(xiàn)的 重定向什么意思,如何實(shí)現(xiàn)? 管道什么意思,如何實(shí)現(xiàn)? 一些常用命令如 、 等等如何實(shí)現(xiàn)的?
大概就這些吧,把這些問題捋清楚,那么對(duì)于操作系統(tǒng)的認(rèn)識(shí)應(yīng)該比較清楚了。
其實(shí)有自己的文檔,我反復(fù)看過幾遍,覺得其實(shí)不太適合上手閱讀, 的文檔只是講述了一些重要部分,這不可避免的知識(shí)點(diǎn)分散。而我寫的 系列文章大概涵蓋了 的代碼,重要部分,細(xì)節(jié)部分基本上完全覆蓋,是真正地形成了一個(gè)完整詳盡的邏輯閉環(huán)。
另外我也向諸位坦白地講,本人的水平不高,其中的一些復(fù)雜機(jī)制我也不是太懂,比如說硬件部分,比如說鎖的問題,再者有些機(jī)制為什么要這么設(shè)計(jì),有什么好處,不這樣設(shè)計(jì)行不行等等問題。關(guān)于 若略過一些細(xì)節(jié)只了解操作系統(tǒng)如何運(yùn)作的,這件事還是很簡(jiǎn)單的,可一旦深入細(xì)節(jié),多問自己幾個(gè)為什么,一些看似簡(jiǎn)單的問題都可能變得很復(fù)雜,這似乎是自找麻煩,但學(xué)習(xí)不就是這樣的嗎?
關(guān)于代碼我上傳了一份有“詳盡”注釋的版本,配合著本資料,看起來應(yīng)該容易些,里面也還有各種手冊(cè)資料,本資料也在里面,有需要的可以下載,在我公眾號(hào)后臺(tái)回復(fù) xv6
即可獲取,或者在后臺(tái)點(diǎn)擊精品資源中的 捋xv6
即可獲取鏈接
對(duì)于《給操作系統(tǒng)捋條線》有什么問題還請(qǐng)批評(píng)指正,也歡迎大家來同我探討學(xué)習(xí)交流,將其不斷完善。最后, ......,這份資料確是我這幾個(gè)月的心血,夜夜咖啡伴,頭發(fā)根根掉,身體滑千丈,捋出一條線,若對(duì)大家卻有幫助,還望關(guān)個(gè)注,在此拜謝。