美文网首页工作生活
[OS64][031]实验操作:程序7-3 移植到物理平台 U

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

作者: AkuRinbu | 来源:发表于2019-06-30 09:24 被阅读0次

    学习笔记

    使用教材(配书源码以及使用方法)
    《一个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字节
    查看自己制作好的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命令都可以


    将生成的 loader.bin 以及 kernel.bin 复制到U盘
    • 完成后,选择弹出U盘

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

    • 需要注意的是,平常装系统,一般都是选择USB-HDD为首选,但是这里现在的U盘我们模拟的是USB-FDD启动模式,也就是模拟它是一个软盘,在BIOS的启动首选项里面,要选择USB-FDD启动为最优先的
    将真实机器的启动模式设置成USB-FDD

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

    关机状态下,插入U盘

    五,再开机

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


      再开机

    相关文章

      网友评论

        本文标题:[OS64][031]实验操作:程序7-3 移植到物理平台 U

        本文链接:https://www.haomeiwen.com/subject/tcmvcctx.html