茗宸博客网

  • 首页
  • 数据通信
    • 华为
    • 思科
    • 浪潮科技
    • 锐捷
  • 硬件瞎折腾
    • 电脑折腾
    • 软路由
    • 服务器
    • 私有NAS
    • FPV无人机瞎折腾
  • 网络安全
    • CTF经验
    • 实战环境
    • 渗透实战
    • 蓝队加固
    • 近期赛事
    • 漏洞分享
  • 网络技术
    • 网络基础
    • 网络技术精品
    • linux基础
    • 计算机基础
  • 编程学习
    • python
  • 运行维护
  • 服务器搭建
  • 资源分享
  • 随手笔记
    • 随手笔记之ensp
    • 随手笔记之mysql
  • 日常
    • 拍摄
茗宸博客
随手笔记
  1. 首页
  2. 硬件瞎折腾
  3. 数据恢复
  4. 正文

详解FAT32文件系统 (一文双篇)

2024年6月24日 502点热度 0人点赞 0条评论
内容目录

通过使用DiskEditor对硬盘的分析,现对硬盘的MBR区及FAT32文件系统做一个详细的介绍。

新硬盘->低格后 变化:所有扇区中的字节数据填充为0x00
低格后->分区后 变化:写硬盘的MBR(主引导扇区)区
分区后->格式华 变化:写硬盘的FAT(文件分配表)区

MBR区介绍:
起始位置:0柱面0磁头1扇区(硬盘的第一个扇区)
结束位置:0柱面0磁头1扇区
大小:512(硬盘每个扇区的所占用的字节数)个字节

00  01  02  03  04  05  06  07      08  09  0a  0b  0c  0d  0e  0f

00000000 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000010 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
………… … … … … … … … … - … … … … … … … …
000001b0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 80 01
000001c0 01 00 0c ff ff fe 3f 00 - 00 00 fc 8a 38 01 00 00
000001d0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000001e0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000001f0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 55 aa

    000 ~ 1bd (446字节)executable code(我们不使用,固定填写0x00)
    1be ~ 1cd    (16字节)1st partition entry(参数解释见下面)
    1ce ~ 1dd    (16字节)2st partition entry(同第一个分区)
    1de ~ 1ed    (16字节)3st partition entry(同第一个分区)
    1ee ~ 1fd    (16字节)4st partition entry(同第一个分区)
    1fe ~ 1ff    (2字节)boot record signature(固定值:55 aa)

现以第一个分区的入口参数为例:
80 分区状态(80H表示为激活分区, 00H表示为非激活分区)
01 分区的开始磁头
01 00 分区的开始柱面和扇区(0 ~ 5位为扇区号、8 ~ 15位为柱面号的低8位,6 ~ 7位为柱面号的高两位)
0c 分区的类型(0c表示为FAT32,用LBA方式)
ff 分区的结束磁头
ff fe 分区的结束柱面和扇区(表示同开始磁头)
3f 00 00 00 从MBR到第一个分区扇区的扇区个数(一般为硬盘扇区的最大值)
fc 8a 38 01 分区的总扇区数(可以计算扇区的总大小)

FAT区介绍:
起始位置:0柱面1磁头0扇区
结束位置:根据硬盘参数不同有所不同
大小:硬盘的总簇数×4字节

FAT区中的BOOT:
起始位置:0柱面1磁头0扇区
结束位置:0柱面1磁头0扇区
大小:512字节

00  01  02  03  04  05  06  07      08  09  0a  0b  0c  0d  0e  0f

00000000 eb 58 90 4d 53 57 49 4e - 34 2e 31 00 02 08 20 00
00000010 02 00 00 00 00 f8 00 00 - 3f 00 ff 00 3f 00 00 00
00000020 fc 8a 38 01 fc 4d 00 00 - 00 00 00 00 02 00 00 00
00000030 01 00 06 00 00 00 00 00 - 00 00 00 00 00 00 00 00
00000040 80 00 29 ab 0b 64 15 00 - 00 00 00 00 00 00 00 00
00000050 00 00 46 41 54 33 32 20 - 20 20 xx xx xx xx xx xx
00000060 xx xx xx xx xx xx xx xx - xx xx xx xx xx xx xx xx
…… … … … … … … … … - … … … … … … … …
000001f0 xx xx xx xx xx xx xx xx - xx xx xx xx xx xx 55 aa

    000 ~ 059 (60字节)各个参数(参数解释见下面)
    000 ~ 059 (420字节)executable code(初始值固定)
    000 ~ 059 (2字节)boot record signature(固定值:55 aa)

现解释各个参数的含义:
eb 58 90 跳转代码(固定值: eb 58 90)
4d 53 57 49 4e 34 2e 31 OEM名字(固定值: 表示MSWIN4.1)
00 02 每扇区的字节数(512)
08 每簇的扇区数
20 00 保留的扇区数(通常固定为32)
02 FAT表的个数(通常有2个)
00 00 未使用(固定为0)
00 00 未使用(固定为0)
f8 介质类型(硬盘为f8)
00 00 未使用(固定为0)
3f 00 每磁道的最大扇区数(硬盘的参数)
ff 00 最大磁头数(硬盘的参数)
3f 00 00 00 分区中隐藏的扇区数(初始化时写入每磁道的最大扇区数)
fc 8a 38 01 分区中的扇区总数(自己根据硬盘参数计算)
fc 4d 00 00 每个FAT表占用的扇区数
00 00 Flags(Bits 0-4 Indiate Active FAT Copy)(Bit 7 Indicates whether FAT mirroring is enabled or disable )(if FAT mirroring is disabled, the FAT information is only written to the copy indicated by bits 0-4)
00 00 FAT32驱动版本(固定值:00 00)
02 00 00 00 根目录区的开始簇号(00 01 两个簇号不使用)
01 00 文件系统信息(后面有相关的说明)扇区所在位置的扇区号(此扇区号为相对位置)
06 00 备份引导扇区所在位置的扇区号(此扇区号为相对位置)
00 00 00 00 00 00 00 00 00 00 00 00 保留
80 分区的逻辑驱动号(第一个分区固定为80)
00 未使用
29 扩展标识(固定值:29)
ab 0b 64 15 分区的串号(工控机硬盘为74 00 e6 f0)
00 00 00 00 00 00 00 00 00 00 00 分区的名称(工控机硬盘为4e 4f 20 4e 41 4d 45 20 20 20 20意思为“NO NAME”)
46 41 54 33 32 20 20 20 FAT名称(固定值:表示“FAT32”)

