无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 7948|回复: 12
打印 上一主题 下一主题

[原创] 硬盘分区表CHS参数及分区DBR扇区磁头数与启动的关系

[复制链接]
跳转到指定楼层
1#
发表于 2011-6-22 09:58:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
引子:最近看到不点在时空论坛发了一个帖子:分区表合法性状态分类。

这几天,刚把系统给重装了,因为之前我写了一个GRUB4DOS下运行的活动分区磁头数检查与修改的程序,本来目的是用于修正使用ACRONIS BACKUP RECOVERY克隆系统之后,分区BPB部分磁头数为16不能正常启动的BUG的。使用这个程序检查时发现,刚重装的系统,BPB的磁头数描述为240,让我很惊讶,一开始以为程序写的有问题,进入系统,用WINHEX查看时确实为240。

使用不点的程序分析时,磁头数似乎也为240。因为对不点的程序原理不太清楚,分析结果也看不太懂,所以把程序截图上传。

之前,我只得出结论,分区DBR扇区BPB部分磁头数跟启动是有关系的,但是磁头数并不会影响磁盘的正常访问,也就是说无论BPB部分的磁头数如何取值,不管正确与否,都不会影响磁盘的访问,但它与启动有关系,不正确的取值,会导致无法启动系统。但是也有例外!!假如主引导是GRUB4DOS,在成功引导GRUB4DOS之后,利用GRLDR去引导NTLDR是不会有问题的,无论磁头数如何取值,总能成功引
导NTLDR。

上面提到磁头数与启动有关系,但什么才是正确的磁头数呢?一直百思不得其解,只知道有些IBM的机型,磁头数是被解释为240的。普通的电脑,磁头数一般为255,原来一直以为这就是标准取值,与机器BIOS有关系。但是同一台机器,我在重装系统之后,磁头数居然被描述为240,而且更改为255之后无法启动系统。想到不点刚写的mbrcheck,是根据分区表来计算CHS的,那么,分区DBR扇区BPB部
分的磁头数是否也与分区表有关系呢?想到重装系统之前,我曾经让 jianliulin帮我写一个CHS修正的程序,我曾测试过,更改过分区表,想到这里,大体知道是怎么回事了。 于是用WINHEX查看分区表,然后用 sectoreditor 去手动计算CHS的取值,发现假设磁头数为255时,根据LBA的数值计算出CHS的分区表取值,跟当前的分区表描述是不一致的,于是使用WINHEX修改CHS的取值,同时修改BPB磁头数为255,重启后发现可以正常启动。

结论:  分区表CHS参数描述,跟分区DBR扇区BPB磁头数的取值是有对应关系的,如果不一致,可能无法正常启动。

分区表1.JPG (26.13 KB, 下载次数: 136)

分区表1.JPG

分区表2.JPG (22.08 KB, 下载次数: 93)

分区表2.JPG

BPB 磁头数.JPG (21.01 KB, 下载次数: 100)

BPB 磁头数.JPG

BPB 磁头数2.JPG (56.38 KB, 下载次数: 111)

BPB 磁头数2.JPG

mbrcheck.JPG (31.56 KB, 下载次数: 101)

mbrcheck.JPG
2#
发表于 2011-6-22 10:50:17 | 只看该作者
grub4dos对主板支持LBA的将无视分区表chs参数。
我实机也遇到过,g4d能启动而直接ntldr无法启动的机器,用了某个分区软件不正确的结果。
看来grub4dos下做个磁头校正程序还有必要。
回复

使用道具 举报

3#
 楼主| 发表于 2011-6-22 11:04:54 | 只看该作者
错误更正!!  上面第二个图片的CHS描述仍然是错误的!!!!忘了重要的一点,SECTOREDITOR 是有BUG的,C超过1023 是无法描述的,CHS统一表示为FE FF FF。
再上传一下正确的CHS表示方法。 我是用DISKGEN 2010。07 版自动修正的!!!
请注意,新版的DISKGEN 已经取消了对CHS的检查,真不知道是福是祸啊,反正我觉得很遗憾。
另外,发现DISKGEN 表示似乎也不是完全正确的,所以手动修改了下。

[ 本帖最后由 sgw888 于 2011-6-22 11:10 编辑 ]

未命名.JPG (22.24 KB, 下载次数: 99)

未命名.JPG
回复

使用道具 举报

4#
发表于 2011-6-22 14:13:21 | 只看该作者

回复 1 楼

你这个分区表太牛了,竟然有 5 个解。

多解性被你验证了。谢谢。
回复

