自製作業系統流程筆記(二)

2022-09-08 08:57:12 字數 3871 閱讀 6485

筆記一主要記錄了保護模式的知識,筆記二將從os進入保護模式開始。

參考:使用diskgenius模擬軟盤檔案做實驗。

fat12是microsoft公司dos作業系統所支援的檔案系統之一,此外還有fat16和fat32,之後會分別詳述這些檔案系統。

當軟盤被標準格式化後,磁碟被格式化為:每磁頭80個柱面(磁軌),每個柱面有18個扇區,每個扇區有512位元組空間。所以標準軟盤的總空間(容量)為:

每個扇區512位元組。

作業系統標識fat12檔案系統是因為在邏輯0扇區(即引導扇區)處還儲存著乙個特定的資料結構,此結構有固定的格式,在作業系統將此磁碟格式化時自動生成,具體資料結構如下表所示:

偏移13處的是每簇所占用的扇區,型別是位元組,簇是資料儲存的最小單位,此字段的值取決於分割槽的大小,在fat12格式下一般為1,即每簇只有1個扇區(512位元組),簇越大,那麼分割槽的容量也就越大,通過增加簇的扇區數,可以支援更大的磁碟分割槽,標準的簇大小為1、2、4、8、16、32、64和128,fat12格式下只能管理2^12個簇(4096),所以在fat12格式下能管理和分配的最大空間為:4096*1*512=2097152b=2m,所以fat12一般只適合3.5寸高密度軟盤(1.44m)。

檔案分配表所在的扇區應該是(隱藏扇區+保留扇區)=0+1=第1扇區處,從第1扇區開起到第9扇區結束,第乙個檔案分配表共占用9個扇區,第二個檔案分配表從第10個扇區開始到第18扇區結束,在引導扇區的資料結構中明明確的指出了這些位置。

檔案分配表資料結構如下圖所示:

在fat表開始扇區的第1位元組是儲存介質,0f0h代表軟盤,0f8代表硬碟;第2、3這兩個位元組都是0ffh,代表了fat檔案分配表識別符號,從第四個位元組開始與使用者資料區所有的簇一一對應,應該注意的是,使用者資料區的第乙個簇的序號是002,而不是000,因為儲存介質和識別符號占用了這兩個序號。

在fat12格式中用12位元位來代表乙個簇的序號,我們知道,每個位元組有8位位元,所以每個簇要占用1.5個位元組,也就是說,占用了第1位元組和第2位元組的一半才能表示乙個簇的序號,半位元組的拆分辦法按照下圖的方式進行:

最終我們得到了這4個簇號的內容,內容是0ff0-0ff7h代表壞簇,磁軌或柱面損壞不可使用,在格式式磁碟時由系統自動填充;內容是0ff8-0fffh代表檔案內容結束,到此簇為止;其它的值代表著下乙個簇號,接著我們分析一下剛才得到的那4個簇號的內容代表的意義,第2簇號的內容是0fffh,代表這個檔案只占用了第2簇,檔案的大小在512b(每簇1扇區512位元組)之內。第3簇號的內容是004h,代表它的下乙個簇是第4簇;第4簇號的內容是005h,代表它的下乙個簇是第5簇,第5簇號的內容是0fffh,代表檔案內容結束,所以這個檔案應該是從第3簇開始到第5簇結束,佔據了3簇的空間,檔案大小在1536b(每簇1扇區512位元組)之內。

檔案目錄項最開始位於扇區19(隱藏隱藏+保留扇區+fat檔案分配表占用扇區=0+1+9+9)處,它一共占用了14個扇區的空間,在引導扇區的資料結構中偏移17處的字段bpb_rootentcnt指出了最大根目錄數,在fat12中的預設值是224,每個檔案目錄項占用了32位元組的空間,那麼共占用224*32/512=14扇區。

檔案目錄項的32位元組資料結構如下圖所示:

位於偏移11處的是檔案屬性,使用位元位來設定值:

00000000:普通檔案,可隨意讀寫

00000001:唯讀檔案,不可改寫

00000010:隱藏檔案,瀏覽檔案時隱藏列表

00000100:系統檔案,刪除的時候會有提示

00001000:卷標,作為磁碟的卷識別符號