executable code:
具体含义不明(应该是用来引导用的代码)

FAT区中的文件系统信息区:
起始位置:0柱面1磁头1扇区
结束位置:0柱面1磁头1扇区
大小:512字节

00  01  02  03  04  05  06  07      08  09  0a  0b  0c  0d  0e  0f

00000000 52 52 61 41 00 00 00 00 - 00 00 00 00 00 00 00 00
00000010 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
…… … … … … … … … … - … … … … … … … …
000001e0 00 00 00 00 72 72 41 61 - 75 90 1d 00 44 05 00 00
000001f0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 55 aa

    000 ~ 003   1e4 ~ 1fd (30字节)各个参数(参数解释见下面)
    004 ~ 1e3 (480字节)未知(固定值:00)
    000 ~ 059 (2字节)boot record signature(固定值:55 aa)

现解释各个参数的含义:
52 52 61 41 标识(First Signature)
72 72 41 61 标识(Signture of FSInfo sector)
75 90 1d 00 剩余的簇数(如果设置为ff ff ff ff,表示未知)(工控机硬盘为fc 94 18 00)
44 05 00 00 最近一次被分配的簇号(工控机硬盘为02 00 00 00)
00 00 00 00 00 00 00 00 00 00 00 00 保留
00 00 未知

FAT区中的未知数据区
起始位置:0柱面1磁头2扇区
结束位置:0柱面1磁头2扇区
大小:512字节

00  01  02  03  04  05  06  07      08  09  0a  0b  0c  0d  0e  0f

00000000 fa 66 0f b6 46 10 66 8b - 4e 24 66 f7 e1 66 03 46
00000010 1c 66 0f b7 56 0e 66 03 - c2 33 c9 66 89 46 fc 66
00000020 c7 46 f8 ff ff ff ff fa - 66 8b 46 2c 66 83 f8 02
00000030 0f 82 cf fc 66 3d f8 ff - ff 0f 0f 83 c5 fc 66 0f
00000040 a4 c2 10 fb 52 50 fa 66 - c1 e0 10 66 0f ac d0 10
00000050 66 83 e8 02 66 0f b6 5e - 0d 8b f3 66 f7 e3 66 03
00000060 46 fc 66 0f a4 c2 10 fb - bb 00 07 8b fb b9 01 00
00000070 e8 be fc 0f 82 aa fc 38 - 2d 74 1e b1 0b 56 be d8
00000080 7d f3 a6 5e 74 19 03 f9 - 83 c7 15 3b fb 72 e8 4e
00000090 75 d6 58 5a e8 66 00 72 - ab 83 c4 04 e9 64 fc 83
000000a0 -
000000b0 -
000000c0 -
000000d0 -
000000e0 -
000000f0 -
00000100 d2 03 c0 13 d2 e8 18 00 - fa 26 66 8b 01 66 25 ff
00000110 -
00000120 -
00000130 -
00000140 -
00000150 -
00000160 -
00000170 0f a4 c2 10 fb 8b df b9 - 01 00 e8 b4 fb 5a 0f 82
00000180 9f fb fb 8b da c3 00 00 - 00 00 00 00 00 00 00 00
00000190 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000001a0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000001b0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000001c0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000001d0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000001e0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
000001f0 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 55 aa

FAT表介绍:
起始位置:0柱面1磁道1扇区+保留扇区数+(每个FAT表占用的扇区数×2)
结束位置:根据分区情况确定
大小:根据分区情况确定

00  01  02  03  04  05  06  07      08  09  0a  0b  0c  0d  0e  0f

00000000 f8 ff ff 0f ff ff ff ff ff ff ff 0f ff ff ff 0f
00000010 a6 00 00 00 ff ff ff 0f ff ff ff 0f ff ff ff 0f
……
000001e0 ff ff ff 0f ff ff ff 0f ff ff ff 0f ff ff ff 0f
000001f0 ff ff ff 0f ff ff ff 0f ff ff ff 0f ff ff ff 0f

说明:
每簇的使用情况用32位二进制填写,未被分配的簇相应位置写零;坏簇相应位置填入特定值;已分配的簇相应位置填入非零值,具体为:如果该簇是文件的最后一簇,填入的值为FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在FAT表中。0000000H、00000001H两簇号不使用,其对应的两个DWORD位置(FAT表开头的8个字节)用来存放该盘介质类型编号。FAT表的大小就由该逻辑盘数据区共有多少簇所决定,取整数个扇区

DATA区介绍:
起始位置:0柱面1磁道1扇区+保留扇区数+(每个FAT表占用的扇区数×2)
结束位置:根据分区情况确定
大小:根据分区情况确定

00  01  02  03  04  05  06  07      08  09  0a  0b  0c  0d  0e  0f

00000000 57 49 4e 39 38 20 20 20 - 20 20 20 10 00 00 00 00
00000010 00 00 1b 2f 00 00 e8 60 - 1b 2f 03 00 00 00 00 00
…… -
000001e0 53 59 53 54 45 4d 20 20 - 31 53 54 06 00 00 00 00
000001f0 00 00 26 2f 01 00 a7 61 - 1b 2f 9c 6d 20 60 08 00

    000 ~ 01f (32字节)    根目录区中的WIN98子目录(参数解释见下面)
    1e0 ~ 1ff (32字节)根目录区中的SYSTEM.1st文件(参数解释同上)

现解释各个参数的含义:
57 49 4e 39 38 20 20 20 文件名(WIN98)
20 20 20 文件扩展名(无)
10 文件属性(最高两位保留未用,0至5位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位)
00 仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校验和等
00 00 00 24位二进制的文件建立时间,其中的高5位为小时,次6位为分钟
00 00 16位二进制的文件建立日期,其中的高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期
1b 2f 16位二进制的文件最新访问日期,定义同上
00 00 起始簇号的高16位
e8 60 16位二进制的文件最新修改时间,其中的高5位为小时,次6位为分钟,后5位的二倍为秒数
1b 2f 16位二进制的文件建立日期,其中的高7位为相对于1980年的年份值,次4位为月份,后5位为月内日期
03 00 起始簇号的低16位
00 00 00 00 32位的文件字节长度(对于子目录,此项为0)

图示硬盘分区结构:

MBR(硬盘主引导分区)
+
FAT(文件分配表区)…………
BOOT(1个扇区)+文件系统信息区(1个扇区)+未知(固定数据,1个扇区)+3个保留扇区
BOOT(1个扇区)+文件系统信息区(1个扇区)+未知(固定数据,1个扇区)+3个保留扇区
FAT表
FAT表
+
DATA(数据区)

