Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1183403
  • 博文数量: 221
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2139
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-27 19:53
个人简介

JustForFun

文章分类

全部博文(221)

文章存档

2024年(6)

2023年(8)

2022年(2)

2021年(2)

2020年(29)

2019年(11)

2018年(23)

2017年(41)

2016年(76)

2015年(23)

我的朋友
最近访客

分类: LINUX

2017-08-03 11:36:06

uboot 对 FAT 分区的解析

制作过u启动烧录的u盘uboot无法识别,用SDFormatter.exe格式化后才能被uboot正常识别

改写 UBOOT 从 U 盘读入固件,然后刷机。发现有的 U 盘无法正确读到分区,跟踪了一下发现自己写的代码有漏洞,只尝试解析分区表里的第一个分区。

取消只解析第一个分区的限制,u盘启动盘是在第四个分区。
pt->boot_ind=0
pt->head=0
pt->sector=0
pt->cyl=0
pt->sys_ind=0
pt->end_head=0
pt->end_sector=0
pt->end_cyl=0
part_num=1
which_part=1


pt->boot_ind=0
pt->head=0
pt->sector=0
pt->cyl=0
pt->sys_ind=0
pt->end_head=0
pt->end_sector=0
pt->end_cyl=0
part_num=2
which_part=1


pt->boot_ind=0
pt->head=0
pt->sector=0
pt->cyl=0
pt->sys_ind=0
pt->end_head=0
pt->end_sector=0
pt->end_cyl=0
part_num=3
which_part=1


pt->boot_ind=80
pt->head=4
pt->sector=5
pt->cyl=0
pt->sys_ind=6
pt->end_head=fe
pt->end_sector=3f
pt->end_cyl=80
part_num=4
which_part=1

get_partition_info_extended函数中       
        if (((pt->boot_ind & ~0x80) == 0) &&
            (pt->sys_ind != 0) &&
           // (part_num == which_part) &&          //这里是只对第一个分区解析。注销以取消只第一个分区的限制
            (is_extended(pt->sys_ind) == 0)) {




跟踪的过程中重温了一下 MBR 的格式,这里记录一下 UBOOT 对其中分区表的解析。


MBR

主引导记录(Master Boot Record),位于存储介质的第一个扇区。存储介质可能是硬盘、U 盘或 SD 卡等。

MBR 存在第一个扇区里,总共有 512 字节,其包括三个部分:

    启动代码,前 446 个字节 (0,0x1bd]。一般 U 盘或 SD 卡不作启动用,这段空间的内容无意义。
    分区表 DPT(Disk Partition Table),64 字节 [0x1be, 0x1fd]
    结束标志,2 字节 [0x1fe, 0x1ff],0x55aa,用于标志 MBR 是否有效

分区表

每个分区信息占 16 字节,64 字节的分区表最多可以描述四个分区。如果想划分更多的分区,则要使用到扩展分区。

16 字节的分区信息意义为:

typedef struct dos_partition {
     unsigned char boot_ind; /* 0x80 - active            */
     unsigned char head; /* starting head            */
     unsigned char sector; /* starting sector          */
     unsigned char cyl; /* starting cylinder            */
     unsigned char sys_ind; /* What partition type          */
     unsigned char end_head; /* end head             */
    unsigned char end_sector; /* end sector               */
     unsigned char end_cyl; /* end cylinder             */
    unsigned char start4[4]; /* starting sector counting from 0  */
     unsigned char size4[4]; /* nr of sectors in partition       */
    } dos_partition_t;

    boot_ind, 0x80 表示活动分区,0x00 为非活动分区。
    head,分区起始磁头号
    sector,分区起始扇区号
    cyl,分区起始柱面号
    sys_ind,分区格式,各值的意义见下图
    end_head,结束磁头号
    end_sector,结束扇区号
    end_cyl,结束柱面号
    start4,分区起始相对扇区号,从磁盘开始到该分区的第一个扇区的偏移量,以扇区数为单位
    size4,分区的总扇区数

如果分区表项指定的分区一般称为主分区。另外,分区表项还可以指定分区类型为扩展分区 0x7,这样该表项描述的那个分区的起始扇区中还包括一个分区表。
FAT 分区

UBOOT 中按以下条件判断一个分区为 FAT 分区:

    分区结束标志 0x55aa
    分区的第一个扇区中有 FAT 标志,0x36 字节处有 ”FAT“ 字符,或 0x52 字节处有 “FAT32” 字符

原文http://www.cnblogs.com/sammei/p/4261404.html
阅读(1906) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~