【OS】04 – 主引导程序的拓展(上)【了解Fat12】

【OS】04 – 主引导程序的拓展(上) ,理论详情


实验: 把文件写入虚拟软盘

0x01 创建虚拟软盘

1.1

创建虚拟软盘和文件,文件写入虚拟软盘

需要的工具:

  1. bochsrc
  2. freedos.img

bochsrc

###############################################################
# Configuration file for Bochs
###############################################################

# how much memory the emulated machine will have
megs: 32

# filename of ROM images
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/vgabios/vgabios.bin

# what disk images will be used
floppya: 1_44=freedos.img, status=inserted

# choose the boot disk.
boot: a

# where do we send log messages?
# log: bochsout.txt

# disable the mouse
mouse: enabled=0

# enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=/usr/local/share/bochs/keymaps/x11-pc-us.map

1.2

创建一张虚拟软盘,把创建的虚拟软盘插入到freedos中,盘符为 "b"

file

1.3

Linux命令行进入freedos的命令: bochs – 6 – c
注意: 操作的这几个文件要在同一个路径下,data.img、 freedos.img、 bochsrc;
在freedos中对B盘(虚拟软盘)进行格式化(命令: "format b:"),虚拟软盘data.img就有了文件系统(FAT12),这时候查看B盘是没有文件的;

file

1.4

把虚拟软盘data.img挂载到Linux中,挂载到 :文件系统 -> mnt -> hgfs上, 命令 " sudo mount -o loop data.img /mnt/hgfs/"
连续创建2个文件,文件里输入一些内容啊,关闭之后再挂载的位置可以打开文件查看内容 /mnt/hgfs/, 命令 "gedit"
把这两个文件拷贝到虚拟软盘里, 命令 "cp"
最后虚拟软盘从当前的Linux中卸载掉 命令 "umount"

file

1.5

data.img这个虚拟软盘里有 文件系统和刚创建的两个文件
这个时候在freedos中,出现了两个文件
查看一下内容,果然是自己写的文件,嗯,不错;
虚拟软盘创建成功,虚拟软盘里有文件系统和创建的两个文件;

file

0X02 文件格式和文件系统的本质

把data.img放到Windows桌面,拖到vs下看; 内部有一定的文件格式,其实就是FAT12系统;
刚用FAT12对软盘进行格式化,软盘中的数据有了特定的组织方式;
因为虚拟软盘的表现形式是Windows下的一个文件,因此FAT12的文件组织方式就变成了这个文件的文件组织格式; 那么文件系统的本质和文件格式的本质是相同的,都指的是数据组织的方式;
如果说将数据组织的方式直接用于存储介质,例如:软盘 硬盘,那么这个数据的组织方式就是文件系统;
如果将数据组织的方式应用操作系统之下的一个文件,那么就是文件格式;

file

0X03 验证:输出fat12文件系统的内容

// 输出: 对照表格,输出fat12文件系统的内容

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QDataStream>
#include <QDebug>

// 1字节对齐,没有任何浪费的空间
#pragma pack(push)
#pragma pack(1)

struct Fat12Header
{
    char BS_OEMName[8];
    ushort BPB_BytsPerSec;
    uchar BPB_SecPerClus;
    ushort BPB_RsvdSecCnt;
    uchar BPB_NumFATs;
    ushort BPB_RootEntCnt;
    ushort BPB_TotSec16;
    uchar BPB_Media;
    ushort BPB_FATSz16;
    ushort BPB_SecPerTrk;
    ushort BPB_NumHeads;
    uint BPB_HiddSec;
    uint BPB_TotSec32;
    uchar BS_DrvNum;
    uchar BS_Reserved1;
    uchar BS_BootSig;
    uint BS_VolID;
    char BS_VolLab[11];
    char BS_FileSysType[8];
};

#pragma pack(pop)

// 读取fat12中第0扇区和文件系统相关的信息
// 参数2: 创建的虚拟软盘文件的路径
void PrintHeader(Fat12Header& rf, QString p)
{
    QFile file(p);

    if( file.open(QIODevice::ReadOnly) )
    {
        QDataStream in(&file);

        file.seek(3); // 看表格,从第0扇区偏移3个字节开始的

        //读取到结构体对象里去
        in.readRawData(reinterpret_cast<char*>(&rf), sizeof(rf));

        // 给字符数组的最后一个元素赋0值,字符数组就可以当做字符串来访问
        rf.BS_OEMName[7] = 0;
        rf.BS_VolLab[10] = 0;
        rf.BS_FileSysType[7] = 0;

        qDebug() << "BS_OEMName: " << rf.BS_OEMName;
        qDebug() << "BPB_BytsPerSec: " << hex << rf.BPB_BytsPerSec;
        qDebug() << "BPB_SecPerClus: " << hex << rf.BPB_SecPerClus;
        qDebug() << "BPB_RsvdSecCnt: " << hex << rf.BPB_RsvdSecCnt;
        qDebug() << "BPB_NumFATs: " << hex << rf.BPB_NumFATs;
        qDebug() << "BPB_RootEntCnt: " << hex << rf.BPB_RootEntCnt;
        qDebug() << "BPB_TotSec16: " << hex << rf.BPB_TotSec16;
        qDebug() << "BPB_Media: " << hex << rf.BPB_Media;
        qDebug() << "BPB_FATSz16: " << hex << rf.BPB_FATSz16;
        qDebug() << "BPB_SecPerTrk: " << hex << rf.BPB_SecPerTrk;
        qDebug() << "BPB_NumHeads: " << hex << rf.BPB_NumHeads;
        qDebug() << "BPB_HiddSec: " << hex << rf.BPB_HiddSec;
        qDebug() << "BPB_TotSec32: " << hex << rf.BPB_TotSec32;
        qDebug() << "BS_DrvNum: " << hex << rf.BS_DrvNum;
        qDebug() << "BS_Reserved1: " << hex << rf.BS_Reserved1;
        qDebug() << "BS_BootSig: " << hex << rf.BS_BootSig;
        qDebug() << "BS_VolID: " << hex << rf.BS_VolID;
        qDebug() << "BS_VolLab: " << rf.BS_VolLab;
        qDebug() << "BS_FileSysType: " << rf.BS_FileSysType;

        //把文件指针重新定位位置
        file.seek(510);

        uchar b510 = 0;
        uchar b511 = 0;

        // 读取第0扇区这两个字节的值
        in.readRawData(reinterpret_cast<char*>(&b510), sizeof(b510));
        in.readRawData(reinterpret_cast<char*>(&b511), sizeof(b511));

        qDebug() << "Byte 510: " << hex << b510; //55
        qDebug() << "Byte 511: " << hex << b511; //aa

        // 在第0扇区不但写入了FAT12文件相关的数据,并且还塞了一个主引导程序进去
    }

    file.close();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Fat12Header f12;

    PrintHeader(f12, "C:\\Users\\Yuna\\Desktop\\data.img");

    return a.exec();
}

程序输出结果

file

0X04 验证: 第0扇区是否藏有主引导程序?

// 验证: 在第0扇区不但写入了文件相关的数据,是否还塞了一个主引导程序进去?
把data.img作为启动盘,"a"盘
打开bochs, 出现一串字符串, 很明显freedos在格式化的时候写入一个主引导程序,这个主引导程序仅仅是打印提示性的字符串而已;

file


战斗结束!
战斗结束!
战斗结束!

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