大扇区硬盘的出现与分析 - 飞空静渡 - CSDN博客

来源:百度文库 编辑:神马文学网 时间:2024/04/28 10:14:27
  大扇区硬盘的出现与分析 收藏        原创文章,转载请注明出处,谢谢!       
       作者:清林,博客名:飞空静渡扇区大小为4K的硬盘在09年末已经开始上市了,TOSHIBA已经的640G的2.5英寸的硬盘采用了4k大小的扇区。当今有三种基本的方法来增加硬盘的容量:
1、增加比特位的密度;
2、增加每英寸上的磁道数;
3、增加盘片数。在上面的三种基本的方法中,第一种即增加比特位的密度是最好的。我们知道,硬盘的磁道是由一序列的扇区组成的,并且扇区与扇区之间是有空隙、引子(lead-in)和错误校验信息的。那么采用大扇区的最直接的结果就是减少扇区之间的空隙,这样可以让出更多的空间来存放数据;而且也可以让高级格式化提供更有效率的数据完整性的错误校验机制。我们知道,硬盘的扇区可分区逻辑扇区和物理扇区,但对现在的硬盘来说,逻辑扇区的大小等于物理扇区的大小,其实也并没有严格区分物理扇区和逻辑扇区了。但是现在大扇区的硬盘的出现,就使得我们检测硬盘扇区大小时,应该考虑逻辑扇区大小和物理扇区大小的关系。
现在的许多硬盘都已提供增加扇区的大小的接口技术。然而,512字节的扇区的大小已经使用超过30年了。其结果就是现在的许多计算机系统都不想变更,并一直都使用512字节大小的扇区。随着现在的硬盘的容量越来越大,使用512字节扇区大小的硬盘,其效率问题也慢慢凸显出来。在2009年,许多硬盘厂商开始配置使用4096字节(4K)大小的扇区来存储数据,但也有可能在未来5年,这个扇区的大小还会要增加。ATA8-ACS和SBC-3标准已经为大扇区的硬盘提供了一些性能优化的信息报告,这些标准使用了基于SATA,SAS,USB和IEEE1394的接口技术。根据西部数据的官方文档,采用了4K大小的扇区的硬盘有一些需要注意的是,如果我们在向硬盘写入数据时没有使用4K对齐,并且我们的分区也不是4K对齐的话,那么我们向硬盘写入数据时就会耗费更多的时间。因此,我们在做数据备份和恢复时,在写硬盘数据时就应该检测硬盘的扇区大小,这样我们就可以按照4K对其来恢复数据,不然,我们恢复完的数据虽然没有错,但速度会大打折扣的。操作系统的支持目前只有Windows Vista SP1和Window 7在创建分区和文件系统时会取用硬盘设备提供的信息进行高级格式化。
而Windows XP, Windows Vista RTM, Linux, Apple Tiger, Apple Leopard和Apple Snow Leopard对SATA设备和USB设备并没有使用设备提供的信息进行高级格式化。检测大扇区硬盘
下面我将以Linux为例(windows也同理)说一下怎么检测硬盘的扇区大小,我的系统是ubuntu9.10,内核是linux-2.6.31.17。以往,我们检测硬盘扇区的大小是通过ioctl中的BLKSSZGET来获得磁盘扇区的大小的,在linux中的主要分区软件fdisk和parted也是这么做,我们看下典型的获取磁盘扇区大小的代码(这里以fdisk的源代码为例)。
view plaincopy to clipboardprint?
/* get size in bytes */ 
int 
blkdev_get_size(int fd, unsigned long long *bytes)  
{  
    unsigned long size;  
    int ver = get_linux_version();  
    /* kernels 2.4.15-2.4.17, had a broken BLKGETSIZE64 */ 
    if (ver >= KERNEL_VERSION (2,6,0) ||  
       (ver >= KERNEL_VERSION (2,4,18) && ver < KERNEL_VERSION (2,5,0))) {  
        if (ioctl(fd, BLKGETSIZE64, bytes) >= 0)  
            return 0;  
    }  
    if (ioctl(fd, BLKGETSIZE, &size) >= 0) {  
        *bytes = ((unsigned long long)size << 9);  
        return 0;  
    }  
    return -1;  

/* get size in bytes */
int
blkdev_get_size(int fd, unsigned long long *bytes)
{
 unsigned long size;
 int ver = get_linux_version();
 /* kernels 2.4.15-2.4.17, had a broken BLKGETSIZE64 */
 if (ver >= KERNEL_VERSION (2,6,0) ||
    (ver >= KERNEL_VERSION (2,4,18) && ver < KERNEL_VERSION (2,5,0))) {
  if (ioctl(fd, BLKGETSIZE64, bytes) >= 0)
   return 0;
 }
 if (ioctl(fd, BLKGETSIZE, &size) >= 0) {
  *bytes = ((unsigned long long)size << 9);
  return 0;
 }
 return -1;
} 在这里,如果我们对大扇区磁盘也采用这样的获取方式的话,我们将得到512字节大小的扇区。因此,我们有必要另外读取磁盘的设备信息来检测磁盘扇区的大小。根据ATA8-ACS文档规范,我们的操作系统都会有一个ATA IDENTIFY DEVICE的数据结构来说明一个磁盘设备的,无论linux还是windows都会有一个,在这里我以linux为例说明,windows也一样可用API获取。
在linux下,典型的获取这个数据结构的代码如下(这里为了简便,忽略了错误的检查):view plaincopy to clipboardprint?
unsigned short word106 = 0;  
struct hd_driveid id;  
int fd = open(diskname, O_RDONLY);  
ioctl(fd, HDIO_GET_IDENTITY, &id);  
word106 = id.words104_125[2]; 
unsigned short word106 = 0;
struct hd_driveid id;
int fd = open(diskname, O_RDONLY);
ioctl(fd, HDIO_GET_IDENTITY, &id);
word106 = id.words104_125[2]; 这样,我们就可以获取这个结构的第106个字(注意是字,不是字节)。而这个字就定义了磁盘扇区的大小,我们来看下这个字是怎么定义扇区大小的。
bit 15 固定为0。
bit 14 固定为1。
bit 13 如果为1就说明一个逻辑扇区有多个物理扇区组成。
bit 12 如果为1就说明设备被格式化成一个逻辑扇区的大小超过256个字。
bit 11-4 为保留。
bit 3-0 如果bit 13为1的话,这三个比特位就用来表示逻辑扇区的大小。
我们重点看下这前4个比特位是怎么表示扇区大小的。我用个公式来表示,sector_size = 2^x * 物理扇区大小(即512b)。
即是说逻辑扇区大小是2的x次方个物理扇区的大小,即是:扇区大小 = 2^x * 512。x就是这个字的前4位的值。
举个例来说,如果是个大扇区,扇区大小为4K即是4096个字节,那么在这个字中的表示为:
bit 13 = 1
bit 3-0 = 0011
二进制数0011 = 十进制数3,那么2的三次方为8,那么扇区大小是8*512,即4096 bytes。这样我们就可应用这个方法检测出是否是大扇区硬盘,那么在我们给硬盘分区的时候就可以让硬盘以4K大小来对齐,以让硬盘的读写速度达到最优。
据一些资料显示,大扇区还会对一些有原数据的文件系统有性能上的影响。例如对我们最常用的ntfs文件系统,如果我们要使大扇区的硬盘中的ntfs文件系统性能最优化,除了这个分区以4K对齐的话,还需要ntfs文件系统中的原数据(就是MFT里的个原文件)、目录和簇的开始位置也要4K对齐。我们知道fdisk的分区默认是按照柱面对齐的,一般一个柱面的大小是: 255个磁头 * 63个扇区/磁道 = 16065 个扇区。因此为了优化大扇区硬盘,fdisk的源代码应该可以修改一下了 :) 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fjb2080/archive/2010/02/01/5277242.aspx