主引导记录MBR详解

MBR分区表实验

#以下内容为在虚拟机上的实验输出结果(黑色字体部分),红色文字为注释

 #使用fdisk命令打印磁盘/dev/sdd的分区表

[root@linux partitiontable]# fdisk /dev/sdd

Command (m for help): p

Disk /dev/sdd: 4139 MB, 4139778048 bytes


#磁盘sdd有128个磁头,每个磁道有62个扇区,共1018个柱面

#更容易理解的表述:磁盘sdd有1018个柱面,每个柱面有128个磁道(对应于128个磁头),

#每个磁道有62个扇区,每个扇区有512个字节。分配分区的单位定义为一个柱面的容量,

#即128*62*512=4063232字节。块的大小为1024字节。

128 heads, 62 sectors/track, 1018 cylinders

Units = cylinders of 7936 * 512 = 4063232bytes

 

#Start和End的单位是柱面,柱面从1开始计数。注意在MBR的分区表内,柱面和磁头都是从0开始计数,但扇区是从1开始计数。主引导记录(Master Boot Record,缩写:MBR)位于(0柱面0磁头1扇区),大小为1个扇区(512bytes)。但是0柱面0磁头整个磁道,除了第一个扇区写入mbr外,不再分配给磁盘分区。这样磁盘sdd的第一个分区sdd1实际是从(0柱面1磁头1扇区)开始的。因此尽管给第一个分区分配了16个柱面(相当于63488个块),但实际只有63457个块,恰好少一个磁道的块数(31个块)。

  Device Boot      Start         End      Blocks  Id  System

/dev/sdd1               1          16       63457  83  Linux

/dev/sdd2              17          63      186496  83  Linux

/dev/sdd3              64        1018    3789440   83  Linux

 

Command (m for help): q

 

#Test程序是我写的一个直接从MBR扇区读取分区表的程序,代码将在文尾附上。

[root@linux partitiontable]# ./test sdd.mbr

non-bootable

from CHSAddr:   head:1  sector:1        cylinder:0

partition type:131

to CHSAddr:     head:127         sector:62       cylinder:15

OFFSET:62(sector)       LENGTH:126914(sectors)

 

non-bootable

from CHSAddr:   head:0  sector:1        cylinder:16

partition type:131

to CHSAddr:     head:127         sector:62       cylinder:62

OFFSET:126976(sector)   LENGTH:372992(sectors)

 

non-bootable

from CHSAddr:   head:0  sector:1        cylinder:63

partition type:131

to CHSAddr:     head:127         sector:62       cylinder:249

OFFSET:499968(sector)   LENGTH:7578880(sectors)

 

#使用od命令输出分区表

[root@linuxpartitiontable]# od -tu1 -j446 sdd.mbr

0000676   0  1   1   0 131 127 62  15  62  0   0   0 194 239  1   0

0000716   0   0   1  16131 127  62  62   0240   1  0   0 177   5   0

0000736   0  0   1  63 131 127 254 249   0 161  7   0   0 165 115  0

0000756   0  0   0   0  0   0   0  0   0   0  0   0   0  0   0   0

0000776  85 170

 

Test代码:

#include<stdio.h>
#include <unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

#define PT_OFFSET 446
#define PT_LEN    16
#define PT_N      4

//Cylinder-Head-Sectoradderess type
typedefstruct
{
        unsigned char head:8;
        unsigned char sector:6;
        unsigned short cylinder:10;
} CHS;

voidprintPT(char *buf);

intmain(int argc, char *argv[])
{
        int fd = open(argv[1], O_RDONLY);

        if(fd < 0)
        {
                perror("open");
                exit(1);
        }

        if(lseek(fd, PT_OFFSET, SEEK_SET) ==-1)
        {
                close(fd);
                perror("lseek");
                exit(1);
        }

        char buf[PT_LEN];
        int i;

        for(i = 0; i < PT_N; i++)
        {
                bzero(buf, PT_LEN);
                if(read(fd, buf, PT_LEN) !=PT_LEN)
                {
                        printf("can't getfull partition table[%d]\n", i);
                        close(fd);
                        exit(1);
                }

                if(buf[1] || buf[2] || buf[3])
                        printPT(buf);
        }

        close(fd);
        return 0;
}

voidprintPT(char *buf)
{
        switch((unsigned char)buf[0])
        {
                case 0x80:
                        printf("bootable\n");
                        break;
                case 0x00:
                        printf("non-bootable\n");
                        break;
                default:
                       printf("invalid\n");
        }

        CHS chs;
        memcpy(&chs, buf+1,  3);
        printf("from CHSAddr:\thead:%d\tsector:%d\t cylinder:%d\n", chs.head, chs.sector, chs.cylinder);
        printf("partition type:%d\n",(unsigned char)buf[4]);
        memcpy(&chs, buf+5, 3);
        printf("to CHSAddr:\thead:%d\tsector:%d\t cylinder:%d\n", chs.head, chs.sector, chs.cylinder);
        printf("OFFSET:%d(sector)\t",*(unsigned int*)&buf[8]);
        printf("LENGTH:%d(sectors)\n\n", *(unsignedint*)&buf[12]);
}
 
 

标准MBR结构

地址

描述

长度

Hex

Oct

Dec

0000

0000

0

代码区

440

(最大446)

01B8

0670

440

disk signature (optional)

4

01BC

0674

444

一般为空值; 0x0000

2

01BE

0676

446

Table of primary partitions

(四个16 byte的主分区表入口)

64

01FE

0776

510

55h

MBR 有效标志:

0x55AA

2

01FF

0777

511

AAh

MBR, 总大小: 446 + 64 + 2 =

512

 

MBR分区表结构

偏移

长度(字节)

描述

00H

1

分区状态:0x00-->非活动(不可引导)分区;

0x80--> 活动(可引导)分区;

其它数值没有意义

01H

1

分区起始磁头号(HEAD),用到全部8位

02H

2

分区起始扇区号(SECTOR),占据02H的位0-5;

该分区的起始磁柱号(CYLINDER),占据

02H的位6-7和03H的全部8位

04H

1

分区类型

05H

1

分区结束磁头号(HEAD),用到全部8位

06H

2

分区结束扇区号(SECTOR),占据06H的位0-5;

该分区的起始磁柱号(CYLINDER),占据

06H的位6-7和07H的全部8位

08H

4

分区起始相对扇区号

0CH

4

分区总的扇区数

 


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值