幾個(gè)學(xué)習(xí)鏈接:
https://www.cnblogs.com/LexMoon/p/How_to_Make_a_Computer_Operating_System.html
https://github.com/SamyPesse/How-to-Make-a-Computer-Operating-System
這兩個(gè)連接有點(diǎn)復(fù)雜坪郭,vagrant很難用的樣子,所以放棄了
https://www.cnblogs.com/LexMoon/p/antz01.html
這個(gè)里面有nasm什么的工具溜在,看不懂阶淘,所以放棄了
以上幾個(gè)大神博客里寫了引導(dǎo)過程摹恰,我盡量理解一下吊奢,大神自問自答了挺多键耕,方便我這種菜雞理解枫振。
第一個(gè)大神:
什么是x86架構(gòu)?
x86是指一組基于Intel 8086 CPU的向后兼容指令集架構(gòu)。
引導(dǎo)是如何工作的?
當(dāng)一臺(tái)基于x86的計(jì)算機(jī)被啟動(dòng)時(shí)蒋纬,它會(huì)經(jīng)歷一段很復(fù)雜的路程猎荠,以到達(dá)將控制權(quán)轉(zhuǎn)移到內(nèi)核“主”例程(“kmain()”)的階段。
BIOS引導(dǎo)序列為:RAM檢測(cè)->硬件檢測(cè)/初始化->引導(dǎo)序列蜀备。
對(duì)我們來說最重要的步驟是“引導(dǎo)序列”关摇,此時(shí)BIOS完成了初始化,并試圖將控制轉(zhuǎn)移到引導(dǎo)加載程序的下一個(gè)階段碾阁。
在“引導(dǎo)順序”期間输虱,BIOS將嘗試確定一個(gè)“引導(dǎo)設(shè)備”(例如軟盤、硬盤瓷蛙、CD悼瓮、USB閃存設(shè)備或網(wǎng)絡(luò))。我們的操作系統(tǒng)最初將從硬盤引導(dǎo)(但是將來可以從CD或USB閃存設(shè)備引導(dǎo)它)艰猬。
如果引導(dǎo)扇區(qū)在偏移量511和512處分別包含有效的簽名字節(jié)' 0x55 '和' 0xAA '(稱為主引導(dǎo)記錄的魔法字節(jié)横堡,也稱為MBR),則認(rèn)為設(shè)備是可引導(dǎo)的冠桃。
此簽名(以二進(jìn)制)表示為0b1010101001010101命贴。交替位模式被認(rèn)為是對(duì)某些故障(驅(qū)動(dòng)或控制器)的保護(hù)。
如果該模式被打亂或0x00食听,則認(rèn)為該設(shè)備不可引導(dǎo)胸蛛。
BIOS通過將每個(gè)設(shè)備的引導(dǎo)扇區(qū)中的前512字節(jié)加載到物理內(nèi)存中來物理搜索引導(dǎo)設(shè)備,加載到從地址“0x7C00”(低于32 KiB標(biāo)記的1 KiB)開始的那么一段內(nèi)存上樱报。當(dāng)檢測(cè)到有效的簽名字節(jié)時(shí)葬项,BIOS將控制傳輸?shù)健?x7C00”內(nèi)存地址(通過跳轉(zhuǎn)指令),以便執(zhí)行引導(dǎo)扇區(qū)代碼迹蛤。
在整個(gè)過程中民珍,CPU一直以16位實(shí)模式運(yùn)行,這是x86 CPU為了保持向后兼容性的默認(rèn)狀態(tài)盗飒。要在內(nèi)核中執(zhí)行32位指令嚷量,需要一個(gè)引導(dǎo)加載程序?qū)PU切換到保護(hù)模式。
挺這意思都是Intel在做8086處理器的時(shí)候逆趣,和BIOS商量好的蝶溶,這BIOS可能就是英特爾出的,像是個(gè)硬件加載器的感覺
什么是GRUB?
GNU GRUB (GNU GRand Unified Bootloader的簡(jiǎn)稱)是GNU項(xiàng)目中的一個(gè)引導(dǎo)加載程序包宣渗。
GRUB是自由軟件基金會(huì)(Free Software Foundation)的多引導(dǎo)規(guī)范的參考實(shí)現(xiàn)抖所,該規(guī)范為用戶提供了從安裝在計(jì)算機(jī)上的多個(gè)操作系統(tǒng)中引導(dǎo)一個(gè)操作系統(tǒng)或選擇特定操作系統(tǒng)分區(qū)上可用的特定內(nèi)核配置的選項(xiàng)梨州。
簡(jiǎn)單來說,GRUB是機(jī)器(引導(dǎo)加載程序)啟動(dòng)的第一件事部蛇,它將簡(jiǎn)化存儲(chǔ)在硬盤上的內(nèi)核的加載
我們?yōu)槭裁匆褂肎RUB?
- GRUB非常容易使用
- 使加載32位內(nèi)核非常簡(jiǎn)單摊唇,不需要16位代碼
- 多引導(dǎo)與Linux, Windows和其他
- 便于在內(nèi)存中加載外部模塊
如何使用GRUB?
GRUB使用多引導(dǎo)規(guī)范,可執(zhí)行二進(jìn)制文件應(yīng)該是32位的涯鲁,并且必須包含一個(gè)特殊的頭(多引導(dǎo)頭),頭8192個(gè)字節(jié)有序。
我們的內(nèi)核將是ELF可執(zhí)行文件(“可執(zhí)行和可鏈接格式”抹腿,大多數(shù)UNIX系統(tǒng)中可執(zhí)行文件的通用標(biāo)準(zhǔn)文件格式)。
我們內(nèi)核的第一個(gè)引導(dǎo)序列是使用匯編編寫的旭寿。
我們使用一個(gè)鏈接器文件來定義我們的可執(zhí)行結(jié)構(gòu)警绩。
這個(gè)引導(dǎo)過程還初始化了一些c++運(yùn)行時(shí),將在下一章中進(jìn)行描述盅称。
Multiboot頭結(jié)構(gòu):
struct multiboot_info {
u32 flags;
u32 low_mem;
u32 high_mem;
u32 boot_device;
u32 cmdline;
u32 mods_count;
u32 mods_addr;
struct {
u32 num;
u32 size;
u32 addr;
u32 shndx;
} elf_sec;
unsigned long mmap_length;
unsigned long mmap_addr;
unsigned long drives_length;
unsigned long drives_addr;
unsigned long config_table;
unsigned long boot_loader_name;
unsigned long apm_table;
unsigned long vbe_control_info;
unsigned long vbe_mode_info;
unsigned long vbe_mode;
unsigned long vbe_interface_seg;
unsigned long vbe_interface_off;
unsigned long vbe_interface_len;
};
您可以使用命令 mbchk kernel.elf
來根據(jù)多引導(dǎo)標(biāo)準(zhǔn)驗(yàn)證kernel.elf文件肩祥。您還可以使用nm -n kernel.elf
驗(yàn)證elf二進(jìn)制文件中不同對(duì)象的偏移量。
這兩個(gè)指令好像挺犀利啊
為內(nèi)核和grub創(chuàng)建一個(gè)磁盤映像
第一步是使用qemu-img創(chuàng)建硬盤映像(c.img):
qemu-img create c.img 2M
我們現(xiàn)在需要使用fdisk來分區(qū)磁盤:
fdisk ./c.img
# Switch to Expert commands 切換到專家命令
> x
# Change number of cylinders (1-1048576) 修改柱面數(shù)量(1-1048576)
> c
> 4
# Change number of heads (1-256, default 16) 改變磁頭數(shù)量(1-256缩膝,默認(rèn)16)
> h
> 16
# Change number of sectors/track (1-63, default 63) 更改磁道數(shù)目(1-63混狠,默認(rèn)63)
> s
> 63
# Return to main menu 返回主菜單
> r
> 真牛逼,專家模式還能定義硬盤參數(shù)
# Add a new partition 添加一個(gè)新分區(qū)
> n
# Choose primary partition 選擇主分區(qū)
> p
# Choose partition number 選擇分區(qū)號(hào)
> 1
# Choose first sector (1-4, default 1) 選擇第一個(gè)扇區(qū)(1-4疾层,默認(rèn)1)
> 1
# Choose last sector, +cylinders or +size{K,M,G} (1-4, default 4) 選擇最后一個(gè)扇區(qū)将饺,+柱面或+大小{K,M,G}(1-4,默認(rèn)4)
> 4
# Toggle bootable flag 切換啟動(dòng)的標(biāo)志
> a
# Choose first partition for bootable flag 為可引導(dǎo)標(biāo)志選擇第一個(gè)分區(qū)
> 1
# Write table to disk and exit 將表寫到磁盤并退出
> w
現(xiàn)在我們需要使用losetup命令將創(chuàng)建的分區(qū)附加到loop設(shè)備上痛黎。這允許像塊設(shè)備一樣訪問文件予弧。
分區(qū)的偏移量作為參數(shù)傳遞并使用:offset= start_扇區(qū) bytes_by_扇區(qū)*計(jì)算。
使用 fdisk -l -u c.img
, 你將得到: 63 * 512 = 32256.
losetup -o 32256 /dev/loop1 ./c.img
我們使用以下命令在這個(gè)新設(shè)備上創(chuàng)建EXT2文件系統(tǒng):
mke2fs /dev/loop1
我們復(fù)制我們的文件在一個(gè)掛載磁盤:
mount /dev/loop1 /mnt/
cp -R bootdisk/* /mnt/
umount /mnt/
在磁盤上安裝GRUB:
grub --device-map=/dev/null << EOF
device (hd0) ./c.img
geometry (hd0) 4 16 63
root (hd0,0)
setup (hd0)
quit
EOF
最后我們分離驅(qū)動(dòng)循環(huán):
losetup -d /dev/loop1
第二個(gè)大神:
1.關(guān)于Boot Sector
引導(dǎo)扇區(qū)(Boot Sector) 通常指設(shè)備的第一個(gè)扇區(qū)湖饱,用于加載并轉(zhuǎn)讓處理器控制權(quán)給操作系統(tǒng)掖蛤。
1.1 主引導(dǎo)扇區(qū)
硬盤的0柱面、0磁頭井厌、1扇區(qū)稱為[主引導(dǎo)扇區(qū)]
該記錄占用512個(gè)字節(jié)蚓庭,它用于硬盤啟動(dòng)時(shí)將系統(tǒng)控制權(quán)轉(zhuǎn)給用戶指定的、在分區(qū)表中登記了某個(gè)[操作系統(tǒng)]分區(qū)旗笔。
MBR的內(nèi)容是在硬盤分區(qū)時(shí)由分區(qū)軟件寫入該扇區(qū)的彪置,MBR不屬于任何一個(gè)操作系統(tǒng),不隨操作系統(tǒng)的不同而不同蝇恶,即使不同拳魁,MBR也不會(huì)夾帶操作系統(tǒng)的性質(zhì),具有公共引導(dǎo)的特性撮弧。
但安裝某些多重引導(dǎo)功能的軟件或LINUX的LILO時(shí)有可能改寫它潘懊,它先于所有的操作系統(tǒng)被調(diào)入內(nèi)存并發(fā)揮作用姚糊,然后才將控制權(quán)交給活動(dòng)主分區(qū)內(nèi)的操作系統(tǒng)。
1.2 MBR成員
1.主引導(dǎo)程序代碼授舟,占446字節(jié)
2. 磁盤簽名
3.硬盤分區(qū)表DPT救恨,占64字節(jié)
4.主引導(dǎo)扇區(qū)結(jié)束標(biāo)志55AAH
硬盤的主引導(dǎo)程序代碼是從偏移0000H開始到偏移01BDH結(jié)束的446字節(jié);
主引導(dǎo)程序代碼包括一小段執(zhí)行代碼释树。
啟動(dòng)PC 機(jī)時(shí)肠槽,系統(tǒng)首先對(duì)硬件設(shè)備進(jìn)行測(cè)試,成功后進(jìn)入自舉程序INT 19H奢啥;
然后讀系統(tǒng)磁盤0[柱面]秸仙、0[磁頭]、1[扇區(qū)]的主引導(dǎo)扇區(qū)MBR的內(nèi)容到內(nèi)存以指定單元0:7C00 首地址開始的區(qū)域桩盲,并執(zhí)行MBR程序段寂纪。
這里要學(xué)習(xí)一下硬盤知識(shí)了
硬盤柱面是硬盤的一個(gè)物理結(jié)構(gòu)部分。
硬盤的主體部分是由鋁合金材料制成的涂以磁性介質(zhì)的數(shù)個(gè)圓形盤片赌结,每個(gè)盤片的兩面涂有磁涂層捞蛋,用來記錄數(shù)據(jù)。
硬盤的柱面柬姚,牽扯到硬盤的[物理結(jié)構(gòu)]:
硬盤的主體部分是由鋁合金材料制成的涂以磁性介質(zhì)的數(shù)個(gè)圓形[盤片]拟杉,串在一個(gè)高速旋轉(zhuǎn)的軸上,不同容量硬盤的盤片數(shù)不等伤靠,每個(gè)盤片的兩面涂有磁涂層捣域,用來記錄數(shù)據(jù)。
盤片被分成許多扇形的區(qū)域宴合,每個(gè)區(qū)域就叫一個(gè)[扇區(qū)]焕梅,每個(gè)扇區(qū)可存儲(chǔ)128×2的N次方(N=0.1.2.3)[字節(jié)]信息。
以盤片中心為圓心卦洽;用不同的半徑贞言;劃分出不同的很窄的圓環(huán)形區(qū)域,稱為[磁道]阀蒂。
上下一串盤片中该窗,相同半徑的磁道所組成的一個(gè)圓柱型的環(huán)壁,就稱為柱面蚤霞。
也就是說酗失,一個(gè)盤片上的一個(gè)扇區(qū),最少能存256Byte昧绣;最多规肴,可以到512,1024,2048Byte?那我平時(shí)總能聽到的2096是咋回事兒拖刃?
還有就是這個(gè)柱面删壮,我現(xiàn)在都是單盤多少T,那也就是只有一個(gè)柱面咯兑牡。
磁頭是硬盤中對(duì)盤片進(jìn)行讀寫工作的工具央碟,是硬盤中最精密的部位之一。
磁頭是用線圈纏繞在磁芯上制成的均函。
硬盤在工作時(shí)亿虽,磁頭通過感應(yīng)旋轉(zhuǎn)的盤片上磁場(chǎng)的變化來讀取數(shù)據(jù);通過改變盤片上的磁場(chǎng)來寫入數(shù)據(jù)苞也。
為避免磁頭和盤片的磨損经柴,在工作狀態(tài)時(shí),磁頭懸浮在高速轉(zhuǎn)動(dòng)的盤片上方墩朦,而不與盤片直接接觸;
只有在電源關(guān)閉之后翻擒,磁頭會(huì)自動(dòng)回到在盤片上的固定位置氓涣,稱為[著陸區(qū)],此處盤片并不存儲(chǔ)數(shù)據(jù)陋气,是盤片的起始位置)劳吠。
[磁盤]上的磁道是一組記錄密度不同的同心圓。
[磁表面存儲(chǔ)器]是在不同形狀(如盤狀巩趁、帶狀等)的載體上痒玩,涂有磁性材料層,工作時(shí)议慰,靠載磁體高速運(yùn)動(dòng)蠢古,由磁頭在磁層上進(jìn)行讀寫操作,信息被記錄在磁層上别凹,這些信息的軌跡就是磁道草讶。
磁盤的磁道是一個(gè)個(gè)同心圓,見右圖炉菲,磁帶的磁道是沿磁帶長(zhǎng)度方向的直線堕战,這些磁道用肉眼是根本看不到的,因?yàn)樗鼈儍H是盤面上以特殊方式磁化了的一些磁化區(qū)拍霜,磁盤上的信息便是沿著這樣的軌道存放的嘱丢。
相鄰磁道之間并不是緊挨著的,這是因?yàn)榇呕瘑卧喔籼鼤r(shí)磁性會(huì)產(chǎn)生相互影響祠饺,同時(shí)也為磁頭的讀寫帶來困難越驻。
一張老式1.44MB的3.5英寸軟盤,一面有80個(gè)磁道,而硬盤上的[磁道密度]則遠(yuǎn)遠(yuǎn)大于此值伐谈,通常一面有成千上萬(wàn)個(gè)磁道烂完。
硬盤的物理結(jié)構(gòu)一般由磁頭與盤片、電動(dòng)機(jī)诵棵、主控芯片與排線等部件組成
當(dāng)主電動(dòng)機(jī)帶動(dòng)盤片旋轉(zhuǎn)時(shí)抠蚣,副電動(dòng)機(jī)帶動(dòng)一組(磁頭)到相對(duì)應(yīng)的盤片上并確定讀取正面還是反面的碟面,
磁頭懸浮在碟面上畫出一個(gè)與盤片同心的圓形軌道(磁軌或稱柱面)履澳,
這時(shí)由磁頭的磁感線圈感應(yīng)碟面上的磁性與使用硬盤廠商指定的讀取時(shí)間或數(shù)據(jù)間隔定位扇區(qū)嘶窄,從而得到該扇區(qū)的數(shù)據(jù)內(nèi)容;當(dāng)磁盤旋轉(zhuǎn)時(shí)距贷,磁頭若保持在一個(gè)位置上柄冲,則每個(gè)磁頭都會(huì)在磁盤表面劃出一個(gè)圓形軌跡,這些圓形軌跡就叫做磁道(Track)忠蝗。
在有多個(gè)盤片構(gòu)成的盤組中现横,由不同盤片的面,但處于同一半徑圓的多個(gè)磁道組成的一個(gè)圓柱面(Cylinder)阁最。
磁盤上的每個(gè)磁道被等分為若干個(gè)弧段戒祠,這些弧段便是硬盤的扇區(qū)(Sector)。硬盤的第一個(gè)扇區(qū)速种,叫做引導(dǎo)扇區(qū)姜盈。
真尼瑪漲知識(shí)
[磁盤]的每一面被分為很多條[磁道],即表面上的一些[同心]圓配阵,
越接近中心馏颂,圓就越小。而每一個(gè)[磁道]又按512個(gè)[字節(jié)]為單位劃分為等分棋傍,叫做扇區(qū)救拉,
剛才上面還說,一個(gè)盤片上的一個(gè)扇區(qū)舍沙,最少能存256Byte近上;最多,可以到512拂铡,1024壹无,2048Byte,怎么這里就變成固定512了感帅。好吧斗锭,以這里為準(zhǔn)。
在一些[硬盤]的[參數(shù)列表]上你可以看到描述每個(gè)磁道的[扇區(qū)數(shù)]的參數(shù)失球,它通常用一個(gè)范圍標(biāo)識(shí)岖是,例如373~746帮毁,
這表示,最外圈的磁道有746個(gè)扇區(qū)豺撑,而最里面的磁道有373個(gè)扇區(qū)烈疚,因此可以算出來,磁道的容量分別是從186.5KB到373KB(190976B--381952B)
[磁盤驅(qū)動(dòng)器]在向磁盤讀取和寫入數(shù)據(jù)時(shí)聪轿,要以扇區(qū)為單位爷肝。
在磁盤上,[DOS]操作系統(tǒng)是以“[簇]”為單位為文件分配磁盤空間的陆错。
[硬盤]的簇通常為多個(gè)扇區(qū)灯抛,與[磁盤]的種類、DOS 版本及[硬盤分區(qū)]的大小有關(guān)音瓷。
每個(gè)簇只能由一個(gè)文件占用对嚼,即使這個(gè)文件中有幾個(gè)[字節(jié)],決不允許兩個(gè)以上的文件共用一個(gè)簇绳慎,否則會(huì)造成數(shù)據(jù)的混亂纵竖。
這種以簇為最小分配單位的機(jī)制,使[硬盤]對(duì)數(shù)據(jù)的管理變得相對(duì)容易杏愤,但也造成了[磁盤]空間的浪費(fèi)磨确,尤其是小文件數(shù)目較多的情況下,一個(gè)上千兆的大硬盤声邦,其浪費(fèi)的磁盤空間可達(dá)上百兆[字節(jié)]。
為了對(duì)扇區(qū)進(jìn)行查找和管理摆舟,需要對(duì)扇區(qū)進(jìn)行編號(hào)亥曹,扇區(qū)的編號(hào)從0磁道開始,起始扇區(qū)為1扇區(qū)恨诱,其后為2扇區(qū)媳瞪、3扇區(qū)……,
0磁道的扇區(qū)編號(hào)結(jié)束后照宝,1磁道的起始扇區(qū)累計(jì)編號(hào)蛇受,直到最后一個(gè)磁道的最后一個(gè)扇區(qū)(n扇區(qū))。
例如厕鹃,某個(gè)硬盤有1024個(gè)磁道兢仰,每個(gè)磁道劃分為63個(gè)扇區(qū),則0磁道的扇區(qū)號(hào)為1~63剂碴,1磁道的起始扇區(qū)號(hào)為64最后一個(gè)磁道的最后一個(gè)扇區(qū)號(hào)為64512把将。
硬盤在進(jìn)行扇區(qū)編號(hào)時(shí)與軟盤有一些區(qū)別,在軟盤的一個(gè)磁道中忆矛,扇區(qū)號(hào)一次編排察蹲,即1、2、3……n扇區(qū)洽议。
由于硬盤的轉(zhuǎn)速較高宗收,磁頭在完成某個(gè)扇區(qū)數(shù)據(jù)的讀寫后,必須將數(shù)據(jù)傳輸?shù)轿C(jī)亚兄,這需要一個(gè)時(shí)間混稽,
但是這時(shí)硬盤在繼續(xù)高速旋轉(zhuǎn),當(dāng)數(shù)據(jù)傳輸完成后儿捧,磁頭讀寫第二個(gè)扇區(qū)時(shí)荚坞,磁盤已經(jīng)旋轉(zhuǎn)到了另外一個(gè)扇區(qū)。
因此在早期硬盤中菲盾,扇區(qū)號(hào)是按照某個(gè)間隔系數(shù)跳躍編排的颓影。
在[硬盤]中無法被正常訪問或不能被正確讀寫的扇區(qū)都稱為Badsector。
一個(gè)扇區(qū)能存儲(chǔ)512[Bytes]的數(shù)據(jù)懒鉴,如果在某個(gè)扇區(qū)中有任何一個(gè)[字節(jié)]不能被正確讀寫诡挂,則這個(gè)扇區(qū)為Badsector。
除了存儲(chǔ)512Bytes外临谱,硬盤每個(gè)扇區(qū)還有數(shù)十個(gè)Bytes信息璃俗,包括標(biāo)識(shí)(ID)、校驗(yàn)值和其它信息悉默。
這些信息任何一個(gè)[字節(jié)]出錯(cuò)都會(huì)導(dǎo)致該扇區(qū)變“Bad”城豁。
例如,在[低級(jí)格式化]的過程中每個(gè)扇區(qū)都分配有一個(gè)編號(hào)抄课,寫在ID中唱星。
如果ID部分出錯(cuò)就會(huì)導(dǎo)致這個(gè)扇區(qū)無法被訪問到,則這個(gè)扇區(qū)屬于Badsector跟磨。
有一些Badsector能夠通過[低級(jí)格式化]重寫這些信息來糾正间聊。
下面的clust也就是簇的概念,是文件系統(tǒng)的概念
數(shù)據(jù)存儲(chǔ)在硬盤的時(shí)候都是以簇為單位抵拘,所以無論文件大小是多少哎榴,除非正好是簇大小的倍數(shù),否則文件所占用的最后一個(gè)簇或多或少都會(huì)產(chǎn)生一些剩余的空間僵蛛,且這些空間又不能給其它文件使用连霉,
即使這個(gè)文件只有0字節(jié)测摔,也不允許兩個(gè)文件或兩個(gè)以上的文件共用一個(gè)簇,不然會(huì)造成數(shù)據(jù)混亂。
微軟操作系統(tǒng)(DOS谐区、WINDOWS等)中磁盤文件存儲(chǔ)管理的最小單位叫做“簇”
一個(gè)文件通常存放在一個(gè)或多個(gè)簇里冤狡,但至少要單獨(dú)占據(jù)一個(gè)“簇”完箩。 也就是說兩個(gè)文件不能存放在同一個(gè)簇中。
簇(CLUST)的本意就是“一群”泵喘、“一組”,即一組扇區(qū)的意思般妙。
因?yàn)閇扇區(qū)]的單位太小纪铺,因此把它捆在一起,組成一個(gè)更大的單位更方便進(jìn)行靈活管理碟渺。
簇的大小通常是可以變化的鲜锚,是由操作系統(tǒng)在所謂“(高級(jí))格式化”時(shí)規(guī)定的,因此管理也更加靈活苫拍。
通俗地講文件就好[比是]一個(gè)家庭芜繁,數(shù)據(jù)就是人,即家庭成員绒极;
所謂簇就是一些單元套房骏令;
[扇區(qū)]是組成這些單元套房的一個(gè)個(gè)大小相等的房間。
一個(gè)家庭可能住在一套或多套單元房子里垄提,但一套房子不能同時(shí)住進(jìn)兩個(gè)家庭的成員榔袋。
[文件系統(tǒng)]是操作系統(tǒng)與驅(qū)動(dòng)器之間的接口,當(dāng)操作系統(tǒng)請(qǐng)求從硬盤里讀取一個(gè)文件時(shí)铡俐,會(huì)請(qǐng)求相應(yīng)的文件系統(tǒng)(FAT 16/[FAT32]/[NTFS]打開文件凰兑。
[扇區(qū)]是磁盤最小的物理存儲(chǔ)單元,但由于操作系統(tǒng)無法對(duì)數(shù)目眾多的扇區(qū)進(jìn)行[尋址]审丘,所以操作系統(tǒng)就將相鄰的扇區(qū)組合在一起吏够,形成一個(gè)簇,然后再對(duì)簇進(jìn)行管理滩报。
每個(gè)簇可以包括2稿饰、4、8露泊、16、32或64個(gè)[扇區(qū)]旅择。顯然惭笑,簇是操作系統(tǒng)所使用的邏輯概念,而非磁盤的物理特性生真。
那么對(duì)應(yīng)的簇的大小就是1024沉噩,2048,4096柱蟀,8192川蒙,16385,65536咯长已,其實(shí)我還看到2M的了呢畜眨。
為了更好地管理磁盤空間和更高效地從硬盤讀取數(shù)據(jù)昼牛,操作系統(tǒng)規(guī)定一個(gè)簇中只能放置一個(gè)文件的內(nèi)容,因此文件所占用的空間康聂,只能是簇的整數(shù)倍贰健;
如果文件實(shí)際大小小于一簇,它也要占一簇的空間恬汁。
如果文件實(shí)際大小大于一簇伶椿,根據(jù)邏輯推算,那么該文件就要占兩個(gè)簇的空間氓侧。
所以脊另,一般情況下文件所占空間要略大于文件的實(shí)際大小,只有在少數(shù)情況下约巷,即文件的實(shí)際大小恰好是簇的整數(shù)倍時(shí)偎痛,文件的實(shí)際大小才會(huì)與所占空間完全一致。
現(xiàn)在可以開始學(xué)習(xí)第二個(gè)大神的內(nèi)容了
1.3MBR功能
1.掃描分區(qū)表查找[活動(dòng)分區(qū)]
2.尋找活動(dòng)分區(qū)的起始扇區(qū)载庭;
3.將活動(dòng)分區(qū)的引導(dǎo)扇區(qū)讀到內(nèi)存看彼;
4.執(zhí)行引導(dǎo)扇區(qū)的運(yùn)行代碼。
如果主引導(dǎo)代碼未完成這些功能囚聚,系統(tǒng)顯示下列錯(cuò)誤信息
Invalid partition table
Error loading operating system
Missing operating system
MBR是BIOS接力的第一棒靖榕,在他之后,會(huì)由分區(qū)引導(dǎo)扇區(qū)DBR接力顽铸,至于為什么不直接給DBR茁计。
那是因?yàn)锽IOS大小有限,無法完成所有操作谓松,在給DBR之前會(huì)通過MBR完成星压。
目前只需要了解MBR,至于DBR會(huì)在之后進(jìn)行解釋鬼譬。
2.Boot Sector實(shí)現(xiàn)代碼
在BIOS自檢等一系列工作完成后娜膘,要開始引導(dǎo)了。
計(jì)算機(jī)會(huì)將硬盤0面0道1扇區(qū)512字節(jié)加載到07c00h(0000::7c00)處优质。
1)為什么是0面0道1扇區(qū)竣贪?
這個(gè)可以理解為是規(guī)定,當(dāng)Bios工作完成后會(huì)去將硬盤0面0道1扇區(qū)512字節(jié)進(jìn)行加載巩螃。
但是真實(shí)情況是根據(jù)“魔數(shù)”來確定的演怎,魔數(shù)就是有特殊意義的數(shù),更大作用是用來做標(biāo)記避乏,比如MBR就是在512個(gè)字節(jié)的最后兩個(gè)字節(jié)填入 0x55 爷耀,0xaa來進(jìn)行標(biāo)記的。
放在第一個(gè)扇區(qū)是因?yàn)?面0道1扇區(qū)是磁盤最開始的地方拍皮,一開始檢驗(yàn)出有 0x55 歹叮,0xaa就直接開始加載跑杭。
2)為什么是07c00h?
這個(gè)也可以當(dāng)作是規(guī)定,在IBM文檔中沒有具體說明07c00h是為什么盗胀,
但是在世界上第一臺(tái)個(gè)人計(jì)算機(jī)誕生時(shí)艘蹋,07c00h就是在它當(dāng)中初次誕生的,
那時(shí)的DOS最多也就是32K票灰,為了實(shí)現(xiàn)MBR中的棧需要512B女阀,
為了滿足需求取最大為1K,也就是32K-1K屑迂,就是07c00h了浸策。
原來這個(gè)地址是IBM規(guī)定的呀