使用道具 举报

5#
 楼主| 发表于 2011-6-22 15:08:51 | 只看该作者
回 不点,因为前段时间,我让 jianliulin 帮我写一个修正CHS的程序,其间多次运行他帮我写的程序,但程序一直没有写好,反而把分区表搞得乱七八糟,因为一直不影响使用,所以就没有去管它,但这两天,我把系统重装了,采用GHOST那种万能克隆的方法安装,所以分区表彻底乱套了。
不过,仅是CHS参数有误,LBA表示法是正确的。

我倒是希望 不点 可以写一个在G4D下根据LBA的值修正CHS的分区表的程序。
回复

使用道具 举报

6#
发表于 2011-6-22 15:56:22 | 只看该作者
这样操作挺危险的...
回复

使用道具 举报

7#
发表于 2011-6-22 16:59:35 | 只看该作者
grub4dos 本来就有分区表和 BPB 的更正手段。

geometry --tune --sync 就是用于这个目的的。

这条命令首先获得准确的 H 和 S,然后再把它写往分区表以及各个主分区的 BPB 上。目前似乎逻辑分区不更改。逻辑分区一般靠后,更改起来,也可能不太可靠。其实,主分区也有可能是靠后的,更改起来也一样不可靠。所谓不可靠,就是说,由于 BIOS 的 INT13 的错误,有可能无法写入大的扇区号,或者,当你写入大的扇区号时,实际却写入小的扇区号了,这会造成灾难。虽然你也没错,我们的程序都没错,仅仅是 BIOS 有错,那就完蛋。

所以,安全起见,即使是硬盘,也不要往大的扇区号执行写操作。

最保险的做法是在保护模式的操作系统(Windows、Linux)下执行写操作,那样就不会受到 BIOS bug 的影响了。

如果你知道你的全部四个主分区的起始扇区都在 BIOS 的“安全写” 范围以内(即扇区号都比较小,比如都在 137G 以内),那么,执行 geometry --tune --sync 就是安全的。
回复

使用道具 举报

8#
 楼主| 发表于 2011-6-22 17:21:05 | 只看该作者
原来是这样啊。谢谢不点。 我还是等待 jianliulin 帮我写好CHS的修正程序,根据LBA来修正CHS的取值。
回复

使用道具 举报

9#
发表于 2011-6-22 19:56:54 | 只看该作者
光是根据分区表,只能检查是否矛盾、是否合法,不能确定 BIOS 所认可的 CHS 是什么样的。

按照古老的规范,只有 int13/ah=8 返回的 CHS 才是可靠的。但这块硬盘连接到不同的主板,所得到的 CHS 可能是不同的,因为这个情况与 U 盘一样。控制权都在主板 BIOS。而且,int13/ah=8 有可能是 buggy 的,那么就可能是错误的。

用 grub4dos 的几何参数探测,以及用 fbinst,可以得到正确的 CHS。

我认为,光是保证分区表合法,以及分区表与 BPB 一致,这是不够的。仍有潜在的错误存在,那就是,这些 CHS 并不等于 BIOS 所要求的 CHS。那么,今后在某一时刻,仍然可能会碰到问题(主要是启动 DOS 可能会失败)。
回复

使用道具 举报

10#
 楼主| 发表于 2011-6-23 12:10:05 | 只看该作者
我的目的主要是保证LBA跟CHS的一致性,另外还有就是超过CHS可以表示的地址尽量用微软的方法来表示 FE FF FF .
我只看过 SECTOREDITOR 的LBA 跟CHS转换,里面只有可以选择磁头数的地方,也就是255跟240.其它没有可以选择的地方.由此我的理解是,通过LBA转成CHS并写到分区表,只有两种可能的数值,一种是磁头数为255,另一种是磁头数为240.两种情况计算出来的数值显然是不同的.

不点兄说的BIOS认可的CHS,我自然是希望分区表表示的CHS跟BIOS认可的能够一致.  但是目前现成的工具,只有SECTOREDITOR ,我认为它的算法是没有问题的,至于BIOS认可的CHS,我还是无法跟分区表表示的CHS,它们之间的联系,我现在还是想不明白.很希望不点兄能够讲解的详细些. 最好是可以举例说明BIOS认可的CHS跟分区表表示的CHS,它们在哪些情况下会有差异,以及,我们该如何去修正它.   还有就是在WIN下如何探测到BIOS认可的CHS.
回复

使用道具 举报

11#
发表于 2011-6-23 12:50:49 | 只看该作者
有时候,一个话题,讨论到某种程度也就可以了,没必要再深究。

