一种AHCI模式下访问硬盘的方法与流程

文档序号:19879084发布日期:2020-02-08 06:46阅读:614来源:国知局
一种AHCI模式下访问硬盘的方法与流程

本发明属于数据恢复与取证领域,涉及一种访问硬盘的方法,尤其涉及一种ahci模式下访问硬盘的方法。



背景技术:

在数据恢复与取证领域中,随着硬盘容量的不断增加,加上硬盘性能也在不断提高,使得硬盘的用户群不断增加,硬盘的使用次数也急剧增加,硬盘的故障也随之提高。

一般的硬盘访问技术都是通过文件系统的方式,主要针对文件的读取、写入和删除。但是,硬盘中也存在其他的重要数据,包括mbr、dbr等。当这些重要数据被恶意的修改或者丢失后,电脑的磁盘管理器中将丢失所有的固件及管理数据,而用户的数据仍然真实存在,只是以文件系统的方式不能进行访问。这种情况下,难以实现对硬盘的读写、数据恢复与取证。现有技术正研究ahci模式下基于io寄存器数据交互而实现访问硬盘的方法,目前为止,尚无一种在ahci模式下基于io寄存器数据交互的硬盘访问方法。



技术实现要素:

针对现有技术的不足,本发明提供了一种在ahci模式下基于io寄存器的硬盘访问技术,通过这样的访问方式,就可以针对硬盘的重要数据进行保护,而且可以绕开文件系统直接对硬盘的数据进行访问。本发明申请包括以下步骤:

s100:判断硬盘的工作模式是否为ahci模式,如果是,执行步骤s200,否则,结束流程:

s200:获取pci配置空间,并获取各个基地址寄存器的值;

s300:获取ahci空间的入口地址;

s400:获取各个硬盘端口的内存空间的起始地址;

s500:寻址当前硬盘端口的内存空间,读取当前硬盘端口的内存空间的前八个字节的内容作为命令列表基地址,读取第0x39至0x3c字节的内容作为命令槽忙闲指示;

s600:获取并解析各个命令槽;

s700:获取并解析命令表基地址的内容,确定命令封装区、数据项的操作地址及所操作数据的字节长度;

s800:确定空闲命令槽:读取命令槽忙闲指示的各比特位,根据各比特位的值确定空闲的命令槽;

s900:选用空闲命令槽并重新设置命令槽忙闲指示,访问当前硬盘并验证访问成功。

优选地,所述寄存器的值及内存空间的值均以小端格式存储。

优选地,所述步骤s400中,每一硬盘端口的内存空间的字节长度为n,第一个硬盘端口的起始地址为所述入口地址+偏移量,之后的每一硬盘端口的起始地址为前一个硬盘端口的结束地址+1,各个硬盘端口的内存空间顺序排列,其中,硬盘端口数量不大于32,n为不小于0x40的正整数。

优选地,所述偏移量为0x100,所述硬盘端口数量为32,n为0x80。

优选地,所述步骤s600包括以下步骤:

s601:寻址当前命令列表基地址,以当前所寻址地址为起始地址,以0x20个字节为一组,依次表示第1至第32个命令槽;

s602:设置各个命令槽的第1至第2字节的内容作为硬盘的访问类型,设置命令槽的第3至第4字节的内容作为数据项个数,设置命令槽的第5至第8字节的内容作为读取/写入的字节数,设置命令槽的第9至第16字节的内容作为命令表基地址。

优选地,所述步骤s900包括以下步骤:

根据所选用的空闲命令槽,将当前硬盘端口的内存空间的第0x39至0x3c字节的内容中的命令槽忙闲指示的对应比特位置1,访问当前硬盘并验证根据所选用的空闲命令槽对当前硬盘的访问成功。

本发明具有以下有益效果是:解决了现有技术中尚无一种ahci模式下访问硬盘的方法的技术问题。

附图说明

图1为本发明所提供的方法的总流程图;

图2为本发明的一个实施例中pci配置空间的示例图;

图3为本发明的一个实施例中硬盘端口的内存空间的数据结构示意图;

图4为本发明的一个实施例中命令列表的数据结构示意图;

图5为本发明的一个实施例中命令表的数据结构示意图。

具体实施方式

s100:判断硬盘的工作模式是否为ahci模式,如果是,执行步骤s200,否则,结束流程。

在本发明的一个实施例中,通过检查系统的bios设置,可以看到,系统的硬盘工作模式有ide以及ahci两种方式,如果是ahci模式,执行步骤s200,否则,结束流程。

s200:获取pci配置空间,并获取各个基地址寄存器的值;具体地,pci及pcie配置空间的读取有两种方式:

1.通过操作io端口0xcf8/cfc

_outpd(0xcf8,(1<<31)|(bus<<16)|(dev<<11)|(fun<<8)|reg),然后就可以通过读取0xcfc-0xcff来获取bit0~bit32的值

_inp(0xcfc)

_inp(0xcfd)

_inp(0xcfe)

_inp(0xcff)

_inpw(0xcfc)

_inpw(0xcfe)

_inpd(0xcfc)

2.通过内存地址直接读取

intelchipset的pciexbaseaddress一般从bus0dev0fun0reg60~64读取

