操作系统引导-----QEMU环境下制作boot引导程序

目标

  • 制作一个光盘实现qemu下操作系统的引导

储备知识

  • df命令:列出文件系统的整体磁盘使用量
    操作系统引导-----QEMU环境下制作boot引导程序_第1张图片

  • du命令:常用于计算目录所占容量
    -h :以(G/M)方式显示容量
    -k:以KB方式显示
    -m:以MB方式显示
    操作系统引导-----QEMU环境下制作boot引导程序_第2张图片

  • mkfs命令:使用指定的文件系统格式化磁盘
    -t :接文件系统格式,如ext3,ext2,vfat等

  • mount命令:将文件系统挂载到指定的目录下

  • losetup命令:连接文件与循环设备(/dev/loop)
    详解
    -d 卸除设备。
    -e<加密方式> 启动加密编码。
    -o<平移数目> 设置数据平移的数目。
    循环设备可把文件虚拟成区块设备,籍以模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。

  • /dev/loop设备
    /dev/loop(或称vnd (vnode disk)、lofi(循环文件接口))是一种伪设备,这种设备使得文件可以如同块设备一般被访问。
    在使用之前,循环设备必须与现存文件系统上的文件相关联。这种关联将提供给用户一个应用程序接口,接口将允许文件视为块特殊文件(参见设备文件系统)使用。因此,如果文件中包含一个完整的文件系统,那么这个文件就能如同磁盘设备一般被挂载。
    这种设备文件经常被用于光盘或是磁盘镜像(IOS、IMG)。通过循环挂载来挂载包含文件系统的文件,便使处在这个文件系统中的文件得以被访问。这些文件将出现在挂载点目录。
    在一个目录上挂载包含包含文件系统的文件的步骤:
    使用一个循环设备(/dev/loop)连接文件(使用命令 losetup
    在目录上挂载该循环设备(使用命令 mount)

  • 其他/dev虚拟设备

/dev/null: “空”设备,也有人称它为黑洞。任何输入到这个“设备”的数据都将被直接丢弃
最常用的用法是把不需要的输出重定向到这个文件。
/dev/zero:零”设备,可以无限的提供空字符(0x00,ASCII代码NUL)。常用来生成一个特定大小的文件。
/dev/random和/dev/urandom:随机数设备,提供不间断的随机字节流。二者的区别是/dev/random产生随
机数据依赖系统中断,当系统中断不足时,/dev/random设备会“挂起”,因而产生数据速度较慢,但随机性
好;/dev/urandom不依赖系统中断,数据产生速度快,但随机性较低。

生成一个大小为1.44mb软盘,并且将其挂载到指定目录下

操作系统引导-----QEMU环境下制作boot引导程序_第3张图片

实现过程

  • 先生成一个空的大小为1.44MB的磁盘
    操作系统引导-----QEMU环境下制作boot引导程序_第4张图片
    mkdosfs命令
    详解
    -F 指定 FAT 表的大小,通常是 12 或是 16 个位元组。12 位元组通常用于磁碟片,16 位元组用于一般硬盘的分割区,也就是所谓的 FAT16 格式。这个值通常系统会自己选定适当的值。在磁碟片上用 FAT16 通常不会发生作用,反之在硬盘上用 FAT12 亦然。
    xxd命令查看其内容
    xxd -u -a -g l -c 16 floopy
    操作系统引导-----QEMU环境下制作boot引导程序_第5张图片
    其前512字节是一个引导扇区(Boot Sector),前62字节是BPB的结构,BPB数据结构的字段是windows文件系统和操作系统约定好的,用于描述磁盘的物理布局,可以适用于FAT系列文件系统和NTFS文件系统。这里我们看到最后的文件系统类型为FAT12

FAT引导扇区结构

详细介绍链接

引导代码

boot.asm程序:

jmp init; BS_jmpBoot短跳转指令(加上nop填充后为3个字节)
nop
Bs_OEMName db "Jiaxgong";Bs_OEMName 厂商名称 8字节
BPB_BytsPerSec dw 512;每扇区字节数
BPB_SecPerClus db 1;每簇扇区数
BPB_RsvdSecCnt dw 1;保留区中的保留扇区数FAT12必须为1,(引导记录占用的扇区数)
BPB_NumFATs db 2;此卷中FAT表的份数,建议为2
BPB_RootEntCnt dw 512;根目录中的目录项数 FAT12中建议取值512
BPB_TotSec16 dw 2880;扇区总数
BPB_Media db 0xf0;BPB_Media 存储介质f0表示可移动介质,f8表示固定介质
BPB_FATSz16 dw 9;一个FAT表所占的扇区数
BPB_SecPerTrk dw 18;每磁道扇区数
BPB_NumHeaders dw 2;磁头数
BPB_HiddSec dd 0;FAT分区之前的隐藏扇区数,对于未分区介质必须为0
BPB_TotSec32 dd 0
BS_drveNum db 0;int13得到的驱动器号
BS_Reserved1 db 0;保留(供NT使用)
BS_BootSig db 0x29;扩展引导标记,指明此后的3个域可用
BS_VolID dd 0;卷标序列号
BS_VolLab db "VirtualBoot";磁盘卷标,此域必须与根目录中11字节长的卷标一致
BS_FilSysType db "FAT12   ";文件系统类型

init:
    mov    ax, 7c00h
    mov    ds, ax
    mov    es, ax
    mov    ss, ax
    mov    sp, 180h
    call    DispStr

loop:
    jmp     loop

DispStr:
    mov    ax, BootMsg
    mov    bp, ax
    mov    cx, 16
    mov    ax, 01301h
    mov    bx, 000ch
    mov    dl, 0
    int     10h
    ret

BootMsg: db  "Hello, OS World!"

times 510-($-$$) db 0

dw 0xaa55

以上程序写好后,使用nasm命令汇编成二进制文件
nasm boot.asm -o boot.bin
汇编完成后,可以使用以下命令查看boot.bin的大小,刚好为512字节
wc -c boot.bin
在这里插入图片描述
plus:反汇编指令ndisasm boot.bin -o 0x7c00>> disboot.asm可以查看处理过后的汇编代码

将引导代码写入floopy软盘中

dd if=boot.bin ibs=512 of=floopy obs=512 count=1 seek=0 conv=notrunc
notrunc意味着不缩减输出文件,也就是说,如果输出文件已经存在,只改变指定的字节,然后退出,并保留输出文件的剩余部分。没有这个选项,dd将创建一个512字节长的文件。

写入完成后,使用qemu启动软盘(a.img就是上面的floppy软盘,为了和命令区分,改为了a.img)
qemu-system-x86_64 -drive file=a.img,of=floppy
操作系统引导-----QEMU环境下制作boot引导程序_第6张图片

你可能感兴趣的:(操作系统,qemu,boot,linux)