自从 Win98 以后,硬盘的容量大了,硬盘都支持 LBA。所以,即使 CHS 是混乱的,也不太要紧。

把分区表设置好,启动分区的 ID 字节,要设置为支持 LBA 的


  1. 0  Empty           1e  Hidden W95 FAT1 80  Old Minix       bf  Solaris        
  2. 1  FAT12           24  NEC DOS         81  Minix / old Lin c1  DRDOS/sec (FAT-
  3. 2  XENIX root      39  Plan 9          82  Linux swap / So c4  DRDOS/sec (FAT-
  4. 3  XENIX usr       3c  PartitionMagic  83  Linux           c6  DRDOS/sec (FAT-
  5. 4  FAT16 <32M      40  Venix 80286     84  OS/2 hidden C:  c7  Syrinx         
  6. 5  Extended        41  PPC PReP Boot   85  Linux extended  da  Non-FS data   
  7. 6  FAT16           42  SFS             86  NTFS volume set db  CP/M / CTOS / .
  8. 7  HPFS/NTFS       4d  QNX4.x          87  NTFS volume set de  Dell Utility   
  9. 8  AIX             4e  QNX4.x 2nd part 88  Linux plaintext df  BootIt         
  10. 9  AIX bootable    4f  QNX4.x 3rd part 8e  Linux LVM       e1  DOS access     
  11. a  OS/2 Boot Manag 50  OnTrack DM      93  Amoeba          e3  DOS R/O        
  12. b  W95 FAT32       51  OnTrack DM6 Aux 94  Amoeba BBT      e4  SpeedStor      
  13. c  W95 FAT32 (LBA) 52  CP/M            9f  BSD/OS          eb  BeOS fs        
  14. e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi ee  GPT            
  15. f  W95 Ext'd (LBA) 54  OnTrackDM6      a5  FreeBSD         ef  EFI (FAT-12/16/
  16. 10  OPUS            55  EZ-Drive        a6  OpenBSD         f0  Linux/PA-RISC b
  17. 11  Hidden FAT12    56  Golden Bow      a7  NeXTSTEP        f1  SpeedStor      
  18. 12  Compaq diagnost 5c  Priam Edisk     a8  Darwin UFS      f4  SpeedStor      
  19. 14  Hidden FAT16 <3 61  SpeedStor       a9  NetBSD          f2  DOS secondary  
  20. 16  Hidden FAT16    63  GNU HURD or Sys ab  Darwin boot     fb  VMware VMFS   
  21. 17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
  22. 18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
  23. 1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep        
  24. 1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT            
复制代码


也就是说,设置为(0C) for FAT32,或者 (0E) for FAT16 ,似乎就可以让 DOS 7.1 以 LBA 的方式来访问分区了。

如此一来,似乎不会碰到问题了。我不能很确定,因为我没有实际检验过这个说法。

=========

而那些关于 CHS 的讨论,大多都是针对 U 盘的。只有 USB 设备才有可能不支持 LBA。所以,也只有在讨论 U 盘的时候,才有必要讨论有关 CHS 的问题。
回复

使用道具 举报

12#
发表于 2011-6-23 13:14:38 | 只看该作者
原帖由 不点 于 2011-6-23 12:50 发表
有时候,一个话题,讨论到某种程度也就可以了,没必要再深究。

自从 Win98 以后,硬盘的容量大了,硬盘都支持 LBA。所以,即使 CHS 是混乱的,也不太要紧。

把分区表设置好,启动分区的 ID 字节,要设置为 ...



dg 已经都已经不管chs了,硬盘chs正确与否,是不是多大关系?
回复

使用道具 举报

13#
发表于 2011-6-23 13:23:48 | 只看该作者
问题是,能严格区分硬盘和 U 盘吗?

在 Windows 下确实可以区分,那个“可移动磁盘” 就是 U 盘。但 diskgen 运行在 DOS 下,就不容易区分了,如果只是通过 BIOS 来做的话。

那些支持 LBA 的 U 盘 BIOS,确实不受影响。但那些只支持 CHS 的,可以判定为 U 盘。

可以这样:凡是支持 LBA 的,都可以看成硬盘,不管是不是硬盘。而不支持 LBA 的,就可以判定为 U 盘了。

因此,对于那些支持 LBA 的情况,可以永远使用 H=255,S=63。

不过,如果是 U 盘,那么,它插到别的机器上,有可能不支持 LBA 了,那样,还是会出问题的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-21 08:19

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表