[OS64][031]實(shí)驗(yàn)操作:程序7-3 移植到物理平臺(tái) U盤啟動(dòng)

學(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)

http://www.diskgenius.cn/

一、 根據(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ī)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容