AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1733473
Accepted
Barné Lighthead
Barné Lighthead
Asked: 2022-07-25 22:26:40 +0800 CST2022-07-25 22:26:40 +0800 CST 2022-07-25 22:26:40 +0800 CST

Fdisk 输出看似荒谬的 CHS 值

  • 772

采用以下 fdisk 输入:

o # Create DOS/MBR partition table.
n # Create new partition.
    p # Partition type
    1 # Partition ID
    2048 # Starting sector
    +4M # Ending sector
t # Assign said partition to a FAT12 filesystem.
    1 # FAT12 filesystem.
a # Mark said partition as bootable.
w # Write partition table.

现在,让我们看一下 MBR,特别是分区条目(分区条目从0x80第一行末尾附近开始)。

000001b0: 0000 0000 0000 0000 4a2f 9087 0000 8020  ........J/.....
000001c0: 2100 01a2 2200 0008 0000 0020 0000 0000  !..."...... ....
000001d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001f0: 0000 0000 0000 0000 0000 0000 0000 55aa  ..............U.

根据 MBR 部分条目的布局(在此处和此处给出),我们可以从中收集 CHS 元组的值是0x20、0x21、0x00。

0x20相当简单:它相当于第 32 个头。

0x21包含起始扇区和起始柱面。0x21-> 0b00100001,给出33扇区,柱面的第 8 位和第 9 位导致0( 0b00)。

结合0b00(来自0x21)和的圆柱体位0b00000000,我们得到0b0000000000圆柱体。总而言之,我们最终的起始磁头为32,起始扇区为33,起始柱面为0。

当我尝试通过 BIOS 中断加载此 CHS 时,它抱怨 CHS 无效(我可以正常读取其他扇区)。我认为这是因为头部是 32;毕竟,你为什么会有一个 16 盘片的硬盘呢?

tl;博士

Fdisk 输出带有 CHS 值的 MBR。

我的问题是我是否误解了 CHS 值是如何编码到分区条目中的,或者这是否是 fdisk 的一个怪癖。

partitioning mbr
  • 1 1 个回答
  • 375 Views

1 个回答

  • Voted
  1. Best Answer
    user1686
    2022-07-25T22:56:58+08:002022-07-25T22:56:58+08:00

    根据 fdisk 本身,C/H/S 值确实应该是:

    命令(m 寻求帮助):x
    
    专家命令(m 寻求帮助):p
    
    磁盘 test.disk:64 MiB,67108864 字节,131072 个扇区
    单位:1 * 512 = 512 字节的扇区
    扇区大小(逻辑/物理):512 字节/512 字节
    I/O 大小(最小/最佳):512 字节/512 字节
    磁盘标签类型:dos
    磁盘标识符:0xd771f127
    
    Device Boot Start End Sectors Id Type   Start-C/H/S End-C/H/S Attrs
    test.disk1 * 2048 10239 8192 1 FAT12     0/32/33 0/162/34     80
    

    fdisk 不会尝试匹配实际的磁盘几何结构——这在 C/H/S 限制内长期以来是不可能的,所以它所做的只是计算一些值,这些值在转换回 LBA 时会给出正确的结果。

    来自 util-linux 的代码include/pt-mbr.h:

    static inline void
    dos_partition_sync_chs(struct dos_partition *p,
                           unsigned long long int part_offset,
                           unsigned int geom_sectors,
                           unsigned int geom_heads)
    {
            unsigned long long int start = part_offset + dos_partition_get_start(p);
            unsigned long long int stop = start + dos_partition_get_size(p) - 1;
            unsigned int spc = geom_heads * geom_sectors;
    
            if (start / spc > 1023)
                    start = spc * 1024 - 1;
            if (stop / spc > 1023)
                    stop = spc * 1024 - 1;
    
            p->bc = (start / spc) & 0xff;
            p->bh = (start / geom_sectors) % geom_heads;
            p->bs = ((start % geom_sectors + 1) & 0x3f) |
                    (((start / spc) >> 2) & 0xc0);
    
            p->ec = (stop / spc) & 0xff;
            p->eh = (stop / geom_sectors) % geom_heads;
            p->es = ((stop % geom_sectors + 1) & 0x3f) |
                    (((stop / spc) >> 2) & 0xc0);
    }
    

    来自 util-linux 的评论libfdisk/src/dos.c:

     /*
      * Conversion from C/H/S to LBA is defined by formula:
      *   LBA = (c * N_heads + h) * N_sectors + (s - 1)
      * Let o to be:
      *   o = LBA - (s - 1)
      * Then formula can be expressed as:
      *   o = (c * N_heads + h) * N_sectors
      */
    

    为什么你会有一个 16 盘片的硬盘?

    您假装有一个 16 盘片的硬盘,以便表示比 C/H/S 系统通常可以表示的更多的磁盘空间。每个盘片只有 64ki 柱面 × 255 个扇区 × 2 个磁头,每个盘片只能达到约 8 GB,显然磁盘现在已经稍微超出了这个范围。

    操作系统或固件不会单独控制每个磁头,它只是通过 ATA 命令将数字传递给磁盘并取回数据,因此它并不真正关心磁盘是否有 255 个磁头。磁盘本身也不再 - 现在磁盘做的第一件事是使用公式将 C/H/S 值转换为线性 LBA 地址(假设磁盘被赋予 C/H/S 而不是 LBA 开始) .

    因此,即使在 BIOS 和操作系统切换到直接处理 LBA 之前,使用“荒谬”的 C/H/S 值来访问该格式通常允许的更多磁盘空间已经很常见。

    当前所有的操作系​​统都只是忽略 MBR 中的 C/H/S 字段并专门处理 LBA,显然这就是“OnTrack 磁盘管理器”在 MS-DOS 中过去所做的事情。(此外,据我所知,SCSI 磁盘从一开始就不支持 C/H/S,它们始终只支持 LBA。)我可以肯定的是,您现在发现的几乎所有 BIOS 都具有原生支持LBA 通过“扩展 INT 13h”(正如 Google 告诉我的那样)。

    • 5

相关问题

  • 更改分区的(类型)GUID?

  • 在未分配空间的备份硬盘中安装 ubuntu

  • 如何完全擦除笔记本电脑磁盘以进行全新的 Ubuntu 安装?

  • 分区大小 128GB 但仅检测到 64GB [重复]

  • 我应该对用于存储的辅助(非操作系统)SSD 进行分区吗?[关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve