[OS64][031]实验操作:程序7-3 移植到物理平台 U盘启动

学习笔记

使用教材(配书源码以及使用方法)
《一个64位操作系统的设计与实现》
http://www.ituring.com.cn/book/2450
https://www.jianshu.com/p/28f9713a9171

源码结构

  • 配书代码包 :第7章 \ 程序 \ 程序7-3
  • 参考目录:7.4 U盘启动

实验操作

零、将U盘制作成 USB-FDD 启动模式 + FAT12文件系统

  • 参见书本 《7.4 U盘启动》,使用软件 DiskGenius,将U盘制作成USB-FDD 启动模式 + FAT12文件系统

http://www.diskgenius.cn/

一、 根据U盘信息,修改配书包里的源码

  • 黄色标注部分,我的U盘总容量32MB簇大小默认是8192字节
[OS64][031]实验操作:程序7-3 移植到物理平台 U盘启动_第1张图片
查看自己制作好的U盘的信息

参照U盘的信息修改源码

  • ;注释部分是配书源码的数值 以及 一些说明)

boot.asm

SectorNumOfRootDirStart equ 19      ;SectorNumOfRootDirStart    equ 25 根目录区起始扇区号
SectorBalance       equ 23          ;SectorBalance      equ 23  其实是用不到了,后面会有代码专门算这个值


    BPB_SecPerClus  db  0x10        ;BPB_SecPerClus db  0x8  每簇扇区数
    
    BPB_TotSec16    dw  0xbc43      ;BPB_TotSec16   dw  0x7d82 总扇区数
    BPB_Media   db  0xf0
    BPB_FATSz16 dw  0x9             ;BPB_FATSz16    dw  0xc FAT扇区数
    BPB_SecPerTrk   dw  0x3f        ;BPB_SecPerTrk  dw  0x3f  每磁道扇区数
    BPB_NumHeads    dw  0xff        ;BPB_NumHeads   dw  0xff 磁头数
    
Label_Go_On_Loading_File:
    add bx, 0x2000  ;add    bx, 0x1000 ;add bx, [BPB_BytesPerSec] 这里要填入簇的大小

  • BPB_SecPerClus db 0x10 每簇扇区数 等于 簇大小 8192 除以 每扇区字节数512 = 16,写成十六进制0x10
  • 我的U盘总容量32MB,制作成USB-FDD启动模式+FAT12文件系统之后,一簇有16个扇区,即每调用一次读软盘功能call Func_ReadOneSector,都会读入16个扇区的数据,也就是十进制8192字节(0x2000),从而缓冲区的偏移在一次读操作后要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字节=2000h字节

Label_Go_On_Loading_File:
. . .
    mov cx, 2000h       ;mov    eax,    0x1000 这里应该填入簇的大小
. . .

    loop    Label_Mov_Kernel

二、开启虚拟机

  • 鼠标聚焦在虚拟机,再插入U盘,CentOS识别后,桌面会出现图标


    U盘图标
  • 进行命令行操作,两个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命令都可以


[OS64][031]实验操作:程序7-3 移植到物理平台 U盘启动_第2张图片
将生成的 loader.bin 以及 kernel.bin 复制到U盘
  • 完成后,选择弹出U盘

三、将真实机器的启动模式设置成 USB-FDD

  • 需要注意的是,平常装系统,一般都是选择USB-HDD为首选,但是这里现在的U盘我们模拟的是USB-FDD启动模式,也就是模拟它是一个软盘,在BIOS的启动首选项里面,要选择USB-FDD启动为最优先的
[OS64][031]实验操作:程序7-3 移植到物理平台 U盘启动_第3张图片
将真实机器的启动模式设置成USB-FDD

四、关机状态下,插入U盘

[OS64][031]实验操作:程序7-3 移植到物理平台 U盘启动_第4张图片
关机状态下,插入U盘

五,再开机

  • 看到熟悉的画面,各种信息都顺利输出了


    [OS64][031]实验操作:程序7-3 移植到物理平台 U盘启动_第5张图片
    再开机

你可能感兴趣的:([OS64][031]实验操作:程序7-3 移植到物理平台 U盘启动)