您好,登錄后才能下訂單哦!
更多的信息請訪問我的CU博客
恍恍然三個月過去了,也三個月沒寫點什么了,這三個月我倒是寫了不少代碼,是時侯把lmos拿出來說說了,這將是lmos的第四個開發版。今年的三個月已經完了,又只有9個月了,時間緊迫的孩紙們要抓緊啦,其實開發操作系統內核就是要足夠的時間,時間越多越好,可往往不如我愿,時間總是不夠用。
先來說說lmos第四個開發版有什么新的特性吧。
1、從這個版本開始,lmos不在支持32位x86體系結構了,而是支持更先進那么一點點的64位x86體系結構了,它的名字叫AMD64。
2、lmos這個版本開始擁有虛擬內存了。這個說起來很復雜,那就等會兒在說。
3、lmos從這個版本開始,支持從U盤啟動了,當然有個前提,那就是你的計算機主板必須支持從U
盤這類USB介質引導你的計算機,這點給想要在物理機上驗證和搗鼓lmos的朋友提供了方便。
為什么lmos從32位突然之間就變成全64位的了,是因為我開發虛擬內存管理器在32位下受到了嚴重的局限性。后來一想以后反正要支持64位的,不如趁早,以免日后麻煩。其實現在物理機的內存容量已經超過4GB了。x86——64體系結構是AMD公司最先定義出來的,這就是為什么叫AMD64的原因。實現AMD64體系結構的時候,他們的工程師被要求這樣,要保證原有32位的os和app,能夠不經過任何修改就能運行在AMD64體系結構上。64位的OS能夠執行未經修改的32位app。在這些保證下還要盡量改進x86.你不得不驚嘆搞x86的工程師們有多偉大、有多痛苦,呵呵。其實AMD64體系結構改得還是不錯的。段 幾乎不起作用了,TSS的作用也改變了,中斷的棧也更加規范了,寄存器全64位了而且寄存器還多了不少,看來他們也知道x86的寄存器太少了,頁表也是4層了,支持4KB,2MB,1GB這幾種大小的頁面。LMOS是全64位的內核,同時也要求應用程序和驅動也是64位的,LMOS不會兼容32位的程序。AMD64的寄存器雖然是64位的,但并不代表它可以訪問0~0xffffffffffffffff之間所有的物理地址,事實上在當前的AMD64體系結構的CPU上只有48根地址線,甚至更少。那么它是怎么做的呢,它要求64位寄存器從48位開始用符號位擴展,也就是說CPU只能訪問這兩個區間的地址:0~0x00007fffffffffff和
0xffff800000000000~0xffffffffffffffff,如果你訪問0x800000000000~0xffff800000000000之間的地址CPU會產生異常。但這一實現非常有利于日后的擴展,我這有幅圖大家可以看看:
這一改變佐證了LMOS的可移植性,因為LMOS內核有硬件抽象層的概念,我只花了幾個周的時間寫了個64位的硬件抽象層,然后把這個層和上層硬件無關的層鏈接起來就完事兒了。也就是說我要把LMOS移植到ARM體系結構上,只要寫個ARM的硬件抽象層外加少許改動就行了,這種設計使lmos成為通用操作系統變成可能。
在來看看這一版本中lmos的虛擬內存管理器。虛擬內存在操作系統理論書籍中只花很少篇幅介紹了那么一點點,實際中虛擬內存可謂重中之重,可謂是操作系統內核的內核。先看看LMOS這一版本中虛擬內存管理器的總框架圖,我畫的很簡陋,大家看看吧:
為什么虛擬內存管理是內核的內核,我舉個例子吧。比如操作系統要描述一個線程,那么就必須要定義一個數據結構來表示一個線程,(說句題外話,我現在才真正明白,C語言書前面那句話:“程序=數據結構+算法”)好了回來,這個表示線程的數據結構只有在內存中有了真正的實例,程序(內核)才能工作。內核為支持多線程那么這種數據結構的實例就需要很多,比如可能有2000個線程你總不能靜態的定義2000個這種數據結構的數組,這樣確實能夠工作,但是這樣使用內存太低效了,太不智能了,因為有可能有時系統中只有兩三個線程,這時就浪費了內存,如果有時系統中超過2000個線程時,這時你沒辦法了。類似這種數據結構系統中是非常多的,通常只有幾10字節、幾100字節到1KB之間。既然靜態的不行,就只有用動態的方法,那就是:要用的時侯就分配并初始化一個數據結構實例,不要時就釋放這個實例所占用的內存空間。LMOS這個版本重新實現了一個更為先進的內存池,來處理這種問題,先說了這種數據結構只有10字節、幾100字節到1KB之間。你總不能一次就分配一個頁面,這叫浪費。內存池就是為解決這個問題的。
現代意義的操作系統,好像都有保護、安全這種類概念,這些概念是怎么實現的呢,CPU提供了一些機制。把一部分關鍵指令規定為特權指令,把程序里出現的訪存地址規定為虛擬地址,要通過地址映射部件映射之后,才能訪問真正的物理內存。這兩套機制形成了編寫現代操作系統的基石。這使得每個進程都有一個獨立的地址空間,而這個空間由于權力不同,可以被分為,用戶空間和內核空間。這樣就形成了一個“保護”的概念。這些概念在lmos中是如何利用的呢,這有個圖:
由上可知,x86——64下 只能訪問兩個區間的地址,既然硬件都是這么實現的,而且這種實現有利于擴展,那么我也沒什么好改的了,0~0x00007fffffffffff的虛擬地址區間為進程的用戶空間,這個空間是每個進程私有的,其它別的進程不能訪問,而且這個區間有虛擬內存管理器分配和映射物理內存。0xffff800000000000~0xffffffffffffffff的虛擬地址區間為LMOS內核空間,這個空間是所有進程共享的,在x86上好像只能這樣了沒有別的選擇,我試過很多種別的空間分配法都沒法成立。只能是上圖那樣的。
LMOS這個版本支持U盤啟動了,為了讓更多的人,能夠在物理機上搗鼓和驗證LMOS內核,我這次重寫了lmos內核的引導程序,以便能從U盤啟動lmos,大家也更能相信LMOS是個真正的玩意兒。U盤也不用很大,32MB就行啦,但是使用前請備份好你U盤中的數據。LMOS會刪除U盤上所有的數據。如果你想搗鼓一下的話,請在linux下插入U盤,然后到/dev目錄下查看你U盤的設備文件名,一般可能是sd(x)這樣的名字,括號中的X是變化的,如果你有兩塊硬盤的話,你就會在/dev目錄下看到:sda、sdb、這樣的設備文件名,當你在插入U盤時,就會看到sdc,找到且確認是U盤的設備文件名后,在終端下切換到放lmos內核文件的目錄下,執行sudo make U_DSK=/dev/sdb,(我的linux下,我的U盤設備文件名是 sdb 所以才能這樣,如果你的不是或者不能確定是不是,千萬別執行上面那條命令),否則造成的數據丟失,本人一概不負責。
虛擬機中安裝,我推薦大家使用這種方式,這樣既不需要另的一塊空U盤,也不需要大家的宿主操作系統是LINUX。大家首先確保你的宿主操作系統中安裝有Oracle VM VirtualBox 虛擬機軟件。如果沒有請大家自行下載相關操作系統版本的Oracle VM VirtualBox并安好。安裝好后,先新建個虛擬機,然后下載(點此下載)本人提供的虛擬機硬盤鏡像。并掛載在虛擬機上,啟動虛擬機即可運行LMOS。這次我還提供了VMDK格式的硬盤鏡像。方便使用VM虛擬機的朋友。
最后說說這次的shell,我提供了幾條極為簡單的命令:
r 重啟計算機 如下圖
t 查看lmos內部的進程、線程數 如下圖
m 查看計算機物理內存的使用情況 如下圖
p 查看計算機內部的pci總線和設備 如下圖
LMOS內核鏡像包下載
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。