從這篇文章開始,你將跟隨我進入這個操作系統的夢想之旅!
不用擔心,每一章的內容都會很少,不用帶著沉重的負擔去學習像讀小說一樣跟我讀
話不多說,直奔主題當你按下開機鍵,主板上預先寫好的固件程序BIOS會將硬盤引導區的512字節數據原封不動的復制到內存中的0x7c00,跳轉到那個位置執行
引導區的定義非常簡單只要硬盤中0盤0通道1扇區512字節的后兩個字節分別是0x55和0xaa,BIOS就會認為是引導區
所以對于我們理解操作系統來說,此時的BIOS只是一個代碼搬運工,將512字節的二進制數據從硬盤運送到內存中所以作為操作系統的開發者,只需要將操作系統的初始代碼編譯存儲在硬盤的磁盤0,通道0,扇區1即可之后,BIOS會幫我們把它放在內存里,跳過去執行
Linux—0.11的初始代碼就是這個用匯編語言寫的bootsect.s,位于boot文件夾下。
通過編譯,這個bootsect.s會被編譯成二進制文件,存儲在引導區的第一個扇區。
然后就像剛才說的,會從BIOS移到內存0x7c00,CPU從這個位置開始,繼續無腦的執行一條又一條語句。
那么我們的夢想之旅就從這個文件的第一行代碼開始吧!
movax,0x07c0movds,ax
好了,先看兩行。
這段代碼是用匯編語言編寫的,這意味著將值0x07c0復制到ax寄存器中,然后將ax寄存器中的值復制到ds寄存器中實際上,所有這些折騰的結果是,這個寄存器ds中的值變成了0x07c0
Ds是一個16位段寄存器,它專門代表數據段寄存器,并在尋址存儲器時充當段基址你什么意思
movax,
實際上相當于
movax,
默認添加Ds,這意味著在ds的這一段的基址,未來偏移0x0001個單位,并將該位置的存儲器數據復制到ax寄存器中。
打個比喻,你跟朋友商量一下去哪里玩比較好你說天安門廣場,南鑼鼓巷,頤和園等等都是偏置地址,省略了北京的基址
當然,你可以說北京的天安門廣場和北京的南鑼鼓巷,每次都加上前綴北京但是,如果你提前和朋友約定好,我下面說的地方都是北京的,那你就不用每次都背北京二字了方便嗎
這是數據段寄存器ds的功能描述一個內存地址很方便,可以省略一個基址這沒什么神奇的
ds : 0x0001
北京:南鑼鼓巷
看,這個ds是賦給0x07c0的由于x86要在16位實模式下訪問20位地址線的歷史因素,段基址必須先左移4位然后0x07c0左移四位為0x7c00,與BIOS加載此代碼的存儲器地址0x7c00完全相同
也就是說后面寫的代碼和里面訪問的數據的內存地址都默認加0x7c00,然后在內存中尋址。
為什么統一加數字0x7c00這很容易解釋BIOS規定,當操作系統代碼加載到內存0x7c00時,里面的各種數據自然會偏移這么多因此,將數據段寄存器ds設置為該值便于將來通過該基地址訪問存儲器中的數據
好了,快速消化前面的知識,那么這篇文章就結束了,只有兩行代碼,小知識,我不騙你。
我希望你能做到可以通過BIOS將操作系統代碼加載到內存0x7c00中,我們可以通過mov指令將默認數據段寄存器ds寄存器的值改為0x 07c 00,方便以后的基址尋址這兩件事在你腦子里是認可的,沒有疑問,方便后面繼續
我們身后的世界越來越精彩欲知后事如何,且聽下回分解
鄭重聲明:此文內容為本網站轉載企業宣傳資訊,目的在于傳播更多信息,與本站立場無關。僅供讀者參考,并請自行核實相關內容。
|