學習筆記
使用教材(配書源碼以及使用方法)
《一個64位操作系統(tǒng)的設計與實現(xiàn)》
http://www.ituring.com.cn/book/2450
http://www.reibang.com/p/28f9713a9171
源碼結構
- 配書代碼包 :第7章 \ 程序 \ 程序7-3
- 參考目錄:7.4 U盤啟動
實驗操作
零故痊、將U盤制作成 USB-FDD 啟動模式 + FAT12文件系統(tǒng)
- 參見書本 《7.4 U盤啟動》挠阁,使用軟件 DiskGenius绰播,將U盤制作成USB-FDD 啟動模式 + FAT12文件系統(tǒng)
一评架、 根據(jù)U盤信息蚌铜,修改配書包里的源碼
- 黃色標注部分嗓节,我的U盤總容量32MB临燃,簇大小默認是8192字節(jié)
參照U盤的信息修改源碼
- (
;
注釋部分是配書源碼的數(shù)值 以及 一些說明)
boot.asm
SectorNumOfRootDirStart equ 19 ;SectorNumOfRootDirStart equ 25 根目錄區(qū)起始扇區(qū)號
SectorBalance equ 23 ;SectorBalance equ 23 其實是用不到了诗力,后面會有代碼專門算這個值
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,寫成十六進制0x10
- 我的U盤總容量32MB凭峡,制作成USB-FDD啟動模式+FAT12文件系統(tǒng)之后拙已,一簇有16個扇區(qū),即每調用一次讀軟盤功能的
call Func_ReadOneSector
摧冀,都會讀入16個扇區(qū)的數(shù)據(jù)倍踪,也就是十進制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 這里應該填入簇的大小
. . .
loop Label_Mov_Kernel
二、開啟虛擬機
鼠標聚焦在虛擬機建车,再插入U盤扩借,CentOS識別后,桌面會出現(xiàn)圖標
- 進行命令行操作缤至,兩個
make
潮罪,一個dd
,/dev/sdb
就是U
盤設備
[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
復制到U盤
手動復制或者使用cp命令都可以
- 完成后领斥,選擇彈出U盤
三嫉到、將真實機器的啟動模式設置成 USB-FDD
- 需要注意的是,平常裝系統(tǒng)月洛,一般都是選擇USB-HDD為首選何恶,但是這里現(xiàn)在的U盤我們模擬的是USB-FDD啟動模式,也就是模擬它是一個軟盤嚼黔,在BIOS的啟動首選項里面细层,要選擇USB-FDD啟動為最優(yōu)先的
四、關機狀態(tài)下唬涧,插入U盤
五,再開機
看到熟悉的畫面碎节,各種信息都順利輸出了