學(xué)習(xí)筆記
使用教材(配書源碼以及使用方法)
《一個(gè)64位操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)》
http://www.ituring.com.cn/book/2450
http://www.itdecent.cn/p/28f9713a9171
源碼結(jié)構(gòu)
- 配書代碼包 :第7章 \ 程序 \ 程序7-3
- 參考目錄:7.4 U盤啟動(dòng)
實(shí)驗(yàn)操作
零、將U盤制作成 USB-FDD 啟動(dòng)模式 + FAT12文件系統(tǒng)
- 參見(jiàn)書本 《7.4 U盤啟動(dòng)》,使用軟件 DiskGenius,將U盤制作成USB-FDD 啟動(dòng)模式 + FAT12文件系統(tǒng)
一、 根據(jù)U盤信息,修改配書包里的源碼
- 黃色標(biāo)注部分,我的U盤總?cè)萘?2MB,簇大小默認(rèn)是8192字節(jié)
查看自己制作好的U盤的信息
參照U盤的信息修改源碼
- (
;注釋部分是配書源碼的數(shù)值 以及 一些說(shuō)明)
boot.asm
SectorNumOfRootDirStart equ 19 ;SectorNumOfRootDirStart equ 25 根目錄區(qū)起始扇區(qū)號(hào)
SectorBalance equ 23 ;SectorBalance equ 23 其實(shí)是用不到了,后面會(huì)有代碼專門算這個(gè)值
BPB_SecPerClus db 0x10 ;BPB_SecPerClus db 0x8 每簇扇區(qū)數(shù)
BPB_TotSec16 dw 0xbc43 ;BPB_TotSec16 dw 0x7d82 總扇區(qū)數(shù)
BPB_Media db 0xf0
BPB_FATSz16 dw 0x9 ;BPB_FATSz16 dw 0xc FAT扇區(qū)數(shù)
BPB_SecPerTrk dw 0x3f ;BPB_SecPerTrk dw 0x3f 每磁道扇區(qū)數(shù)
BPB_NumHeads dw 0xff ;BPB_NumHeads dw 0xff 磁頭數(shù)
Label_Go_On_Loading_File:
add bx, 0x2000 ;add bx, 0x1000 ;add bx, [BPB_BytesPerSec] 這里要填入簇的大小
BPB_SecPerClus db 0x10 每簇扇區(qū)數(shù)等于 簇大小 8192 除以 每扇區(qū)字節(jié)數(shù)512 = 16,寫成十六進(jìn)制0x10- 我的U盤總?cè)萘?2MB,制作成USB-FDD啟動(dòng)模式+FAT12文件系統(tǒng)之后,一簇有16個(gè)扇區(qū),即每調(diào)用一次讀軟盤功能的
call Func_ReadOneSector,都會(huì)讀入16個(gè)扇區(qū)的數(shù)據(jù),也就是十進(jìn)制8192字節(jié)(0x2000),從而緩沖區(qū)的偏移在一次讀操作后要add bx , 0x2000
fat12.inc 與 boot.asm 保持一致
SectorNumOfRootDirStart equ 19 ;SectorNumOfRootDirStart equ 25
BPB_SecPerClus db 0x10 ;BPB_SecPerClus db 0x8
BPB_TotSec16 dw 0xbc43 ;BPB_TotSec16 dw 0x7d82
BPB_FATSz16 dw 0x9 ;BPB_FATSz16 dw 0xc
loader.asm 每讀一簇就是8192字節(jié)=2000h字節(jié)
Label_Go_On_Loading_File:
. . .
mov cx, 2000h ;mov eax, 0x1000 這里應(yīng)該填入簇的大小
. . .
loop Label_Mov_Kernel
二、開(kāi)啟虛擬機(jī)
鼠標(biāo)聚焦在虛擬機(jī),再插入U(xiǎn)盤,CentOS識(shí)別后,桌面會(huì)出現(xiàn)圖標(biāo)
U盤圖標(biāo)
- 進(jìn)行命令行操作,兩個(gè)
make,一個(gè)dd,/dev/sdb就是U盤設(shè)備
[anno@localhost 7-3 32MB]$ ls
bootloader kernel
[anno@localhost 7-3 32MB]$ cd bootloader
[anno@localhost bootloader]$ make
nasm boot.asm -o boot.bin
nasm loader.asm -o loader.bin
[anno@localhost bootloader]$ sudo dd if=boot.bin of=/dev/sdb bs=512 count=1 conv=notrunc
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.00673206 s, 76.1 kB/s
[anno@localhost bootloader]$ ls
boot.asm boot.bin fat12.inc loader.asm loader.bin Makefile
[anno@localhost bootloader]$ cd ../
[anno@localhost 7-3 32MB]$ cd kernel
[anno@localhost kernel]$ make
[anno@localhost kernel]$ ls
cpu.h gate.h interrupt.h linkage.h memory.h ptrace.h trap.c
entry.o head.o interrupt.o main.c memory.o system trap.h
entry.s head.s kernel.bin main.o printk.c task.c trap.o
entry.S head.S Kernel.lds Makefile printk.h task.h
font.h interrupt.c lib.h memory.c printk.o task.o
- 將生成的
loader.bin以及kernel.bin復(fù)制到U盤
手動(dòng)復(fù)制或者使用cp命令都可以
將生成的 loader.bin 以及 kernel.bin 復(fù)制到U盤
- 完成后,選擇彈出U盤
三、將真實(shí)機(jī)器的啟動(dòng)模式設(shè)置成 USB-FDD
- 需要注意的是,平常裝系統(tǒng),一般都是選擇USB-HDD為首選,但是這里現(xiàn)在的U盤我們模擬的是USB-FDD啟動(dòng)模式,也就是模擬它是一個(gè)軟盤,在BIOS的啟動(dòng)首選項(xiàng)里面,要選擇USB-FDD啟動(dòng)為最優(yōu)先的
將真實(shí)機(jī)器的啟動(dòng)模式設(shè)置成USB-FDD
四、關(guān)機(jī)狀態(tài)下,插入U(xiǎn)盤
關(guān)機(jī)狀態(tài)下,插入U(xiǎn)盤
五,再開(kāi)機(jī)
看到熟悉的畫面,各種信息都順利輸出了
再開(kāi)機(jī)





