欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

操作系统开发之实现多系统引导

操作系统开发之实现多系统引导

一. 一点说明
   一直都想写一个属于自己的操作系统,可是总是由于这样或那样的原因,一直没有集中精力去搞下来。作为一个非计算机专业的大五学生,现在忙于补修本职专业课(挂了些课)和找IT方面工作,暂时也没时间继续了。现公布一点自己些的垃圾,写得不好,请大家不要抛砖头砸我 
二.设计与实现
  硬盘多系统引导功能基本有两部分组成,包括引导启动代码安装和导启动代码. 考虑到测试的环境和处理问题的方便性, 安装程序为没有使用TASM来写。就拿从硬盘定位一个引导文件来说吧, 就得考虑该分区的文件系统类型是VFAT还是NTFS或是EXT2之类情况。由于我们的主要目的是实现多系统引导, 为了不喧宾夺主就将主要精力花在引导的设计上,至于文件系统的设计与处理,等以后有机会在于大家探讨  安装部分必须完成的任务有:保存原MBR内容,修改分区类型,恢复MBR内容,修改MBR启动代码,其他的可以安自己需要添加。
  对于多系统引导的设计与处理,考虑到代码可移植性与稳定性,没有采用默认开始执行的IP为0000:7c00,而是选择程序自己动态调整;另外为了便于测试和改进代码应该具有重定位功能,在
非引导环境下也应当能够执行(不然你没法DEBUG )

三.具体代码
  每个部分都有详细的注释,相信大家都该能够看明白.

代码:

