Linux 0.11 中,磁盘分区信息
在 Linux 0.11 中,磁盘分区信息存储在主引导记录(MBR)中,具体位于磁盘的第一个扇区(即 0 柱面 0 磁头 1 扇区)。
分区信息存储位置
物理位置:
绝对扇区 0(LBA 0)
CHS 地址:
柱面 0, 磁头 0, 扇区 1
数据结构:
c
复制
下载
struct partition_table_entry {u8 boot_ind; // 引导标志 (0x80=活动分区)u8 head; // 起始磁头u8 sector; // 起始扇区 (低6位) + 起始柱面 (高2位)u8 cyl; // 起始柱面 (低8位)u8 sys_ind; // 分区类型 (0x83=Linux)u8 end_head; // 结束磁头u8 end_sector; // 结束扇区 + 结束柱面 (高2位)u8 end_cyl; // 结束柱面 (低8位)u32 start_sect; // 分区起始扇区 (相对LBA)u32 nr_sects; // 分区总扇区数 } __attribute__((packed));
在 MBR 中的布局:
偏移量 长度 内容 0x000 446 引导代码 0x1BE 16 分区表项 1 0x1CE 16 分区表项 2 0x1DE 16 分区表项 3 0x1EE 16 分区表项 4 0x1FE 2 魔数 (0x55 0xAA)
在 Linux 0.11 源码中的实现
关键代码位于:
引导加载程序:
boot/bootsect.s
中读取 MBR 并检查分区表:assembly
复制
下载
load_setup:mov dx, #0x0000 ! 驱动器0, 磁头0mov cx, #0x0002 ! 柱面0, 扇区2mov bx, #0x0200 ! 缓冲区地址: 0x7E00mov ax, #0x0200+4 ! 读取4个扇区int 0x13
分区表解析:
kernel/blk_drv/hd.c
中的partition_setup()
函数:c
复制
下载
void partition_setup(void) {struct buffer_head *bh;bh = bread(0, 0); // 读取第0块设备(硬盘)的0扇区(MBR)struct partition_table_entry *p = (struct partition_table_entry *)(0x1BE + bh->b_data);for (int i = 0; i < 4; i++, p++) {hd[i+5].start_sect = p->start_sect; // 主分区偏移hd[i+5].nr_sects = p->nr_sects;}brelse(bh); }
分区访问:
分区被映射为特殊设备文件:/dev/hd1
- 主分区1/dev/hd2
- 主分区2/dev/hd3
- 主分区3/dev/hd4
- 主分区4
关于 "245 个分区" 的说明
Linux 0.11 不支持 245 个分区,因为:
MBR 分区表仅支持 4 个主分区
早期内核没有实现扩展分区逻辑
设备号限制(8位主/从设备号):
c
复制
下载
// include/linux/fs.h #define MAJOR(a) (((unsigned)(a))>>8) #define MINOR(a) ((a)&0xff)
最多支持 256 个设备,包括所有硬盘和分区
若需要更多分区,必须使用:
扩展分区(Linux 0.11 未实现)
多块物理硬盘
后期内核版本(1.x+ 支持扩展分区)
查看分区表的工具方法
使用
fdisk
(在宿主系统):bash
复制
下载
fdisk -l /dev/sda
输出示例:
text
复制
下载
Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 4095 2048 1M 83 Linux /dev/sda2 4096 8191 4096 2M 83 Linux
在 Linux 0.11 中调试:
c
复制
下载
// 在 hd.c 中添加调试打印 printk("Partition %d: start=%d, sectors=%d\n", i, p->start_sect, p->nr_sects);