题目:
第2章作业-1
下图为某硬盘MBR扇区的部分数据,从该图可知,该硬盘的大小应为_______GB。(按照1K=1000,1个扇区500字节算)
A.80 B.160 C.320 D.250
预备知识:
一 0x01C2
首先,MBR与GPT是分区表的格式,0x01C2的值既可以表明分区表格式,也同时表明了文件系统格式。例如fat32,ntfs为文件系统格式。
注意:分区表是对整个磁盘而言的,用来划分分区的界限以及存储每个分区的元数据。而文件系统则是对于一个分区而言的,用来管理在分区里存储的文件结构和相关的元数据。
UNVALID = 0x00, //无效值,windows下不允许使用
FAT12 = 0x01,
FAT16 = 0x04, //小于32M的FAT16
FAT16 = 0x06, //大于等于32M的FAT16
WIN_FAT16 = 0x0E, //不知道与0x06有什么区别
FAT32 =0x0B,0x0C, //资料上记录的是win95的FAT32,但没找到其他的fat32啊
HIDDEN_FAT32 = 0x1B,0x1C, //不清楚什么意思
NTFS = 0x07,
NTFS_VOLUME_SET = 0x86, 0x87, //不清楚什么意思
WIN_EXTENDED = 0x05,0x0F, //扩展分区,没猜错的话应该就是电脑上显示的逻辑分区和扩展分区,貌似0x0F是大于8G的,0x05不清楚
LINUX = 0x83, //ext2/ext3都是这个值,其他linux下的文件系统不清楚是否也是这个值
LINUX_SWAP = 0x82, //linux的swap分区
LINUX_EXTENDED = 0x85, //linux下的扩展分区?不清楚什么意思
EFI GPT = 0xEE, //硬盘使用GPT引导方式时为了防止不支持GPT的设备对硬盘误操作赋的一个非法值
二 扇区数据的小端读法
例如64位系统在内存中存在如下数据 : 02 13 ab 32 ----> 小端序读出应是 0x 32ab1302
MBR(0x01C2 != 0xEE)支持的单个分区的最大容量0xFFFFFFFF扇区(约等于2T),故在指定位置应该按照小端序一次性读取8位16进制数(BIN 32位)。
下图中 0x01CA 指第一分区表扇区总数,读取时应该从0X01CA处向后读8位(16进制),在题中,读作0x 012A1481。
三 读取硬盘大小
首先,应该知道,在MBR分区表下,主引导分区为446字节,每一个分区表项为16字节( 两位16进制数为一个字节 ,如 FF ),从0x01BE开始,每16字节为一个表项。故图中红线与蓝线圈定的地方分别为第一第二分区表项,且该分区扇区总数依次为0x01CA 与 0x01DA,类推。注意,计算时不需要看0x 01C6的值。
解题:
0x01CA : 012A1481
0x01DA : 08606B2C
0x01EA : 00000000
0x01CA + 0x01DA = 98A7FAD
(0x 98A7FAD) * (+ 500) / (+ 1000) / (+ 1000) / (+ 1000) = 80
注: 题目要求512近似500 ,1024近似1000
乘512 —> MBR 默认一个扇区为512字节
除1024 —> byte 转 KB 转 MB 转 GB