00010000:目錄檔案,此檔案是乙個子目錄,它的內容就是此目錄下的所有檔案目錄項

00100000:歸檔檔案

檔案的屬性可以疊加使用,可以具有多重屬性,即設定為唯讀的時候也可以同時隱藏。

偏移12處的共10位元組長的內容沒有使用,保留。

偏移22處的是雙位元組長的檔案最後修改時間,使用的方式是分位壓縮儲存方式,兩個位元組共16位從高到低分別儲存時分秒的數值,其中時占用5位(11-15),值從0-23,代表小時;分占用6位(5-10),值從0-59,代表分鐘;秒占用5位(0-4),值為0-29,它的倍數(值*2)就得到秒數。

偏移24處的是雙位元組長的檔案最後修改日期,使用的方式是分位壓縮儲存方式,兩個位元組共16位從高到低分別儲存年月日的數值,其中年占用7位(9-15),值從0-199,此值加上1980就可以得到年份,代表從1980到2023年;月占用4位(5-8),值從1-12,代表月份;日占用5位(0-4),值從1-31,代表當月天數。

位於偏移26處的是雙位元組長的檔案首簇號,利用此值就可以得到檔案內容占用的第乙個簇,然後在檔案分配表中就可以得到所有的檔案簇了。檔案分配表中第乙個簇號為002,即檔案目錄項結束後的第乙個簇(扇區,若每簇扇區為數為1)。

最後位於偏移28處的雙字(4b)長的檔案長度(位元組)值。

每個檔案目錄項的長度是32位元組,偏移0處的8位元組長的檔名,必須是大寫的ascii字串,不足8位元組就以空格(20h)來填充,接著是3位元組長的檔案字尾名,同樣是大寫的ascii字串,不足3位元組以空格填充。如果檔名的第1位元組是0e5h表示此檔案已經刪除,第1位元組是0表示此目錄項可用。

參考:2.1 elf檔案概覽

首先,elf檔案格式提供了兩種檢視,分別是鏈結檢視和執行檢視。

鏈結檢視是以節(section)為單位,執行檢視是以段(segment)為單位。鏈結檢視就是在鏈結時用到的檢視,而執行檢視則是在執行時用到的檢視。上圖左側的視角是從鏈結來看的,右側的視角是執行來看的。總個檔案可以分為四個部分:

程式頭部表(program header table),如果存在的話,告訴系統如何建立程序映像。

節區頭部表(section header table)包含了描述檔案節區的資訊,比如大小、偏移等。

2.2 elf header

elf header 結構體:

#define ei_nident 16typedef 

struct

elf32_ehdr;

常用資料格式:

2.3 programma header table 資料結構

描述的是段在檔案中的位置、大小以及它被放進記憶體後所在的位置和大小

p_type   當前programma header所描述的段的型別

p_offset  段的第乙個位元組在檔案中的偏移

p_vaddr  段的第乙個位元組在記憶體中的虛擬位址

p_filesz   段在檔案中的長度

p_memsz   段在記憶體中的長度

p_flags  與段相關的標誌

p_align  根據此項值來確定段在檔案以及記憶體中如何對齊

自製作業系統 二

組合語言學習與makefile入門 2.helloos.nas程式核心部分。jmp指令 jump,跳轉。相當於c中的goto。mov指令 move,移動。理解mov指令就理解彙編一大半。指賦值的功能 把乙個東西移走了,他原來占用的位置不會空出 3.cpu的一種儲存電路 暫存器,相當於變數的功能。以下...

自製作業系統(二)

現在呢,大致流程寫在下面 首先,編寫彙編 檔名為myos.asm,所有 大致如下 下面是標準fat12格式軟盤專用 db 0xeb,0x4e,0x90 db myos ipl 啟動區名稱,必須8位元組 dw 512 每個扇區必須為512位元組 db 1 蔟必須為1個扇區 dw 1 fat的起始位置必...

自製作業系統 (2)

接上篇,檔案跳轉到了entry.s裡面,這是kernel的入口。首先面臨這麼乙個問題,kernel被載入到了什麼地方?回想上篇elf檔案的載入機制,以及objdump裡列印出的kernel資訊,可以看到,kernel的 段 text段 被載入到了0x100000的位置,也就是1m的位置,所以記憶體布...