您现在的位置是:主页 > news > 网站 标准/在线推广企业网站的方法

网站 标准/在线推广企业网站的方法

admin2025/5/6 14:44:45news

简介网站 标准,在线推广企业网站的方法,javascript搭建网站,wordpress主题页添加在上一篇文章中,我们完成了一个简单的主引导程序的编写及运行,但有限制的是:主引导程序不能超过512字节!然而操作系统的程序,明显不止512字节,为了突破这个限制,主引导可以采用如下改造策略&…

网站 标准,在线推广企业网站的方法,javascript搭建网站,wordpress主题页添加在上一篇文章中,我们完成了一个简单的主引导程序的编写及运行,但有限制的是:主引导程序不能超过512字节!然而操作系统的程序,明显不止512字节,为了突破这个限制,主引导可以采用如下改造策略&…

在上一篇文章中,我们完成了一个简单的主引导程序的编写及运行,但有限制的是:主引导程序不能超过512字节!然而操作系统的程序,明显不止512字节,为了突破这个限制,主引导可以采用如下改造策略:
        1、完成最基本的初始化工作
        2、从存储介质加载程序到内存中
        3、将控制权交给新加载的程序执行
在这里,主引导程序主要做简单初始化、加载程序到内存,跳到加载的程序处执行即可,这些在512字节内是可以完成的。
           如下是一个基本的思路图:

在上述的思路中,面临的问题是:如何加载存储介质的文件(可执行程序)到内存中
为了解决这个问题,需要引入文件系统,文件系统就是存储介质上组织文件数据的方式,这里我们采用FAT12文件系统,原因简单易学。文件数据在FAT12文件系统的组织方式如下图:
                                              
       FAT12的基本组织单位为:
       1、字节(Byte) : 基本数据单位
       2、扇区(Sector):磁盘中的最小数据单元
       3、(Cluster):一个或多个扇区 

所以最终的解决方案为:
       1、使用FAT12文件系统对软盘(a.img)格式化,之后a.img软盘的文件数据组织方式就是FAT12格式
       2、编写可执行程序(loader),并拷贝到软盘a.img中
       3、主引导程序(boot)在软盘a.img中查找可执行程序loader
       4、将loader程序拷贝到内存中,然后跳转(jmp)到入口处执行

在此之前先来熟悉下FAT12文件系统,下边要做的实验是,使用FAT12文件系统格式化软盘a.img,之后将a.img挂载到linux中,并向其写入一个文件,这里我们用来对a.img进行格式化的工具为freeDos(一个远古的FAT12文件系统组织数据的操作系统)

第一步:创建一个虚拟软盘data.img

第二步、bochsrc配置文件中将data.img软盘设置为freeDos操作系统的B盘符

第三步、运行bochsrc虚拟机,用FreeDos格式化B盘符(即data.img软盘)

第四步、将data.img挂载到linux上(此处为/mnt/hgfs),并将两个文件loader.bin、test.txt拷贝到data.img软盘里

第五步、重启freeDos,查看B盘符内容(即软盘data.img内容)

可以看到data.img软盘里已经有了我们拷贝的两个文件test.txt、loader.bin,并且也打印了两个文件的内容。
这个实验说明这样的思路是可行,不过我们还是要更近一步了解FAT12文件系统



以上三张图片主要展示了FAT12文件系统与主引导程序的组织方式,需要了解的是:
1、主引导程序在主引导区中,主引导区在FAT12文件系统的第0扇区,并以0x55AA结束
2、主引导区同时保存了文件系统信息,与主引导程序共用一个扇区

下边代码就是读取软盘data.img(将data.img从linux拷贝到Windows桌面)系统文件信息,并打印

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QDataStream>
#include <QDebug>#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)void PrintHeader(Fat12Header& rf, QString p)
{QFile file(p);if( file.open(QIODevice::ReadOnly) ){QDataStream in(&file);file.seek(3);   //偏移开头3字节in.readRawData(reinterpret_cast<char*>(&rf), sizeof(rf));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);  //偏移512字节的最后两字节处uchar b510 = 0;uchar b511 = 0;//读取最后两字节in.readRawData(reinterpret_cast<char*>(&b510), sizeof(b510));in.readRawData(reinterpret_cast<char*>(&b511), sizeof(b511));qDebug() << "Byte 510: " << hex << b510;qDebug() << "Byte 511: " << hex << b511;}file.close();
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);Fat12Header f12;PrintHeader(f12, "C:\\Users\\lms\\Desktop\\data.img");return a.exec();
}

编译运行的结果为:

从结果看到,data.img软盘已经采用FAT12文件系统来组织数据,且主引导区最后两字节为0x55AA。

既然上边说了,主引导程序与主引导区共用一个扇区,并且在第0扇区,也就是在data.img的开始位置处,那么接着改bochsrc配置文件,将data.img作为启动盘:

运行bochsrc虚拟机

可以看到,data.img其实已经有主引导程序了,这个主引导程序只是打印一段字符串。这个主引导程序就是freeDos在格式化data.img时候自动生成的。

总结:
        1、可以通过主引导程序加载新程序突破主引导程序512字节的限制
        2、加载新程序需要借助文件系统
        3、FAT12文件系统的主要系统信息主引导程序都存储于第0扇区
 

学自 --《狄泰软件学院》- 门徒操作系统