以上数据都是超的硬盘中数据,针对不同的硬盘参数和使用,我们应该修改相应的数据。

详解FAT32⽂件系统
硬盘是⽤来存储数据的,为了使⽤和管理⽅便,这些数据以⽂件的形式存储在硬盘上。任何操作系统都有⾃⼰的⽂件管理系统,不同的⽂件系统⼜有各⾃不同的逻辑组织⽅式。例如:常见的⽂件系统
有FAT,NTFS,EXT,UFS,HFS+等等。下⾯就来学习⼀下基于Windows的FAT32⽂件系统。
FAT32⽂件系统由DBR及其保留扇区,FAT1,FAT2和DATA四个部分组成,其机构如下图:
这些结构是在分区被格式化时创建出来的,含义解释如下:
DBR及其保留扇区:DBR的含义是DOS引导记录,也称为操作系统引导记录,在DBR之后往往会有⼀些保留扇区。
FAT1:FAT的含义是⽂件分配表,FAT32⼀般有两份FAT,FAT1是第⼀份,也是主FAT。
FAT2:FAT2是FAT32的第⼆份⽂件分配表,也是FAT1的备份。
DATA:DATA也就是数据区,是FAT32⽂件系统的主要区域,其中包含⽬录区域。
⼀、分析FAT32⽂件系统的DBR
FAT32⽂件系统的DBR有5部分组成,分别为跳转指令,OEM代号,BPB,引导程序和结束标志。如下图是我U 盘上⼀个完整的FAT32⽂件系统的DBR。
E8 58 90 :(跳转指令) 本⾝占2字节它将程序执⾏流程跳转到引导程序处。
“EB 58 90″清楚地指明了OS引导代码的偏移位置。jump 58H加上跳转指令所需的位移量,即开始于0x5A。
4D 53 57 49 4E 34 2E 31 :(OEM代号) 这部分占8字节,其内容由创建该⽂件系统的OEM⼚商具体安排。
跳转指令之后是8字节长的OEM ID,它是⼀个字符串, OEM ID标识了格式化该分区的操作系统的名称和版本号。为了保留与MS-DOS的兼容性,通常Windows 2000格式化该盘是在FAT16和FAT32磁盘上的该字段中记录
了“MSDOS 5.0”,在NTFS磁盘上(关于ntfs,另述),Windows 2000记录的是“NTFS”。通常在被Windows 95格式化的磁盘上OEM ID字段出现“MSWIN4.0”,在被Windows 95 OSR2和Windows 98格式化的磁盘上OEM ID字段出
现“MSWIN4.1”。
BPB:FAT32的BPB从DBR的第12个字节开始,占⽤79字节,记录了有关该⽂件系统的重要信息,各参数解释如下表:
前⾯53个字节是BPB,后⾯26个字节是扩展BPB。
对照上⾯分析:
02 00:每扇区512字节
40:每簇64个扇区
26 B0:保留9904个扇区
02:FAT数
00 00:根⽬录项数为0
00 00:⼩扇区数为0
F8:硬盘
00 00:每FAT扇区数为0
00 3F:每磁道63个扇区
00 80:128磁头
00 00 1F 80:隐藏扇区8064
03 A8 E4 00:总共61400064个扇区
00 00 1D 48:每个FAT有7496个扇区
00:扩展标志
00 00:⽂件系统版本
00 00 00 02:根⽬录簇号2
00 01:⽂件系统信息扇区号
00 08:备份引导扇区
后12个字节为0:保留
00:软盘驱动器
01:未知
29:扩展引导标签
78 7B 52 18:分区引导序号
4B 49 4E 47 53 54 4F 4E 20 20 20:卷标KINGSTON
46 41 54 33 32 20 20 20:系统ID FAT32
FAT32⽂件系统在DBR的保留扇区中安排了⼀个⽂件系统信息扇区,⽤以记录数据区中空闲簇的数量及下⼀个空闲簇的簇号,该扇区⼀般在分区的1号扇区,也就是紧跟着DBR后的⼀个扇区,其内容如下:
52 52 61 41:扩展引导标签
接下来的480个字节:未⽤
72 72 41 61:⽂件系统信息签名
00 02 07 9E:空闲簇数
00 00 01 8F:下⼀个空闲簇的簇号
接下来的14个字节:未⽤
55 AA:结束标志
引导程序代码:FAT32的DBR引导程序占⽤420字节,对于没有安装操作系统的分区来说这段程序是没有⽤处的。
结束标志:DBR的结束标志与MBR,EBR的结束标志相同,为“55 AA”。
⼆、分析FAT32⽂件系统的FAT表
从FAT32的组织形式来看FAT1在保留扇区(包括引导扇区)的后⾯,然后就是FAT2.
所以我们在加上保留扇区的数量来到FAT1的第⼀个扇区:
FAT⽂件系统之所以有12,16,32不同的版本之分,其根本在于FAT表⽤来记录任意⼀簇链接的⼆进制位数。以FAT16为例,每⼀簇在FAT表中占据2字节(⼆进制16位)。所以,FAT16最⼤可以表⽰的簇号为0xFFFF(⼗进制的65535),以32K(最多只⽀持64个扇区)为簇的⼤⼩的话,FAT16可以管理的最⼤磁盘空间为:
32KB×65535=2048MB,这就是为什么FAT16不⽀持超过2GB分区的原因(DOS下)。
FAT表结构及作⽤
1、FAT32⽂件⼀般有两份FAT,他们由格式化程序在对分区进⾏格式化时创建,FAT1是主,FAT2是备份。
2、FAT1跟在DBR之后,其具体地址由DBR的BPB参数中指定,FAT2跟在FAT1的后⾯。
3、FAT表由FAT表项构成,我们把FAT表项简称FAT项,每个FAT项占⽤4字节。
4、每个FAT项都有⼀个固定的编号,这个编号从0开始。
5、FAT表项的前两个FAT项为⽂件系统保留使⽤,0号FAT为介质类型,1号FAT为⽂件系统错误标志。
6、分区的数据区中每个簇都会映射到FAT表中的唯⼀⼀个FAT项,因为0号FAT和1号FAT被系统占⽤,⽤户的数
据从2号FAT开始记录。
7、如果某个⽂件占⽤很多个簇,则第⼀个FAT项记录下⼀个FAT项的编号(既簇号),如果这个⽂件结束了,则⽤“0F FF FF FF”表⽰。
8、分区格式化后,⽤户⽂件以簇为单位存放在数据区中,⼀个⽂件⾄少占⽤⼀个簇。
9、FAT的主要作⽤是标明分区存储的介质以及簇的使⽤情况。
定位FAT绝对位置的⽅法如下:
1、⾸先从MBR的分区表中得知分区的起始扇区,偏移到此扇区。
2、从DBR的BPB中得知DBR的保留扇区数,FAT表的个数,FAT表的⼤⼩。
3、因此FAT1=分区起始扇区+DBR保留扇区,FAT2=分区起始扇区+DBR保留扇区+FAT1。
下图为FAT1的第⼀个扇区:
上⾯是从第0项开始的,第0项和第1项暂时就不⽤看了,从第2项开始,为0F FF FF FF,表⽰这是⼀个⼩⽂件,只占⽤⼀个簇就结束了,然后第3、4项也是的。
第5簇中存放的数据是6,这⼜是⼀个⽂件或⽂件夹的⾸簇。其内容为第6簇,就是说接下来的簇位于第6簇——〉FAT表指引我们到达FAT表的第6簇指向,上⾯写的数据是7,就是说接下来的簇位于第7簇——〉FAT表指引我们到达FAT表的第7簇指向……直到根据FAT链读取到扇区相对偏移0×20~0×24,也就是第8簇,上⾯写的数据是9,也就是指向第9簇——〉第9簇的内容为”0F FF FF FF”,意即此⽂件已⾄尾簇。
下⾯的同样的分析⽅法,我就不⼀⼀分析了。
三、分析FAT32⽂件系统的数据区
数据区的位置在FAT2的后⾯,具体定位⽅式如下;
1、通过MBR中的分区表信息得知分区的起始位置。
2、通过分区中DBR得知DBR的保留扇区数以及FAT表的⼤⼩,FAT表的个数。
3、通过上⾯的信息就可以找到数据区的起始位置,数据区 = 隐藏扇区数+DBR保留扇区+(每个FAT表扇区数
2)。
数据区的类容主要由三部分组成:根⽬录,⼦⽬录和⽂件内容。在数据区中是以“簇”为单位进⾏存储的,2号簇被分配给根⽬录使⽤。
根据簇号得到在FAT中的扇区号和偏移:
扇区号 = 簇号
4/每个扇区的字节数 + 隐藏扇区数 + 保留扇区数
扇区偏移 = 簇号4%每个扇区的字节数
根据簇号得到起始扇区号:
簇号起始扇区 = (簇号-2)
每个簇的扇区数 + 隐藏扇区数 + 保留扇区数 + FAT数每个FAT占扇区数
下图为根⽬录的第⼀个扇区:
FAT32⽂件系统中,分区根⽬录下的⽂件和⽬录都放在根⽬录区中,⼦⽬录中的⽂件和⽬录都放在⼦⽬录区中,并且每32个字节为⼀个⽬录项(FDT),每个⽬录项纪录着⼀个⽬录或⽂件(也可能是多个⽬录项记录⼀个⽂件或⽬录),如上图所⽰就是⼀个⽬录项。
在FAT32⽂件系统中,⽬录项可以分为四类:卷标⽬录项、“.”和“..”⽬录项、短⽂件名⽬录项、长⽂件名⽬录项。
卷标⽬录项:卷标就是分区的名字,可以在格式化分区时创建,也可以随意修改,长度为11字节。
“.”和“..”⽬录项:“.”表⽰当前⽬录,“..”表⽰上⼀层⽬录。这两个⽬录项多存在⼦⽬录中。
短⽂件名⽬录项:所谓短⽂件名既⽂件名的“8.3”格式,此格式⽀持主⽂件名不能超过8字节,扩展名不能超过3字节。短⽂件名⽬录始终存放在⼀个⽬录项中。
FDT第1字节⼜表明了该⽂件的状态,它有如下四种取值⽅式:
a. 00H–⽬录项的空⽬录。
b. E5H–表⽰该⽬录项曾经使⽤过,但⽂件已被删除。
c. 2EH–表⽰⼦⽬录下的两个特殊⽂件 “. “或 “.. “⽬录项
d. 其它任何字符–表⽰⼀个⽂件名(或⽬录名)的第⼀个字符的ASCII码值.
FAT第0xB个字节可以判别是长⽂件⽬录项还是短⽂件⽬录项。
FAT32短⽂件⽬录项32个字节的表⽰定义如下:
正如上⾯的第⼀个FDT就是⼀个短⽂件⽬录项:
⽂件名为GAMES
关于时间的表达⽅式:10111(23) 111000(56) 00001(1
2)时间值:23时56分02秒。
关于⽇期的表达⽅式:0011101(29+1980) 1010(10) 10011(19)时间值:2009年10⽉19⽇。
长⽂件名⽬录项:由于短⽂件名“8.3”的格式远远不能满⾜现实中的需求,所以就出现了长⽂件名。
FAT32长⽂件⽬录项32个字节的表⽰定义如下:
根据表中的长⽂件名组合⽅法我们可以得到上⾯根⽬录的第⼀个扇区中第7个FDT的长⽂件名为:urDrive
如果是⽬录的话可以转到起始簇号在FAT1中的位置,然后转到相应的扇区分析FDT来枚举⽂件信息。
详解NTFS⽂件系统
上篇在详解FAT32⽂件系统中介绍了FAT32⽂件系统存储数据的原理,这篇就来介绍下NTFS⽂件系统。NTFS、⽤过Windows系统的⼈都知道,它是⼀个很强⼤的⽂件系统,⽀持的功能很多,存储的原理也很复杂。⽬前绝⼤多数Windows⽤户都是使⽤NTFS⽂件系统,它主要以安全性和稳定性⽽闻名,下⾯是它的⼀些主要特点。
安全性⾼:NTFS⽀持基于⽂件或⽬录的ACL,并且⽀持加密⽂件系统(EFS)。
可恢复性:NTFS⽀持基于原⼦事务概念的⽂件恢复,⽐较符合服务器⽂件系统的要求。
⽂件压缩:NTFS⽀持基于⽂件或⽬录的⽂件压缩,可以很⽅便的节省磁盘空间。
磁盘配额:NTFS⽀持磁盘配额,可针对系统中每个⽤户分配磁盘资源。
⼀、分析NTFS⽂件系统的结构
当⽤户将硬盘的⼀个分区格式化为NTFS分区时,就建⽴了⼀个NTFS⽂件系统。NTFS⽂件系统同FAT32⽂件系统⼀样,也是⽤“簇”为存储单位,⼀个⽂件总是占⽤⼀个或多个簇。
NTFS⽂件系统使⽤逻辑簇号(LCN)和虚拟簇号(VCN)对分区进⾏管理。
逻辑簇号:既对分区内的第⼀个簇到最后⼀个簇进⾏编号,NTFS使⽤逻辑簇号对簇进⾏定位。
虚拟簇号:既将⽂件所占⽤的簇从开头到尾进⾏编号的,虚拟簇号不要求在物理上是连续的。
NTFS⽂件系统⼀共由16个“元⽂件”构成,它们是在分区格式化时写⼊到硬盘的隐藏⽂件(以”$”开头),也是NTFS⽂件系统的系统信息。
NTFS的16个元⽂件介绍:
⾸先找到该分区的起始扇区,具体可以参考后⾯ MBR分区结构、DPT分区表、EBR扩展引导这篇⽂章。
⼆、分析$Boot⽂件
$Boot元⽂件由分区的第⼀个扇区(既DBR)和后⾯的15个扇区(既NTLDR区域)组成,其中DBR由“跳转指令”、“OEM代号”、“BPB”、“引导程序”和“结束标志”组成,这⾥和FAT32⽂件系统的DBR⼀样。下图是⼀个NTFS⽂件系统完整的DBR。
下⾯我们分析⼀下DBR中的各参数
EB 58 90:(跳转指令)本⾝占2字节它将程序执⾏流程跳转到引导程序处。
“EB 58 90″清楚地指明了OS引导代码的偏移位置。jump 52H加上跳转指令所需的位移量,即开始于0×55。
4E 54 46 53 20 20 20 20:(OEM代号)这部分占8字节,其内容由创建该⽂件系统的OEM⼚商具体安排。为“NTFS”。
BPB:NTFS⽂件系统的BPB从DBR的第12个字节开始,占⽤73字节,记录了有关该⽂件系统的重要信息,下表中的内容包含了“跳转指令”、“OEM代号”以及“BPB”的参数。
对照上⾯的BPB分析如下:
02 00:每个扇区512个字节
08:每个簇8个扇区
00 00:保留扇区为0
00 00 00:为0
00:不使⽤
F8:为硬盘
00 00:为0
00 3F:每磁道63个扇区
00 FF:每柱⾯255个磁头
00 00 00 3F:隐藏扇区数(MBR到DBR)
00 00 00 00:不使⽤
80 00 80 00:不使⽤
00 00 00 00 0C 80 33 FF:扇区总数209728511
00 00 00 00 00 00 00 03:$MFT的开始簇号
00 00 00 00 00 85 57 80:$MFTmirr的开始簇号
00 00 00 F6:每个MFT记录的簇数
00 00 00 01:每索引的簇数
B8 11 2A 0C B8 11 2A 0C:分区的逻辑序列号
引导程序:DBR的引导程序占⽤426字节,其负责完成将系统⽂件NTLDR装⼊,对于没有安装系统的分区是⽆效的。
结束标志:DBR的结束标志与MBR,EBR的结束标志相同,为“55 AA”。
三、分析$MFT元⽂件
在NTFS⽂件系统中,磁盘上的所有数据都是以⽂件的形式存储,其中包括元⽂件。每个⽂件都有⼀个或多个⽂件记录,每个⽂件记录占⽤两个扇区,⽽$MFT元⽂件就是专门记录每个⽂件的⽂件记录。由于NTFS⽂件系统是通过$MFT来确定⽂件在磁盘上的位置以及⽂件的属性,所以$MFT是⾮常重要的,$MFT的起始位置在DBR中有描述。$MFT的⽂件记录在物理上是连续的,并且从0开始编号。$MFT的前16个⽂件记录总是元⽂件的,并且顺序是固定不变的。
四、分析⽂件记录
1、⽂件记录的结构
⽂件记录由两部分构成,⼀部分是⽂件记录头,另⼀部分是属性列表,最后结尾是四个“FF”。如下是⼀个完整的⽂件记录:
在同⼀系统中,⽂件记录头的长度和具体偏移位置的数据含义是不变的,⽽属性列表是可变的,其不同的属性有着不同的含义。后⽂将对属性进⾏具体分析,先来看看⽂件记录头的信息。
在NTFS⽂件系统中所有与⽂件相关的数据结构均被认为是属性,包括⽂件的内容。⽂件记录是⼀个与⽂件相对应的⽂件属性数据库,它记录了⽂件的所有属性。每个⽂件记录中都有多个属性,他们相对独⽴,有各⾃的类型和名称。每个属性都由两部分组成,既属性头和属性体。属性头的前四个字节为属性的类型。如下是以10H属性为例的属性结构。
另外属性还有常驻与⾮常驻之分。当⼀个⽂件很⼩时,其所有属性体都可以存放在⽂件记录中,该属性就称为常驻属性。如果某个⽂件很⼤,1KB的⽂件记录⽆法记录所有属性时,则⽂件系统会在$MFT元⽂件之外的区域(也称数据流)存放该⽂件的其他⽂件记录属性,这些存放在⾮$MFT元⽂件内的记录就称为⾮常驻属性。
分析属性的属性头
每个属性都有⼀个属性头,这个属性头包含了⼀些该属性的重要信息,如属性类型,属性⼤⼩,名字(并⾮都有)及是否为常驻属性等。
常驻属性的属性头分析表:
如下是⾮常驻属性的属性头分析表:
前⾯说过了,属性的种类有很多,因此各属性体的含义也不同。下表是NTFS⽂件系统中的所有属性体的简介。
接下来来看⼏个重要的属性:
分析10H属性:
10H类型属性它包含⽂件的⼀些基本信息,如⽂件的传统属性,⽂件的创建时间和最后修改时间和⽇期,⽂件的硬链接数等等。如下:是⼀个10H类型的属性。
其中偏移0×20处的⽂件属性解释如下:
分析20H属性
20H类型属性既属性列表,当⼀个⽂件需要好⼏个⽂件记录时,才会⽤到20H属性。20H属性记录了⼀个⽂件的下⼀个⽂件记录的位置。如下:是20H属性的解释。
分析30H属性
30H类型属,该属性⽤于存储⽂件名,它总是常驻属性。最少68字节,最⼤578字节,可容纳最⼤Unicode字符的⽂件名长度。
分析80H属性
80H属性是⽂件数据属性,该属性容纳着⽂件的内容,⽂件的⼤⼩⼀般指的就是未命名数据流的⼤⼩。该属性没有最⼤最⼩限制,最⼩情况是该属性为常驻属性。常驻属性就不做多的解释了,上⾯我标记的是⼀个⾮常驻的80H属性。
其中,Run List是最难理解,也是最重要的。当属性不能存放完数据,系统就会在NTFS数据区域开辟⼀个空间存放,这个区域是以簇为单位的。Run List就是记录这个数据区域的起始簇号和⼤⼩,⼀个Run List例⼦上所⽰。这个⽰例中,Run List的值为“12 41 47 03”,因为后⾯是00H,所以知道已经是结尾。如何解析这个Run List呢?第⼀个字节是压缩字节,⾼位和低位相加,1+2=3,表⽰这个Data Run信息占⽤三个字节,其中⾼位表⽰起始簇号占⽤多少个字节,低位表⽰⼤⼩占⽤的字节数。在这⾥,起始簇号占⽤1个字节,值为03,⼤⼩占⽤2个字节,值为47 41。解析后,得到这个数据流起始簇号为3,⼤⼩为18241簇。
虽然数据不⼀样,但是表达的意思是⼀样的。
分析90H属性
90H属性是索引根属性,该属性是实现NTFS的B+树索引的根节点,它总是常驻属性。该属性的结构如下图:索引根的结构如表:
索引头的结构如表:
索引项结构如表:
分析A0H属性
A0属性是索引分配属性,也是⼀个索引的基本结构,存储着组成索引的B+树⽬录索引⼦节点的定位信息。它总是常驻属性。如下:是⼀个A0H属性的实例。
根据上图A0H属性的“Run List”可以找到索引区域,偏移到索引区域所在的簇,如下图:
起始簇:18265
簇⼤⼩:3
起始扇区号 = 该分区的其实扇区 + 簇号 每个簇的扇区数也就是
64 + 18265
8 = 146124
对了,上⾯的偏移0×28还要加上0×18 = 0×40.
标准索引头的解释如下:
索引项的解释如下:
到此⼀些常⽤属性基本介绍的差不多了。
下⾯来说下遍历⼀个分区下⾯⽂件列表的思路:
1、定位DBR,通过DBR可以得知“$MFT”的起始簇号及簇的⼤⼩。
2、定位“$MFT”,找到“$MFT”后,在其中寻找根⽬录的⽂件记录,⼀般在5号⽂件记录。
3、在90H属性中得到B+树索引的根节点⽂件信息,重点在A0属性上。通过属性中的“Run List”定位到其数据流。
4、从“Run List”定位到起始簇后,再分析索引项可以得到⽂件名等信息。
5、从索引项中可以获取“$MFT”的参考号,然后进⼊到“$MFT”找到对应的⽂件记录。
6、然后再根据80H属性中的数据流就可以找到⽂件真正的数据了。
MBR分区结构、DPT分区表、EBR扩展引导
主引导记录(Master Boot Record,缩写:MBR),⼜叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的⾸个扇区,它在硬盘上的三维地址为(0柱⾯,0磁头,1扇区)。在深⼊讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使⽤“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。如下:
对应到我电脑第⼀个扇区:
启动代码
主引导记录最开头是第⼀阶段引导代码。其中的硬盘引导程序的主要作⽤是检查分区表是否正确并且在系统硬件完成⾃检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。它不依赖任何操作系统,⽽且启动代码也是可以改变的,从⽽能够实现多系统引导。
硬盘分区表
硬盘分区表占据主引导扇区的64个字节(偏移01BEH–偏移01FDH),可以对四个分区的信息进⾏描述,其中每个分区的信息占据16个字节。具体每个字节的定义可以参见硬盘分区结构信息。
从主引导记录的结构可以知道,它仅仅包含⼀个64个字节的硬盘分区表。由于每个分区信息需要16个字节,所以对于采⽤MBR型分区结构的硬盘,最多只能识别4个主要分区(Primary partition)。所以对于⼀个采⽤此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这⾥就需要引出扩展分区了。扩展分区也是主要分区的⼀种,但它与主分区的不同在于理论上可以划分为⽆数个逻辑分区。
扩展分区中逻辑驱动器的引导记录是链式的。每⼀个逻辑分区都有⼀个和MBR结构类似的扩展引导记录(EBR),其分区表的第⼀项指向该逻辑分区本⾝的引导扇区,第⼆项指向下⼀个逻辑驱动器的EBR,分区表第三、第四项没有⽤到。
Windows系统默认情况下,⼀般都是只划分⼀个主分区给系统,剩余的部分全部划⼊扩展分区。这⾥有下⾯⼏点需要注意:
在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有⼀个,然后可以再细分为多个逻辑分区。
在Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表⽰硬盘编号可能是a、b、c等等)。
在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。
在MBR分区表中,⼀个分区最⼤的容量为2T,且每个分区的起始柱⾯必须在这个disk的前2T内。你有⼀个3T 的硬盘,根据要求你⾄少要把它划分为2个分区,且最后⼀个分区的起始扇区要位于硬盘的前2T空间内。如果硬盘太⼤则必须改⽤GPT。
那么现在来对主引导扇区中的DPT来进⾏分析:
80 01 01 00 07 FE FF FF 3F 00 00 00 00 34 80 0C
80:表⽰该分区为活动分区
01 01 00:开始磁头/开始扇区和开始柱⾯
07 :⽂件系统标志位07表⽰NTFS⽂件系统
FE FF FF :结束磁头/结束扇区和结束柱⾯
00 00 00 3F :分区起始的相对扇区号
0C 80 34 00:分区总的扇区数
后⾯三个表项的分析⽅法同上。
每⼀分区的第1⾄第3字节是该分区起始地址。其中第1字节为起始磁头号(⾯号);第2字节的低6位为起始扇区号,⾼2位则为起始柱⾯号的⾼2 位;第3字节为起始柱⾯号的低8位。因此,分区的起始柱⾯号是⽤10位⼆进制数表⽰的,最⼤值为2^10 = 1024,因逻辑柱⾯号从0开始计,故柱⾯号的显⽰最⼤值为1023。同理,⽤6位⼆进
制数表⽰的扇区号不会超过2^6 – 1 = 63;⽤8位⼆进制数表⽰的磁头号不会超过2^8 – 1 = 255。每⼀分区的第5⾄第7字节表⽰分区的终⽌地址,各字节的释义与第1⾄第3字节相同。这⾥我们假设⼀种极端的情况:如果让第5⾄第7字节的所有⼆进制位都取1,就获得了柱⾯号、磁头号和扇区号所能表⽰的最⼤值,从⽽得到最⼤绝对扇区号为:
  1024 × 256 × 63 = 16,515,072
  这个扇区之前的所有物理扇区所包含的字节数为:
  16,515,072 × 512Bytes ≈ 8.46GB。
