跟我一起写操作系统

    返回首页    发表留言
本文作者:李德强
          第二节 硬盘分区
 
 

        硬盘的第1个扇区内容非常重要,0 ~ 0x1be为引导程序。而硬盘的分区表位0x1be处。分区表的格式如下:

  • 字节0:是否可启动

  • 字节1-3:CHS信息

  • 字节4:分区类型

  • 字节5-7:CHS信息

  • 字节8-11:开始扇区的偏移

  • 字节12-16:分区中的扇区数

        可以看到,分区表中每一个分区信息占用16个字节,从0x1be到0x200(不包括0x200)共有64个字节,也就是说一共可以表示4个分区的信息(16 * 4 = 64)。它的结构非常简单,但是我们不打算去实现一个这样的分区表。我们要跳过硬盘的第1个扇区,而将一个自定义的分区表写入第2个扇区中,这个自定义的分区表格式如下:

typedef struct s_partition_table
{
        //设备号
        u8 device;
        //是否可以启动
        u8 boot;
        //分区ID号
        u8 id;
        //分区类型
        u8 type;
        //位图开启扇区号
        u32 bitmap_start;
        //数据开启扇区号
        u32 start;
        //分区扇区数
        u32 size;
} s_pt;

        创建分区表,在实际使用过程中,创建分区表的操作只需执行一次,在创建了分区表之后,以后每次启动系统时只需再将其载入即可:

void create_partition_table()
{
        //hda1
        sys_var->hda_info->pts[0].device = 0x01;
        sys_var->hda_info->pts[0].boot = 0x01;
        sys_var->hda_info->pts[0].id = 0x01;
        sys_var->hda_info->pts[0].type = 0x00;
        sys_var->hda_info->pts[0].bitmap_start = HDA1_BITMAP_START;
        sys_var->hda_info->pts[0].start = HDA1_START;
        sys_var->hda_info->pts[0].size = HDA1_SIZE;
        //hda2
        sys_var->hda_info->pts[1].device = 0x02;
        sys_var->hda_info->pts[1].boot = 0x00;
        sys_var->hda_info->pts[1].id = 0x02;
        sys_var->hda_info->pts[1].type = 0x00;
        sys_var->hda_info->pts[1].bitmap_start = HDA2_BITMAP_START;
        sys_var->hda_info->pts[1].start = HDA2_START;
        sys_var->hda_info->pts[1].size = HDA2_SIZE;
        //将分区表内容写入1号扇区
        write_sector(1, (u8*) sys_var->hda_info->pts);
        printf("[ OK ] Create hda partition table.\n");
}

        载入分区表:

void load_partition_table()
{
        read_sector(1, (u8*) sys_var->hda_info->pts);
        printf("[ OK ] Load hda partition table.\n");
        printf("\tdevice boot id type%s start end sectors\n");
        for (int i = 0; i < HD_PT_COUT; i++)
        {
                if (sys_var->hda_info->pts[i].device == 0)
                {
                        break;
                }
                sys_var->hda_info->pt_count++;                        
        }
}

        格式化分区,与创建分区表一样,也只需执行一次,除非特殊需要:

void format_hda(u32 uid, u32 gid, u32 mode)
{
        u8* empty = malloc(0x200);
        for (int i = 0; i < 0x200; i++)
        {
                empty[i] = 0;
        }
        for (int i = 0; i < sys_var->hda_info->pt_count; i++)
        {
                u32 bitmap_size = sys_var->hda_info->pts[i].size / 8 / 0x200;
                for (int j = 0; j < bitmap_size / 0x200; j++)
                {
                        write_sector(sys_var->hda_info->pts[i].bitmap_start + j, empty);
                }
                s_fs fs_root;
                u8 *p = (u8*) &fs_root;
                for (int i = 0; i < 0x200; i++)
                {
                        p[i] = 0;
                }
                fs_root.owner = uid;
                fs_root.group = gid;
                fs_root.mode = mode;
                fs_root.dot = hda_alloc(sys_var->hda_info->pts[i].device);
                fs_root.dotdot = fs_root.dot;
                str_copy("/", fs_root.name);
                write_sector(fs_root.dot, (u8 *) &fs_root);
        }
        free(empty);
}

 

    返回首页    返回顶部
#1楼  Leifeng  于 2017年12月28日17:21:04 发表
 
这节的内容0.17中不存在啊
  看不清?点击刷新

 

  Copyright © 2015-2023 问渠网 辽ICP备15013245号