硬盘的第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号