由此可知硬盘的容量设计为什么会有8.4GB这⼀档,分区表每⼀分区的第1⾄第3字节以及第5⾄第7字节的数据结构已经不能满⾜⼤于 8.46GB的⼤容量硬盘的需要。考虑到向下兼容的需要,业界并未对从DOS时代就如此定义的硬盘分区表提出更改意见,否则改动所牵涉的⾯太⼴,会造成硬件和软件发展上的⼀个断层,⼏乎⽆法被业界和⽤户所接受。硬盘⼚商解决这⼀问题的⽅法是定义了新的INT 13服务扩展标准。新的INT 13服务扩展标准不再
使⽤操作系统的寄存器传递硬盘的寻址参数,⽽使⽤存储在操作系统内存⾥的地址包。地址包⾥保存的是64位LBA地址,如果硬盘⽀持 LBA寻址,就把低28位直接传递给ATA接⼝,如果不⽀持,操作系统就先把LBA地址转换为CHS地址,再传递给ATA接⼝。通过这种⽅式,能实现在 ATA总线基础上CHS寻址的最⼤容量是136.9 GB,⽽LBA寻址的最⼤容量是137.4GB。新的硬盘传输规范ATA 133规范⼜把28位可⽤的寄存器空间提⾼到48位,从⽽⽀持更⼤的硬盘。
  分区表每⼀分区的第8⾄第11字节表⽰该分区的起始相对扇区数(即该扇区之前的绝对扇区个数),⾼位在右,低位在左;第12⾄第15字节表⽰该分区实际占⽤的扇区数,也是⾼位在右,低位在左;分区表这类数据结构的表达⽅式与机器中数据的实际存储⽅式在顺序上是⼀致的,即低位在前,⾼位在后。因此,在从16进制向⼗进制作数值转换时,需将字段中的16进制数以字节为单位翻转调位,⽤4个字节可以表⽰最⼤2^32个扇区,即
