核心引導的捷徑 準備工作

2021-06-22 13:26:28 字數 1818 閱讀 1740

在製作作業系統的過程中,首先的第一步就是要載入核心,但是載入核心又涉及到乙個很長的話題.

曾經做過乙個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的 單開發。擴充套件開發 對 單進行夥伴級拓展。報表平台 基於 單的分組統計和交叉統計。輕量化 交通費報銷開發。報表平台 語義模型 自由報表 基於模型的開發 實體 列舉及他們之間的關係。實體屬性 資料型別 約束 與業務介面的對...