在製作作業系統的過程中,首先的第一步就是要載入核心,但是載入核心又涉及到乙個很長的話題.
曾經做過乙個fat32檔案系統下載入核心的一整段彙編**,感覺到這樣寫**萬分有壓力,而且這方面的東西,太過底層,甚至上說和作業系統沒有什麼直接的關係.
所以,為了簡化這步驟,我們利用上乙個很強大的載入器,grub2.
如何用grub2等引導程式去
引導我們製作的核心呢?
這裡給出乙個答案:我們必須受到一些約束才能完成這些工作,關於這個約束就是
multiboot
規範(當然還有別的解決辦法)
接下來,我們開始用grub2+multiboot
來引導我們的簡易作業系統核心.
首先,還是介紹一下大致流程做到心中有數,才能以不變應萬變.
準備:1.《multiboot
規範》.pdf
2.
乙個簡易的kernel
3.u
盤或者是虛擬映象
4.
虛擬機器或者實際機器自備
準備工作已經完成,既然我們用到 multiboot規範,我們就該大致了解一下這個規範到底給我們帶來了什麼.
簡略介紹一下multiboot
規範就是為了引導各種不同的作業系統核心而提出的乙個規範,目的可以從名字看出多引導。
而grub2和grub都支援這個規範,所以我們可以利用他引導我們製作的os核心.
流程: 開機->grub ->載入os核心到記憶體->跳到核心**
知道流程後,我們快速解讀一下multiboot規範
1. 引導頭
2. 核心映象
根據規範,我們可以看到我們只需提供乙個資料結構(引導頭),然後將核心檔案編譯核心映象(這裡實際上就是乙個普通的應用程式),我們只需設定引導頭中flage
標誌,便可以完成載入核心的功效,並且我們會得到引導器中返回我們需要的一些資訊,比如(記憶體分配資訊和引導介質的資訊)。
這裡grub幫助我們進入了保護模式,並且從返回的資訊我們可以知道記憶體等資訊,我們只需要設定一下gdt等,核心初始化工作就可以編寫我們需要的核心了.
另外還有乙個需要關注的資訊就是,核心究竟被載入到**去了?
載入的過程和檔案格式有關,比如windows pe,linux elf,都源自一種檔案古老的coff
結構,所以windows
和linux
的程式被載入的過程很像.
但是我們這裡關係的只是載入到記憶體中的問題,這個話題有點跑遠了, 規範中提到預設支援的程式載入格式有很多,我們需要提供一些引數才能順利完成載入.為了方便起見我們最後用elf檔案格式,不需要做任何設定,只需在編譯核心階段制定乙個被載入的虛擬位址即可.
因為分頁機制沒有被開啟,我們的核心僅僅只完成了保護模式的跳轉,我們虛擬位址就等於實體地址...於是,位址的問題解決了.
最後總結一下, 利用grub2+multiboot規範引導我們的核心檔案,,,
我們關心三個問題:
1.如何讓我們的核心映象被 grub識別, 所以我們編譯後核心映象中必須包含這部分,載入器會自動識別,grub的要求引導頭在核心映象是邏輯位址1m之前,這個值當然是越小越好.
2.被載入到記憶體中核心的實體地址,這個位址就是該核心程式的虛擬位址,linux下的程式預設是0x84***x,我們可以通過改變鏈結器ld的選項來更換載入的位址.
3.完成載入後,我們將會得到的資訊 在multiboot規範上都有介紹,如暫存器的初始值,和我們需要得到資訊的位址,請仔細閱讀.
linux核心維護的前期準備工作
sudo apt get install vim libncurses5 dev gcc make git exuberant ctags 建立倉庫目錄 mkdir p git kernels cd git kernels同步核心原始碼到倉庫 git clone b staging next git...
C lua準備工作
ubuntu源裡的lua是5.0的.而最新的是5.2.如果只是學習lua語法什麼的直接apt get就好了.不過如果想做c lua的嵌入工作.就只能自己下原始碼編譯了 步驟 1.依賴的庫 readline,ncurses 這兩個庫可以從網上下原始碼然後編譯安裝.這樣其實最好了 如果不嫌源裡的舊.其實...
單據準備工作
虛擬機器 uap studio nc home 單據開發 基於studio的 單開發。擴充套件開發 對 單進行夥伴級拓展。報表平台 基於 單的分組統計和交叉統計。輕量化 交通費報銷開發。報表平台 語義模型 自由報表 基於模型的開發 實體 列舉及他們之間的關係。實體屬性 資料型別 約束 與業務介面的對...