address=pciexbaseaddress|(bus<<20)|(dev<<15)|(fun<<12)|reg;

图2示出了本发明的一个实施例中pci配置空间的示例图。如图2所示,bar1至bar6为6个基地址寄存器及其值。值得注意的是,本发明中的寄存器的值及内存空间的值均以小端格式存储。

s300:获取ahci空间的入口地址;本发明的一个实施例中,如图2所示的bar6的值0xf712b000,即为ahci空间的入口地址。

s400:获取各个硬盘端口的内存空间的起始地址;每一硬盘端口的内存空间的字节长度为n,第一个硬盘端口的起始地址为入口地址+偏移量,之后的每一硬盘端口的起始地址为前一个硬盘端口的结束地址+1,各个硬盘端口的内存空间顺序排列,其中,硬盘端口数量不大于32,n为不小于0x40的正整数。本发明的一个实施例中,偏移量为0x100,硬盘端口数量为32,n为0x80。

具体地,取出bar6的值0xf712b000,以0xf712b000+0x100为第一个硬盘端口的内存空间地址,即,以0xf712b100为首地址,每0x80字节的大小为一个硬盘端口空间,即第二个端口的内存空间为0xf712b180-0xf712b1ff,依次类推,这样,依次有端口1至端口32共计32个端口。

s500:寻址当前硬盘端口的内存空间,读取当前硬盘端口的内存空间的前八个字节的内容作为命令列表基地址,读取第0x39至0x3c字节的内容作为命令槽忙闲指示;

图3示出了本发明的一个实施例中硬盘端口的内存空间的数据结构示意图;

每个硬盘端口的内存空间控制其对应端口的硬盘。如图3所示,以第一个端口的内存空间0xf712b100至0xf712b17f为例,字节长度为0x80的这段内存中,前八个字节(即0xf712b100至0xf712b107)的内容0xc9c62000表示命令列表基地址,第0x39至0x3c的内容0x00000000表示命令槽忙闲指示,其中的32位的比特位中,0表示闲,1表示忙,即,该命令槽被占用。

s600:获取并解析各个命令槽;

步骤s600包括以下步骤:

s601:寻址当前命令列表基地址,以当前所寻址地址为起始地址,以0x20个字节为一组,依次表示第1至第32个命令槽;

s602:设置各个命令槽的第1至第2字节的内容作为硬盘的访问类型,设置命令槽的第3至第4字节的内容作为数据项个数,设置命令槽的第5至第8字节的内容作为读取/写入的字节数,设置命令槽的第9至第16字节的内容作为命令表基地址。

具体地,图4示出了本发明的一个实施例中命令列表的数据结构示意图。如图4所示,寻址至当前命令列表基地址0xc9c62000,以0x20个字节为一组,(即,每个命令槽的字节长度为0x20),依次表示第1至第32个命令槽,每个命令槽均可以用于硬盘的数据访问。现以第一个命令槽为例,第1、2字节的内容0x0045表示硬盘的访问类型,本实施例中的0x0045表示硬盘的访问类型为写入数据,如果是0x0005则表示读取数据;第3、第4字节的内容0x0001为数据项的个数;第5至第8字节的内容0x000001000表示读取或者写入的字节长度(即,字节长度为0x1000);第9至第16字节的内容表示命令表基地址0xc9c62700。

s700:获取并解析命令表基地址的内容,确定命令封装区、数据项的操作地址及所操作数据的字节长度;

寻址命令表基地址0xc9c62700,获取命令表。图5示出了本发明的一个实施例中命令表的数据结构示意图。如图5所示,该命令表的第0x1至第0x40字节的内容为命令封装区;第0x81字节至0x400字节的内容为所有数据项的内存空间,其包含以0x10字节为一组的各个数据项的操作地址及所操作数据的字节长度。以第一个数据项为例,第1至第8个字节的内容0x1151f6000为数据项的操作地址,第13至第16字节的内容0x0fff表示所操作数据的字节长度,图5中即为0xfff,但是大小需要在此基础上加1,即为0x1000的字节长度。

s800:确定空闲命令槽:读取命令槽忙闲指示的各比特位,根据各比特位的值确定空闲的命令槽;

本发明的实施例中,通过硬盘端口访问的硬盘数据时,需读取命令槽忙闲指示的值,如前所述,命令槽忙闲指示的值一共4个字节的大小,即32个比特位,每个比特位对应一个命令槽,最低位控制着第1个命令槽,最高位控制第32个命令槽,以此类推。当比特位为1时,表示该命令槽被占用,为0时表示处于空闲状态。只要命令槽忙闲指示不是全f,即不是0xffffffff,就可以找到对应的空闲的命令槽,且各个空闲的命令槽均可使用,实现对该硬盘的访问。

s900:选用空闲命令槽并重新设置命令槽忙闲指示,访问当前硬盘并验证访问成功。具体地,根据所选用的空闲命令槽,将当前硬盘端口的内存空间的第0x39至0x3c字节的内容中的命令槽忙闲指示的对应比特位置1,访问当前硬盘并验证根据所选用的空闲命令槽对当前硬盘的访问成功。

通过本发明提供的方法,解决了现有技术中尚无一种ahci模式下访问硬盘的方法的技术问题。

应当理解的是,本发明不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1