/* MDISK.C 功能简介:
  1.)保存MBR内容
  2.)修改分区类型
  3.)删除分区
  4.)恢复MBR内容
  5.)修改MBR启动代码
*/
#include <stdio.h>
#include <conio.h>
#include <bios.h>
void main(void)
{
  FILE *fp;
  unsigned char buff[512];
  int x,y,z,ch,i,s;
  /* read MBR 
    int biosdisk(int cmd,int drive,int head,int track,int sector,int nsects,void *buffer)
  */
  /*读取MBR并检测是否改动*/
  biosdisk(2,0x80,0,0,1,1,buff);
  if(buff[3]=='H'&&buff[4]=='S'&&buff[5]=='Q')
  {
    printf("\n MBR had been modifled by HSQ ");
    printf("\n Do you want to Overlay MBR (y/n) :");
    for(ch='*';ch!='y'&&ch!='n';)ch=getchar();
    if(ch=='y')
    {
      printf("\n Enter (1-9) sector index to be read :"); /* 49-57*/
      for(x='*';x<'1'||x>'9';)x=getchar();
      biosdisk(2,0x80,0,0,x-48+10,1,buff); /* 2-10 */
      biosdisk(3,0x80,0,0,1,1,buff);
      printf("\n Overlay Complete !");
    }
  }
  else
  {  /*在处理原始MBR前,必须备份*/  
    printf("\n Save MBR to (1-9) sector index :");
    for(x='*';x<'1'||x>'9';)x=getchar();
    biosdisk(3,0x80,0,0,x-48+10,1,buff);
    printf("\n Save MBR Complete !");
  }
  /*显示操作菜单*/
  while(1)
  {
    clrscr();
    printf("\n\n Disk Partition type information :");
    for(x=0x1c2;x<=0x1f2;x+=16)printf("%02x",buff[x]);
    printf("\n\n *************** Menu Title ******************");
    printf("\n *                                           *");
    printf("\n *     1--> Change partition type            *");
    printf("\n *                                           *");
    printf("\n *     2--> Delete partition                 *");
    printf("\n *                                           *");
    printf("\n *     3--> Recover MBR                      *");
    printf("\n *                                           *");
    printf("\n *     4--> Load LDMBR File                  *");
    printf("\n *                                           *");
    printf("\n *     5--> Load BOOT File                   *");
    printf("\n *                                           *");
    printf("\n *     0--> Quit this Program                *");
    printf("\n *                                           *");
    printf("\n *  MDISK v1.23 by Huang Shiquan  2007-10-06 *");
    printf("\n *                                           *");
    printf("\n *********************************************");
    printf("\n Enter your choice :");
    for(ch='*';ch<'0'||ch>'5';)ch=getchar();
    if(ch=='0')break;
    if(ch=='1')
    {
      printf("\n Partition do you want to change (1-4) :");
      for(x='*';x<'1'||x>'4';)x=getchar();
      printf("\n Current partition type is %02x",buff[0x1c2+(x-49)*16]);
      printf("\n Enter new partition type :");
      scanf("%02x",&y);
      buff[0x1c2+(x-49)*16]=y;
      biosdisk(3,0x80,0,0,1,1,buff);
      printf("\n Change Complete !");
      getch();
    }
    if(ch=='2')
    {
      printf("\n Partition do you want to delete (1-4) :");
      for(x='*';x<'1'||x>'4';)x=getchar();
      for(x-=49,y=0;y<(3-x)*16;y++)
      {
        z=0x1be+x*16+y;
        buff[z]=buff[z+16];
      }
      for(y=0;y<16;y++)buff[0x1ee+y]=0;
      biosdisk(3,0x80,0,0,1,1,buff);
      printf("\n Delete Complete !");
      getch();
    }
    if(ch=='3')                /*调用备份扇区覆盖启动扇区*/
    {
      printf("\n Enter (1-9) sector index to read be :");
      for(x='*';x<'1'||x>'9';)x=getchar();/*HEX: 31 - DEC: 49 - ASCII: 1*/
      biosdisk(2,0x80,0,0,x-48+10,1,buff);
      biosdisk(3,0x80,0,0,1,1,buff);
      printf("\n Recover Complete !");
      getch();
    }
    if(ch=='4')                /*装载启动扇区文件*/
    {
      s=1;
      if((fp=fopen("LDMBR.COM","rb")) == NULL)
      {
        printf("\n Open file LDMBR.COM error !\n");
        break;
      }
      for(i=2;i<=10;i++)          /*执行前检查被覆盖分区是否含有MBR信息*/
      {
        biosdisk(2,0x80,0,0,i,1,buff);
        if(buff[0x1fe]==0x55&&buff[0x1ff]==0xaa)
        {
          printf("\n Warming : The [%d] sector have MBR information!",i);
            printf("\n Are you sure to continue work (y/n) :");
          for(ch='*';ch!='y'&&ch!='n';)ch=getchar();
          if(ch=='n')
          {
            s=0;break;
          }
        }
      }
      for(i=1;s==1&&i<=10;i++)        /*读入10个扇区大小的文件*/
      {
        for(x=0;x<0x200;x++)buff[x]=0;  /*初始化缓冲区*/
        fread(buff,0x200,1,fp);
        biosdisk(3,0x80,0,0,i,1,buff);
      }
      if(s==1)printf("\n Modify Complete !");
      fclose(fp);
      getch();
    }
    if(ch=='5')                /*装载启动扇区文件*/
    {
      s=1;
      if((fp=fopen("Boot.bin","rb")) == NULL)
      {
        printf("\n Open file Boot.BIN error !\n");
        break;
      }
      for(i=1;s==1&&i<=1;i++)      /*最多读入1个扇区大小的文件*/
      {
        for(x=0;x<0x200;x++)buff[x]=0;  /*初始化缓冲区*/
        fread(buff,0x200,1,fp);
        biosdisk(3,0x80,0,0,i,1,buff);
      }
      if(s==1)printf("\n Modify Boot Complete !");
      fclose(fp);
      getch();
    }
  }
  return;
}

说明: 此部分我只是具体实现了读取MBR并检测是否改动和备份,安装LDMBR和恢复MBR(功能4和5),其他的没有测试.

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功