当前位置: 首页 > news >正文

Linux 0.11 中,磁盘分区信息

        在 Linux 0.11 中,磁盘分区信息存储在主引导记录(MBR)中,具体位于磁盘的第一个扇区(即 0 柱面 0 磁头 1 扇区)。

分区信息存储位置

  1. 物理位置

    • 绝对扇区 0(LBA 0)

    • CHS 地址:柱面 0, 磁头 0, 扇区 1

  2. 数据结构

    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));
  3. 在 MBR 中的布局

    偏移量长度内容
    0x000446引导代码
    0x1BE16分区表项 1
    0x1CE16分区表项 2
    0x1DE16分区表项 3
    0x1EE16分区表项 4
    0x1FE2魔数 (0x55 0xAA)

在 Linux 0.11 源码中的实现

关键代码位于:

  1. 引导加载程序
    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
  2. 分区表解析
    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);
    }
  3. 分区访问
    分区被映射为特殊设备文件:

    • /dev/hd1 - 主分区1

    • /dev/hd2 - 主分区2

    • /dev/hd3 - 主分区3

    • /dev/hd4 - 主分区4


关于 "245 个分区" 的说明

Linux 0.11 不支持 245 个分区,因为:

  1. MBR 分区表仅支持 4 个主分区

  2. 早期内核没有实现扩展分区逻辑

  3. 设备号限制(8位主/从设备号):

    c

    复制

    下载

    // include/linux/fs.h
    #define MAJOR(a) (((unsigned)(a))>>8)
    #define MINOR(a) ((a)&0xff)

    最多支持 256 个设备,包括所有硬盘和分区

若需要更多分区,必须使用:

  1. 扩展分区(Linux 0.11 未实现)

  2. 多块物理硬盘

  3. 后期内核版本(1.x+ 支持扩展分区)


查看分区表的工具方法

  1. 使用 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
  2. 在 Linux 0.11 中调试

    c

    复制

    下载

    // 在 hd.c 中添加调试打印
    printk("Partition %d: start=%d, sectors=%d\n", i, p->start_sect, p->nr_sects);

http://www.dtcms.com/a/279226.html

相关文章:

  • win10安装Elasticsearch
  • 学习C++、QT---24(QT实现记事本项目的打开、保存、关闭)
  • 内测分发平台应用的异地容灾和负载均衡处理和实现思路
  • gitignore添加后如何生效?
  • docker简介
  • Xftp 7.0.0109p 安装教程 - 详细步骤图解
  • SpringBoot相较于Spring有什么优势
  • VR样板间:房产营销新变革
  • 每天一个前端小知识 Day 31 - 前端国际化(i18n)与本地化(l10n)实战方案
  • 【前端】【Iconify图标库】【vben3】createIconifyIcon 实现图标组件的自动封装
  • 缺乏实际里程碑管控项目进度,如何设定关键节点
  • 院级医疗AI管理流程—基于数据共享、算法开发与工具链治理的系统化框架
  • Sharding-Sphere学习专题(三)数据加密、读写分离
  • 机器人形态的几点讨论
  • 基于OpenCV的深度学习人脸识别系统开发全攻略(DNN+FaceNet核心技术选型)
  • SpringBoot3整合“Spring Security+JWT”快速实现demo示例与Apifox测试
  • 在 Azure Linux 上安装 RustFS
  • 【Echarts】 电影票房汇总实时数据横向柱状图比图
  • Swift 解 LeetCode 326:两种方法判断是否是 3 的幂,含循环与数学技巧
  • ELK部署与使用详解
  • BGP基本配置
  • QGC 环境搭建踩坑记录
  • XML vs JSON:核心区别与最佳选择
  • IDEA实现纯java项目并打包jar(不使用Maven,Spring)
  • C++--priority_queue的模拟实现
  • 幻想读 通过多版本并发控制(MVCC)和间隙锁(Gap Lock)的组合也能防止幻读具体说下
  • Transformer江湖录 第五章:江湖争锋 - BERT vs GPT
  • 如何保护文件传输安全?文件传输加密
  • 企业数字化资产管理安全、成本、协作困局难解?
  • Java行为型模式(命令模式)应用场景分析