2TB=2048GB。
系统在分区时,各分区都不允许跨柱⾯,即均以柱⾯为单位,这就是通常所说的分区粒度。在未超过8.4GB的分区上,C/H/S的表⽰⽅法和扇区数的表⽰⽅法所表⽰的分区⼤⼩是⼀致的。超过8.4GB的/H/S/C⼀般填充为
FEH/FFH/FFH,即C/H/S所能表⽰的最⼤值;有时候也会⽤柱⾯对 1024的模来填充。不过这⼏个字节是什么其实都⽆关紧要了。
从上⾯可以看到我电脑的DPT只有⼀个主分区和⼀个扩展分区。
主分区从63扇区开始,⼤⼩为209728512扇区。约为100GB也就是我的C盘⼤⼩。
扩展分区从209728575扇区开始,⼤⼩为415408770扇区。约为198GB也就是我后⾯两个盘的⼤⼩。
扩展分区中的每个逻辑驱动器都存在⼀个类似于MBR的扩展引导记录(Extended Boot Record,EBR)。
扩展引导记录包括⼀个扩展分区表和扇区结束标志55AA。⼀个逻辑驱动器中的引导扇区⼀般位于相对扇区32或63。如果磁盘上没有扩展分区,那么就不会有扩展引导记录和逻辑驱动器。第⼀个逻辑驱动器的扩展分区表中的第⼀项指向它⾃⾝的引导扇区;第⼆项指向下⼀个逻辑驱动器的EBR,如果不存在进⼀步的逻辑驱动器,第⼆项就不会使⽤,⽽被记录成⼀系列零。如果有附加的逻辑驱动器,那么第⼆个逻辑驱动器的扩展分区表的第⼀项会指向它本⾝的引导扇区,第⼆个逻辑驱动器的扩展分区表的第⼆项指向下⼀个逻辑驱动器的EBR。扩展分区表的第三项和第四项永远都不会被使⽤。
扩展分区表项中的相对扇区数是从扩展分区开始的扇区到该逻辑驱动器中第⼀个扇区的扇区数;占⽤的扇区数是指组成该逻辑驱动器的扇区数⽬。
有时候在磁盘的末尾会有剩余空间,由于分区是以1柱⾯的容量为分区粒度的,那么如果磁盘总空间不是整数个柱⾯的话,不够⼀个柱⾯的剩下的空间就是剩余空间了,这部分空间并不参与分区,所以⼀般⽆法利⽤。
我们来到扩展分区的EBR。
扩展分区第⼀项:起始相对63扇区,⼤⼩为207640062扇区。约为99G我D盘的⼤⼩。
扩展分区第⼆项(指向下⼀个逻辑驱动器的EBR)起始相对207640125扇区,⼤⼩为207768645扇区。为我最后⼀个盘的⼤⼩。
再来到这个指向的这个逻辑驱动器的EBR。
只有⼀项:起始相对63扇区,⼤⼩为207768582扇区。约为99G我E盘的⼤⼩。
当然末尾还有⼀些剩余空间。625142448-625137345 2M多的剩余空间。
WinHex和我们分析出来的是⼀样的。
所以也可以⾃⼰写个程序来分析。
最后附上⼏个常见的分区类型。
GDT(全局描述符表)和LDT(局部描述符表)
每个程序都有⾃⼰的LDT,但是同⼀台计算机上的所有程序共享⼀个GDT。LDT描述局部于每个程序的段,包括其代码、数据、堆栈等。GDT描述系统段,包括操作系统本⾝。
①全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有⼀张(⼀个处理器对应⼀个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的⼊⼝,也就是基地址放在哪⾥,Intel的设计者门提供了⼀个寄存器GDTR⽤来存放GDT的⼊⼝地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的⼊⼝地址装⼊此积存器,从此以后,CPU就根据此寄存器中的内容作为GDT的⼊⼝来访问GDT了。GDTR中存放的是GDT在内存中的基地址和其表长界限。
②段选择⼦(Selector)由GDTR访问全局描述符表是通过“段选择⼦”(实模式下的段寄存器)来完成的。为了访问⼀个段,⼀个Pentium程序必须把这个段的选择⼦装⼊机器的6个段寄存器的某⼀个中。在运⾏过程中,CS寄存器保存代码段的选择⼦,DS寄存器保存数据段的选择⼦。每个选择⼦是⼀个16位数。
选择⼦中的⼀位指出这个段是局部的还是全局的(它是在LDT中还是在GDT中),其他的13位索引是LDT或GDT 的表项编号,表⽰所需要的段的描述符在描述符表的位置,由这个位置再根据在GDTR中存储的描述符表基址就可以找到相应的描述符,然后⽤描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址。因此,这些表的长度被限制在最多容纳8K个段描述符。
段选择⼦中的TI值只有⼀位0或1,0代表选择⼦是在GDT选择,1代表选择⼦是在LDT选择。请求特权级(RPL)则代表选择⼦的特权级,共有4个特权级(0级、1级、2级、3级)。任务中的每⼀个段都有⼀个特定的级别。每当⼀个程序试图访问某⼀个段时,就将该程序所拥有的特权级与要访问的特权级进⾏⽐较,以决定能否访问该段。系统约定,CPU只能访问同⼀特权级或级别较低特权级的段。
例如给出逻辑地址:21h:12345678h转换为线性地址
a. 选择⼦SEL=21h=0000000000100 0 01b 他代表的意思是:选择⼦的index=4即100b选择GDT中的第4个描述符;TI=0代表选择⼦是在GDT选择;左后的01b代表特权级RPL=1
b. OFFSET=12345678h若此时GDT第四个描述符中描述的段基址(Base)为11111111h,则线性地址
=11111111h+12345678h=23456789h
③局部描述符表LDT(Local Descriptor Table)局部描述符表可以有若⼲张,每个任务可以有⼀张。我们可以这样理解GDT和LDT:GDT为⼀级描述符表,LDT为⼆级描述符表。如图
LDT和GDT从本质上说是相同的,只是LDT嵌套在GDT之中。LDTR记录局部描述符表的起始位置,与GDTR不同LDTR的内容是⼀个段选择⼦。由于LDT本⾝同样是⼀段内存,也是⼀个段,所以它也有个描述符描述它,这个描述符就存储在GDT中,对应这个表述符也会有⼀个选择⼦,LDTR装载的就是这样⼀个选择⼦。LDTR可以在程序中随时改变,通过使⽤lldt指令。如上图,如果装载的是Selector 2则LDTR指向的是表LDT2。举个例⼦:如果我们想在表LDT2中选择第三个描述符所描述的段的地址12345678h。

  1. ⾸先需要装载LDTR使它指向LDT2 使⽤指令lldt将Select2装载到LDTR
  2. 通过逻辑地址(SEL:OFFSET)访问时SEL的index=3代表选择第三个描述符;TI=1代表选择⼦是在LDT选择,此时LDTR指向的是LDT2,所以是在LDT2中选择,此时的SEL值为1Ch(⼆进制为11 1 00b)。OFFSET=12345678h。逻辑地址为1C:12345678h
  3. 由SEL选择出描述符,由描述符中的基址(Base)加上OFFSET可得到线性地址,例如基址是11111111h,则线性地址=11111111h+12345678h=23456789h
  4. 此时若再想访问LDT1中的第三个描述符,只要使⽤lldt指令将选择⼦Selector 1装⼊再执⾏2、3两步就可以了(因为此时LDTR⼜指向了LDT1)
    由于每个进程都有⾃⼰的⼀套程序段、数据段、堆栈段,有了局部描述符表则可以将每个进程的程序段、数据段、堆栈段封装在⼀起,只要改变LDTR就可以实现对不同进程的段进⾏访问。
    段描述符:
    P,present位,1表⽰所描述的段存在(有效),为0表⽰所描述的段⽆效,使⽤该描述符会引起异常
    DPL,Descriptor privilege,描述符特权级别,说明所描述段的特权级别
    DT,描述符类型位,1说明当前描述符为存储段描述符,0为系统描述符或门描述符.
    TYPE:
    位0:A(accessed)位,表明描述符是否已被访问;把选择⼦装⼊段寄存器时,该位被标记为1
    位3:E(EXECUTABLE?)位,0说明所描述段为数据段;1为可执⾏段(代码段)
    当为数据段时,
    位1为W位,说明该数据段是否可写(0只读,1可写)
    位2为ED位,说明该段的扩展⽅向(0向⾼位扩展,1向低位扩展)
    当为可执⾏段是,
    位1为R位,说明该执⾏段是否可读(0只执⾏,1可读)
    位2为C位,0说明该段不是⼀致码段(普通代码段),1为⼀致码段
    G为粒度位,0说明LIMIT粒度为字节,1为4K字节.
    D位:
    1.在可执⾏段中,D为1,表⽰使⽤32位地址,32/8位操作数;为0表⽰使⽤16位地址,16/8位操作数
    2.在由SS寻址的段描述符(堆栈段?)中,D为1表⽰隐含操作(如PUSH/POP)使⽤ESP为堆栈指针,
    为0使⽤SP(隐含操作:未明确定义段属性类型USE16/USE32?66H,67H?)
    3.在向低扩展的存储段中,D为1,表⽰段的上限为4G;为0上限为64K
    存储段描述符的结构表⽰:
    分段管理可以把虚拟地址转换成线性地址,⽽分页管理可以进⼀步将线性地址转换成物理地址。当CR0中的PG 位置1时,启动分页管理功能,为0时,这禁⽌启动分页管理功能,并且把线性地址作物理地址使⽤。
    虚拟地址转为线性地址:
    线性地址= 段基指 + 偏移地址
    32位线性地址转为物理地址:
    32位分为:
    页⽬录索引:占最⾼10位,指⽰页⽬录表中第⼏个页表描述符
    页表索引:占12位到21位,也是10位。指⽰这页表中第⼏个页描述符
    页描述符:线性地址的低12位为页内偏移量。
标签: 暂无
最后更新:2024年7月8日

站长

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

站长

这个人很懒,什么都没留下

最新 热点 随机
最新 热点 随机
Linux systemctl 命令 linux的service IPTABLES一文通 网安路线图 DOS相关常用命令了一篇了解大全 MYSQL数据库学习记录
IPTABLES一文通linux的serviceLinux systemctl 命令搬运 linux最常用的20个命令搬运 浅谈社工搬书Linux操作系统应用与安全项目化实战教程
单臂路由与三层交换机之间通信 TCP-UDP协议区别 MBR分析 HTML、CSS、JavaScript、PHP、 MySQL 的学习顺序 树莓派pi zero 2w安装P4wnP1-aloa 关于ensp待实践

COPYRIGHT © 2023 茗宸bk. ALL RIGHTS RESERVED.

站长微信:printJ7

鲁ICP备2024114188号

鲁公网安备37130202372760号