硬盘的第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);
}
Copyright © 2015-2023 问渠网 辽ICP备15013245号