启动方法、生成内核镜像的方法及装置与流程

文档序号:13675654阅读:200来源:国知局

本申请涉及启动技术,具体涉及一种启动方法及装置。本申请同时涉及一种用于启动内核的方法及装置,以及一种生成内核镜像的方法及装置。



背景技术:

通常情况下内核的启动过程包括:1)硬件启动与初始化;2)复制内核镜像到指定内存区域(该过程也称加载内核镜像);3)内核启动这三个步骤。内核在启动的过程中加载内核镜像到内存中的地址通常是固定的,对于攻击者来说很容易通过分析内核镜像,获得指定的代码或数据在内核中的绝对地址,进而通过内核漏洞破坏系统安全。

随着地址空间布局随机化(addressspacelayoutrandomization,简称aslr)技术的出现,为了保障内核的安全性,在启动内核的过程中也可以采用内核地址空间布局随机化技术(kerneladdressspacelayoutrandomization,简称kaslr)。所谓aslr是指,利用随机的方式配置代码和/或数据的地址、让某些敏感代码和/或数据能配置到一个恶意程序未能事先得知的地址,从而令攻击者难于进行攻击的技术,通常可以简称为地址随机化技术。相应的,kaslr则是指,在内核空间实现的地址随机化技术,简称内核地址随机化技术或内核地址随机化。

在开启内核地址随机化(kaslr)的系统中,需要将内核启动的第2)个步骤调整为:先计算出一个随机的地址偏移,将内核镜像作为一个整体加载到加上地址偏移后的内存区域中,然后对内核进行重定位。即:采用整体浮动内核镜像的方式进行随机化。

由此可见,在启用了kaslr的情况下,由于内核镜像的加载地址不再是固定的,攻击者无法简单地通过分析内核镜像,获取代码或数据在内核中的绝对地址,因此在一定程度上增加了攻击者的攻击成本与难度。但是,由于内核镜像是作为一个整体进行的偏移,内核镜像自身内部的代码、数据间的相对偏移都是不变的,攻击者通过一个内核地址泄露漏洞获取内核镜像中某已知代码或数据的地址后,即可计算出内核镜像中所有代码或数据在内核的绝对地址、并实施有针对性的攻击,导致内核的安全性无法得到有效保障。



技术实现要素:

本申请实施例提供一种启动方法和装置,以解决现有的内核启动技术导致内核易受攻击、无法有效保障内核安全性的问题。本申请实施例还提供一种用于启动内核的方法和装置,以及一种生成内核镜像的方法和装置。

本申请提供一种启动方法,包括:

将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;

对所述内核镜像分片进行重定位,以启动内核。

可选的,所述将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中,包括:

将至少根据静态分片方式划分得到的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;所述静态分片方式是指,根据预设符号将内核镜像划分为内核镜像分片的方式。

可选的,所述预设符号包括:在用于控制生成所述内核镜像的链接脚本中添加的、用于划分内核镜像分片的静态分片符。

可选的,所述内核镜像是采用如下步骤生成的:

通过在链接命令中添加用于加入重定位信息的链接参数、以及执行添加了静态分片符的链接脚本,生成包含内核代码的可执行文件,并提取包含所述静态分片符与编译地址的对应关系的符号表;

从所述可执行文件中提取与待生成的内核镜像对应的重定位信息;

针对所述可执行文件执行二进制格式转换操作,生成具有对应的重定位信息、且可根据静态分片符分片加载的所述内核镜像。

可选的,所述预设符号包括:符号表包含的预设内核符号;所述符号表是在生成所述内核镜像的过程中提取的,其中包含所述预设内核符号与编译地址的对应关系。

可选的,所述将至少根据静态分片方式划分得到的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中,包括:

将根据静态分片方式以及动态分片方式划分得到的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;所述动态分片方式是指,将采用静态分片方式划分得到的内核镜像分片划分成两个或者两个以上内核镜像分片的方式。

可选的,在执行所述复制操作之前,包括:

从采用静态分片方式划分内核镜像得到的内核镜像分片中,选择满足预设动态分片条件的内核镜像分片;

针对每个所选内核镜像分片,执行下述操作:按照预设方式在当前内核镜像分片中选取函数,根据划分所述内核镜像分片的预设符号、以及所选函数的编译地址,将所述内核镜像分片划分为两个或两个以上内核镜像分片;

执行上述操作得到的各内核镜像分片,即为所述内核镜像对应的各内核镜像分片。

可选的,所述预设动态分片条件包括:内核镜像分片的大小不小于预设阈值。

可选的,所述将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中,包括:

确定内核镜像分片的数目、以及每个内核镜像分片的起止分片符;

根据所述内核镜像分片的数目,将所述内核镜像加载空间划分为相应数目的子区域;

根据相应的起止分片符将各内核镜像分片包含的代码和/或数据、分别复制到所述划分的不同子区域中。

可选的,所述根据相应的起止分片符将不同内核镜像分片包含的代码和/或数据,分别复制到所述划分的不同子区域中,包括:

按照在内核镜像中的顺序依次选取内核镜像分片,并根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据、复制到随机选取的不同子区域中;

或者,

从所述内核镜像分片中随机选取每个内核镜像分片,并根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据、复制到按照内存地址依次选取的子区域中。

可选的,所述将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中,包括:

确定内核镜像分片的数目、以及每个内核镜像分片的起止分片符;

根据所述内核镜像分片的数目,将内核镜像加载空间均匀划分为相应数目的子区域;

从尚未被复制的内核镜像分片中随机选择一个内核镜像分片;

选择按照内存地址从低到高排序处于首位的、尚未存储内核镜像分片的子区域,并根据预设策略确定所述子区域中的随机偏移地址;

根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据复制到从所选子区域的随机偏移地址开始的内存块中;

判断是否存在尚未被复制的内核镜像分片,若存在,将内核镜像加载空间中、位于当前被复制内核镜像分片之后的剩余内存空间,均匀划分为与尚未被复制的内核镜像分片数目相符的子区域,并转到所述从尚未被复制的内核镜像分片中随机选择一个内核镜像分片的步骤执行;否则,结束内核镜像分片的复制过程。

可选的,所述对所述内核镜像分片进行重定位,包括:

根据所述内核镜像的重定位信息、以及所述内核镜像分片被复制到不同子区域产生的重定位偏移量,对所述内核镜像分片进行重定位。

可选的,所述根据所述内核镜像的重定位信息、以及所述内核镜像分片被复制到不同子区域产生的重定位偏移量,对所述内核镜像分片进行重定位,包括:

针对所述重定位信息中的每个重定位表项,执行下述操作:

根据当前重定位表项所包含的符号的编译地址、重定位类型、以及所述符号所属的内核镜像分片的重定位偏移量,计算所述符号对应的虚地址;

将计算得到的虚地址写入所述当前重定位表项所包含的重定位地址对应的内存单元中。

可选的,所述根据所述内核镜像的重定位信息、以及所述内核镜像分片被复制到不同子区域产生的重定位偏移量信息,对所述内核镜像分片进行重定位,包括:

针对所述内核镜像分片中的每个内核镜像分片,执行下述操作:

遍历所述重定位信息中的条目,选取其中编译地址属于当前内核镜像分片的所有重定位条目;

当所选重定位条目的数量不为零时,针对每个所选重定位条目,执行下述操作:根据当前重定位条目包含的符号的编译地址、重定位类型、以及当前内核镜像分片的重定位偏移量,计算所述符号的虚地址,并将计算得到的虚地址写入当前重定位条目包含的重定位地址对应的内存单元中。

可选的,每个内核镜像分片的重定位偏移量是通过如下方式计算得到的:

用内核镜像分片位于内核镜像加载空间中的起始地址,与其起始编译地址的差值,作为所述内核镜像分片的重定位偏移量。

相应的,本申请还提供一种启动装置,包括:

内核镜像分片复制单元,用于将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;

第一内核镜像分片重定位单元,用于对所述内核镜像分片进行重定位,以启动内核。

可选的,所述内核镜像分片复制单元,具体用于将至少根据静态分片方式划分得到的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;所述静态分片方式是指,根据预设符号将内核镜像划分为内核镜像分片的方式。

可选的,所述装置还包括:内核镜像生成单元;所述内核镜像生成单元,包括:

可执行文件生成子单元,用于通过在链接命令中添加用于加入重定位信息的链接参数、以及执行添加了静态分片符的链接脚本,生成包含内核代码的可执行文件,并提取包含所述静态分片符与编译地址的对应关系的符号表;

重定位信息提取子单元,用于从所述可执行文件中提取与待生成的内核镜像对应的重定位信息;

内核镜像生成子单元,用于针对所述可执行文件执行二进制格式转换操作,生成具有对应的重定位信息、且可根据静态分片符分片加载的所述内核镜像。

可选的,所述内核镜像分片复制单元,具体用于将根据静态分片方式以及动态分片方式划分得到的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;所述动态分片方式是指,将采用静态分片方式划分得到的内核镜像分片划分成两个或者两个以上内核镜像分片的方式。

可选的,所述装置还包括:

内核镜像分片选择单元,用于在所述内核镜像分片复制单元工作之前,从采用静态分片方式划分内核镜像得到的内核镜像分片中,选择满足预设动态分片条件的内核镜像分片;

动态分片单元,用于针对每个所选内核镜像分片,执行下述操作:按照预设方式在当前内核镜像分片中选取函数,根据划分所述内核镜像分片的预设符号、以及所选函数的编译地址,将所述内核镜像分片划分为两个或两个以上内核镜像分片。

可选的,所述内核镜像分片复制单元包括:

分片数目及起止分片符确定子单元,用于确定内核镜像分片的数目、以及每个内核镜像分片的起止分片符;

第一加载空间划分子单元,用于根据所述内核镜像分片的数目,将所述内核镜像加载空间划分为相应数目的子区域;

分片随机复制子单元,用于根据相应的起止分片符将各内核镜像分片包含的代码和/或数据、分别复制到所述划分的不同子区域中。

可选的,所述分片随机复制子单元,具体用于按照在内核镜像中的顺序依次选取内核镜像分片,并根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据、复制到随机选取的不同子区域中;或者,从所述内核镜像分片中随机选取每个内核镜像分片,并根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据、复制到按照内存地址依次选取的子区域中。

可选的,所述内核镜像分片复制单元包括:

分片数目及起止分片符确定子单元,用于确定内核镜像分片的数目、以及每个内核镜像分片的起止分片符;

第二加载空间划分子单元,用于根据所述内核镜像分片的数目,将内核镜像加载空间均匀划分为相应数目的子区域;

内核镜像分片选择子单元,用于从尚未被复制的内核镜像分片中随机选择一个内核镜像分片;

子区域及随机偏移选择子单元,用于选择按照内存地址从低到高排序处于首位的、尚未存储内核镜像分片的子区域,并根据预设策略确定所述子区域中的随机偏移地址;

分片复制子单元,用于根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据复制到从所选子区域的随机偏移地址开始的内存块中;

继续执行判断子单元,用于判断是否存在尚未被复制的内核镜像分片,若存在,触发剩余空间划分子单元工作,否则结束内核镜像分片的复制过程;

剩余空间划分子单元,用于将内核镜像加载空间中、位于当前被复制内核镜像分片之后的剩余内存空间,均匀划分为与尚未被复制的内核镜像分片数目相符的子区域,并触发内核镜像分片选择子单元工作。

可选的,所述内核镜像分片重定位单元,具体用于根据所述内核镜像的重定位信息、以及所述内核镜像分片被复制到不同子区域产生的重定位偏移量,对所述内核镜像分片进行重定位。

可选的,所述内核镜像分片重定位单元包括:

表项循环控制子单元,用于针对重定位信息中的每个重定位表项,触发以下子单元工作:

虚地址计算子单元,用于根据当前重定位表项所包含的符号的编译地址、重定位类型、以及所述符号所属的内核镜像分片的重定位偏移量,计算所述符号对应的虚地址;

第一重定位地址内容更新子单元,用于将计算得到的虚地址写入所述当前重定位表项所包含的重定位地址对应的内存单元中。

可选的,所述内核镜像分片重定位单元包括:

分片循环控制子单元,用于针对所述内核镜像分片中的每个内核镜像分片,触发以下子单元工作:

重定位信息遍历子单元,用于遍历所述重定位信息中的条目,选取其中编译地址属于当前内核镜像分片的所有重定位条目;

第二重定位地址内容更新子单元,用于当所选重定位条目的数量不为零时,针对每个所选重定位条目,根据当前重定位条目包含的符号的编译地址、重定位类型、以及当前内核镜像分片的重定位偏移量,计算所述符号的虚地址,并将计算得到的虚地址写入当前重定位条目包含的重定位地址对应的内存单元中。

可选的,所述内核镜像分片重定位单元还包括:重定位偏移量计算子单元;

所述重定位偏移量计算子单元,用于通过以下方式计算每个内核镜像分片的重定位偏移量:用内核镜像分片位于内核镜像加载空间中的起始地址,与其起始编译地址的差值,作为所述内核镜像分片的重定位偏移量。

此外,本申请还提供一种用于启动内核的方法,包括:

将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;

对所述内核镜像分片进行重定位。

相应的,本申请还提供一种用于启动内核的装置,包括:

内核镜像分片复制单元,用于将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;

第二内核镜像分片重定位单元,用于对所述内核镜像分片进行重定位。

此外,本申请还提供一种生成内核镜像的方法,包括:

通过在链接命令中添加用于加入重定位信息的链接参数、以及执行添加了静态分片符的链接脚本,生成包含内核代码的可执行文件,并提取包含静态分片符与编译地址的对应关系的符号表;

从所述可执行文件中提取与待生成的内核镜像对应的重定位信息;

针对所述可执行文件执行二进制格式转换操作,生成具有对应的重定位信息、且可根据静态分片符分片加载的内核镜像。

相应的,本申请还提供一种生成内核镜像的装置,包括:

可执行文件生成单元,用于通过在链接命令中添加用于加入重定位信息的链接参数、以及执行添加了静态分片符的链接脚本,生成包含内核代码的可执行文件,并提取包含所述静态分片符与编译地址的对应关系的符号表;

重定位信息提取单元,用于从所述可执行文件中提取与待生成的内核镜像对应的重定位信息;

内核镜像生成单元,用于针对所述可执行文件执行二进制格式转换操作,生成具有对应的重定位信息、且可根据静态分片符分片加载的内核镜像。

可选的,所述装置还包括:

重定位信息添加单元,用于在所述内核镜像生成单元生成内核镜像之后,将提取的重定位信息添加到所述内核镜像的尾部。

与现有技术相比,本申请具有以下优点:

本申请提供的启动方法,将内核镜像对应的内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;并对所述内核镜像分片进行重定位,以启动内核。上述方法,提供了启动内核的新技术方案:将内核镜像划分成多个分片,每个分片的大小可以具有随机性,每个分片加载到内存的位置也可以随机化,即内核中的代码及数据是以分片为单位随机分布在内核镜像加载空间中,从而实现了内核地址的碎片化。即使攻击者通过一个内核地址泄露漏洞获取到某个内核镜像分片的相对偏移,也无法计算出其他分片的位置,大大增加攻击者读取、修改内核的难度,从而能够更为有效地保障内核的安全。

附图说明

图1是本申请实施例提供的在链接脚本中添加静态分片符并生成内核镜像的处理流程图;

图2是本申请实施例提供的划分静态分片前后的内核镜像的示意图;

图3是本申请的一种启动方法的实施例的流程图;

图4是本申请实施例提供的执行动态分片的处理流程图;

图5是本申请实施例提供的将静态分片复制到不同的子区域中的处理流程图;

图6是本申请实施例提供的图2所示静态分片复制到不同子区域后的示意图;

图7是本申请的一种启动装置的实施例的示意图;

图8是本申请的一种用于启动内核的方法的实施例的流程图;

图9是本申请的一种用于启动内核的装置的实施例的示意图;

图10是本申请的一种生成内核镜像的方法的实施例的流程图;

图11是本申请的一种生成内核镜像的装置的实施例的示意图。

具体实施方式

在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是,本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此,本申请不受下面公开的具体实施的限制。

在本申请中,分别提供了一种启动方法及装置,一种用于启动内核的方法及装置,以及一种生成内核镜像的方法及装置,在下面的实施例中逐一进行详细说明。在对实施例进行描述之前,先对本申请的技术方案作简要说明。

本申请技术方案的核心在于:引入内核镜像分片的概念,在启动内核的过程中通过将内核镜像分片复制到内核镜像加载空间的不同子区域中、并对内核镜像分片进行重定位,从而既可以保证内核的正常启动,同时也实现了内核地址的碎片化。采用本技术方案,即使攻击者通过一个内核地址泄露漏洞获取到某个分片的相对偏移,也无法计算出其他分片的位置,大大增加攻击者读取、修改内核的难度,从而能够更为有效地保障内核的安全。

其中,所述内核镜像是指,以文件形式存储的内核,通常也称为内核映像、内核映像文件,或者内核镜像文件,例如:image文件。对于个人电脑等具有硬盘的设备,内核镜像文件可以存储在硬盘上,对于智能手机等移动终端设备,内核镜像文件则可以存储在为移动终端设备配备的存储介质上,例如:存储卡。

所述内核镜像分片是指,将编译链接生成的内核镜像作为一个整体,按照一定方式划分成若干个片段,每个片段都包含内核镜像的一部分代码和/或数据,其中每个片段即为本申请所述的内核镜像分片。例如:在生成内核镜像的过程中,通常先根据内核代码生成可执行文件,同时也会为每个内核符号(例如:内核函数名、内核变量名等)分配一个固定地址,即,编译地址,如果内核镜像中包含函数fun1和函数fun2,其中fun1符号的编译地址为fun1_addr,fun2符号的编译地址为fun2_addr,那么如果按照这两个地址进行划分,则可以将内核镜像划分为三个片段:位于fun1_addr之前的片段,位于fun1_addr与fun2_addr之间的片段,以及位于fun2之后的片段,其中每个片段都是本申请所述的内核镜像分片。

所述内核镜像加载空间是指,预先设定的用于加载内核镜像的内存区域,通常可以用预设的内存基地址(base_addr)、以及最大偏移量(max_offset)进行描述,其中预设的内存基地址、以及最大偏移量可以在内核配置文件中设定。

本申请的技术方案,在启动内核的过程中,将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中,以使各内核镜像分片不是按照其在内核镜像中的顺序连续存储在内核镜像加载空间中,从而实现内核地址的碎片化。

在具体实施时,所述内核镜像对应的各内核镜像分片可以采用不同的方式得到,本申请的技术方案提供基于静态分片方式划分内核镜像分片的优选实施方式。由于采用静态分片方式,在启动内核之前就可以得到内核镜像对应的内核镜像分片,可以提高内核启动过程的执行效率。

所述静态分片方式是指,根据预设符号将内核镜像划分为内核镜像分片的方式,所述预设符号可以包括:添加在链接脚本中的静态分片符、或者符号表中包含的预设内核符号。下面分别进行说明。

对于基于静态分片符的静态分片方式,所述静态分片符是在用于控制生成所述内核镜像的链接脚本中添加的、用于划分内核镜像分片的符号。采用这种方式,使得编译链接生成的内核镜像从逻辑上、静态地划分为若干个内核镜像分片,从而在启动内核的过程中,可以在静态划分的基础上将各内核镜像分片复制到内核镜像加载空间的不同子区域中。采用这种方式,即使对内核代码进行了修改,也不影响各内核镜像分片,每次启动内核时仍然可以直接复制各内核镜像分片,简便易行,而且由于在启动内核之前就已经得到内核镜像对应的各内核镜像分片,可以提高内核启动过程的效率。

对于基于预设内核符号的静态分片方式,可以根据符号表包含的预设内核符号对内核镜像进行划分得到各内核镜像分片;其中,所述符号表是在生成所述内核镜像的过程中提取的,其中包含了所述预设内核符号与编译地址的对应关系。例如,可以根据符号表中包含的n个预设函数符号,将内核镜像相应划分为n+1个内核镜像分片。

以上对静态分片方式进行了简要说明。在本申请的技术方案中,还可以将静态分片方式与动态分片方式相结合,即:将采用静态分片方式划分得到的内核镜像分片进一步划分为两个或者两个以上内核镜像分片,之所以将这种方式称为动态分片方式,是因为动态分片方式通常可以在内核镜像的启动过程中动态执行。

在以下提供的实施例中,将重点以基于静态分片符划分内核镜像为例进行描述,采用这种实施方式,可以预先在链接脚本中添加静态分片符并生成内核镜像,具体过程可以包括下述步骤101-104,下面结合图1作进一步说明。

步骤101、通过在链接命令中添加用于加入重定位信息的链接参数、以及执行添加了静态分片符的链接脚本,生成包含内核代码的可执行文件,并提取包含静态分片符与编译地址的对应关系的符号表。

本步骤可以包括添加静态分片符、链接、提取符号表这样几个过程,下面分别进行说明。

1)在链接脚本中添加静态分片符。

所述静态分片符是指,在用于控制生成内核镜像的链接脚本中添加的、用于通过静态方式划分内核镜像分片的符号。通过在所述链接脚本中添加静态分片符,可以从逻辑上、将内核镜像划分为若干个内核镜像分片,在以下描述中,将根据静态分片符划分内核镜像得到的内核镜像分片,也称为:静态分片。

在没有通过链接脚本链接前的内核代码通常包含大量的(例如103–104个)代码块以及数据块,通过调用链接脚本执行链接操作可以将其中类型相同的代码块或者数据块合并到一起,并且聚合成特定数目的段落。

以linux内核镜像为例,linux内核镜像通常是在调用链接脚本$(srctree)/arch/$(arch)/kernel/vmlinux.lds生成可执行文件vmlinux的基础上生成的,通常linux内核镜像中至少包含以下5个段落:.head.text、.text、.init、.data、以及.bss。以.text段为例,以下给出.text段落在链接脚本vmlinux.lds中的逻辑示意:

上述链接脚本片段中的*(.exception.text)就是将所有.exception.text代码块的代码放到当前位置,后面的irqentry_text等宏展开后也是类似*(xxx)的形式,同样代表将某一类代码块合并。

在上述链接脚本片段中添加静态分片符后,得到的链接脚本片段示意如下:

在上述例子中,通过添加静态分片符从逻辑上划分出了两个静态分片,第一个静态分片的起始地址由静态分片符1标识,结束地址由静态分片符2标识;第二个静态分片的起始地址由静态分片符3标识,结束地址由静态分片符4标识。通常可以将静态分片符1称作第一个静态分片的起始分片符,将静态分片符2称作其终止分片符,对第二个静态分片也是同样。在具体实施时,可以采用易于理解的字符串作为静态分片符,例如:静态分片符1可以为:_stext_sub_start1,静态分片符2可以为_stext_sub_end1,也可以采用其他形式的预设字符串。

参照上述方式在链接脚本的预设位置或者随机选择的位置添加静态分片符,就可以将内核镜像从逻辑上划分为若干个静态分片。请参见图2,其为划分静态分片前后的内核镜像的示意图,在该示意图中,在划分之前,内核镜像中包含5个段落,进行静态划分后,内核镜像被划分为12个静态分片。

在上述例子中,采用一对儿静态分片符作为一个静态分片的起始分片符和终止分片符(简称起止分片符),在其他实施方式中,也可以仅采用一个静态分片符标识一个静态分片的起始地址,那么标识某静态分片起始地址的静态分片符同时也可以作为标识前一静态分片结束地址的静态分片符。

2)通过在链接命令中添加用于加入重定位信息的链接参数、以及执行添加了静态分片符的链接脚本,生成包含内核代码的可执行文件。

本步骤的目的是通过执行链接操作,将已经编译生成的vmlinux.o等目标文件链接生成包含重定位信息的可执行文件。以生成linux内核镜像为例,具体可以在链接命令中调用1)中编辑好的链接脚本,并且在该命令中通过如下方式添加用于加入重定位信息的链接参数:ldflags_vmlinux+=--emit-relocs,从而通过执行链接命令生成可执行文件vmlinux(通常是elf格式的文件)。

3)提取包含静态分片符与编译地址的对应关系的符号表。

在生成可执行文件后,通常每个内核符号都被分配了一个固定的编译地址,本步骤提取内核符号与编译地址的对应关系,并可以将该对应关系记录在特定的文件中。由于静态分片符也属于内核符号,因此该对应关系中也包括静态分片符与编译地址的对应关系。利用该对应关系,内核可以通过编译地址识别符号,开发人员则可以使用符号进行编码和链接。

以linux内核镜像为例,在链接生成包含内核代码的可执行文件之前,通常可以预先设定好基地址,例如0xc0008000,链接生成包含内核代码的可执行文件vmlinux后,每个内核符号通常都与一个大于所述基地址的编译地址相对应,通过nmvmlinux命令可以提取内核符号与编译地址的对应关系,并可以将该对应关系记录在符号表system.map中。system.map所包含内容的逻辑示意如下:

c000aaaat静态分片符1

c000bbbbt静态分片符2

c000cccct静态分片符3

c000ddddt静态分片符4

由此可见,通过在链接时添加静态分片符进行逻辑划分,再生成包含静态分片符与编译地址的对应关系的符号表,使得静态分片符能够定位具体的静态分片,例如:用静态分片符1和静态分片符2,可以定位内核镜像中编译地址为0xc000aaaa-0xc000bbbb的静态分片。

步骤102、从所述可执行文件中提取与待生成的内核镜像对应的重定位信息。

由于在后续步骤103执行二进制提取操作时,通常会去除重定位信息,而本技术方案为了保证内核的正常启动与运行,在将内核镜像分片复制到内核镜像加载空间的不同子区域之后,通常要执行重定位操作,因此需要获取重定位信息。在步骤101已经生成了具有重定位信息的可执行文件,因此本步骤可以从所述可执行文件中提取重定位信息。以linux内核镜像为例,可以通过执行readelf–rvmlinux命令或者类似命令提取重定位信息。所述重定位信息可以添加在内核镜像的尾部,也可以按照预设方式存储在预设存储介质中,只要在需要执行重定位操作时,能够访问所述重定位信息即可。

步骤103、针对所述可执行文件执行二进制格式转换操作,生成具有对应的重定位信息、且可根据静态分片符分片加载的内核镜像。

本步骤针对步骤101生成的可执行文件(通常是elf格式),执行二进制提取操作,从所述可执行文件中提取二进制(rawbinary)格式的内核镜像,从而生成了具有对应的重定位信息、且可根据静态分片符分片加载的内核镜像。以linux内核镜像为例,可以通过执行objcopy命令生成内核镜像image。

为了便于在执行重定位时访问步骤102提取的重定位信息,在生成内核镜像之后,可以将所述重定位信息添加到内核镜像的尾部。

至此,通过步骤101-103对内核镜像的生成过程进行了描述。需要说明的是,在具体实施过程中,由于所采用的平台、操作系统等的差异,可以采用不同于上述步骤的其它方式生成内核镜像,只要能够通过添加静态分片符实现对内核镜像的静态划分、并生成相应的重定位信息,就都是可以的。

在描述内核镜像生成过程的基础上,下面对本申请提供的一种启动方法的实施例进行描述。

请参考图3,其为本申请的一种启动方法的实施例的流程图,所述方法包括如下步骤:

步骤301、将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中。

本步骤可以将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中,复制过程通常也称为加载过程。所述内核镜像分片可以是采用静态分片方式(例如:基于静态分片符)划分内核镜像得到的内核镜像分片,也可以是将静态分片方式与动态分片方式结合实施得到的内核镜像分片。

对于将静态分片与动态分片相结合的实施方式,可以在启动内核的过程中,在执行本步骤之前,先进行动态分片操作。具体可以包括步骤300-1至300-2,下面结合图4说明如下:

步骤300-1、从采用静态分片方式划分内核镜像得到的内核镜像分片中,选择满足预设动态分片条件的内核镜像分片。

本步骤从采用静态分片方式划分内核镜像得到的内核镜像分片,即静态分片中,选择满足预设动态分片条件的静态分片。所述预设动态分片条件可以为,静态分片的大小不小于预设阈值。在这种情况下,可以将各静态分片的大小(可以根据用于划分静态分片的起始分片符及终止分片符对应的编译地址获知静态分片的大小),依次与预设阈值进行比较,并从中选择大于或者等于预设阈值的静态分片,并执行步骤300-2。

在其他实施方式中,也可以根据具体的需求,预先设定其他的动态分片条件、并在本步骤中选择满足相应动态分片条件的静态分片,也是可以的。

步骤300-2、针对每个所选内核镜像分片,执行下述操作:按照预设方式在当前内核镜像分片中选取函数,根据划分所述内核镜像分片的预设符号(例如:静态分片符)以及所选函数的编译地址,将所述内核镜像分片划分为两个或者两个以上内核镜像分片。

在本实施例中,针对步骤300-1所选的某个静态分片,可以根据内核符号与编译地址的对应关系(例如:可以查询符号表),按照预设方式选取位于所述静态分片中的一个或者一个以上的函数,并将所选函数的编译地址作为动态分片符,从而将所述静态分片动态地划分为若干个内核镜像分片,在本实施例中将对静态分片划分得到的内核镜像分片,称作动态分片。

例如:对由静态分片符1和静态分片符2标识的静态分片进行动态划分,从中选取了函数funca的编译地址funca_addr作为动态分片符,那么该静态分片被划分成了两个动态分片,一个是静态分片符1与动态分片符funca_addr之间的动态分片(该动态分片的起始分片符为静态分片符1,终止分片符为动态分片符funca_addr),另一个是动态分片符funca_addr与静态分片符2之间的动态分片(该动态分片的起始分片符为动态分片符funca_addr,终止分片符为静态分片符2)。

本步骤可以采用上述方式对步骤300-1所选的每个静态分片依次执行上述操作,执行完上述操作后得到的各内核镜像分片,即为所述内核镜像对应的各内核镜像分片。

例如,通过在链接脚本中添加静态分片符的方式将内核镜像划分成了10个内核镜像分片,在启动内核的过程中,又将其中的第10个内核镜像分片划分成了两个内核镜像分片,那么此时得到的内核镜像分片为11个,其中第1至第9个为静态分片,最后两个是动态分片。

在采用静态分片方式划分得到内核镜像分片的基础上,引入动态分片方式,使得分片方式更为灵活。例如,因为内核代码的修改,可能导致某个或者某些内核镜像分片增大,而通过动态分片方式可以削减这些内核镜像分片的大小,增加内核镜像分片的数量,让数目更多的内核镜像分片分散在内核加载空间的不同的子区域中,从而进一步提高内核的安全性。

以上对可以在本步骤301之前执行的动态分片过程进行了说明。需要说明的是,在具体实施时,可以仅采用静态分片方式,在这种情况下就无需执行上面描述的动态分片过程。

本步骤可以将对应于内核镜像的各内核镜像分片,分别复制到内核镜像加载空间的不同子区域中。具体的复制过程可以采用多种实施方式,例如:可以采用预先划分固定的子区域的方式,也可以采用动态划分子区域的方式,在描述完本实施例的步骤302后,会具体列举出本步骤的几种可能的实施方式。

步骤302、对所述内核镜像分片进行重定位,以启动内核。

本步骤对步骤301已加载到内存的内核镜像分片进行重定位,即:根据内核镜像的重定位信息、以及所述内核镜像分片被复制到不同子区域产生的重定位偏移量,对所述内核镜像分片进行重定位。

在生成所述内核镜像的时候,通常也生成了重定位信息,该信息可以添加在内核镜像的尾部,也可以按照预设方式存储在预设存储介质中,本步骤可以相应地从所述内核镜像的尾部、或者从预设存储介质中获取重定位信息,都是可以的。

所述重定位信息中通常包含一系列的重定位表项,每个重定位表项中通常包含重定位地址、与重定位地址相关的符号、所述符号的编译地址、以及重定位类型等信息。执行重定位操作,就是根据重定位表项包含的上述信息、以及所述符号所属内核镜像分片的重定位偏移量,对重定位地址对应的内存单元的内容进行更新的过程。

其中,每个内核镜像分片的重定位偏移量可以在步骤301的复制过程中计算,也可以在本步骤中计算。具体计算方法可以为:用内核镜像分片位于内核镜像加载空间中的起始地址,与所述内核镜像分片的起始编译地址(即,用于划分所述内核镜像分片的起始分片符所对应的编译地址,若起始分片符为静态分片符,可以通过查询符号表获取对应的编译地址)的差值,作为所述内核镜像分片的重定位偏移量。例如:某一内核镜像分片的起始分片符所对应的编译地址为0xc0008000,而该内核镜像分片被复制到内核镜像加载空间的0xc0009000处,那么该内核镜像分片的重定位偏移量为0xc0009000-0xc0008000=0x1000。

在具体实施时,可以采取以下两种方式执行重定位操作:

(一)针对重定位信息中的每个重定位表项依次进行处理。

针对所述重定位信息中的每个重定位表项,执行下述操作:根据当前重定位表项所包含的符号的编译地址、重定位类型、以及所述符号所属的内核镜像分片的重定位偏移量,计算所述符号对应的虚地址;将计算得到的虚地址写入所述当前重定位表项所包含的重定位地址对应的内存单元中。

例如:某一重定位表项中包含重定位地址0xc000813c,对应的内核符号为_end,在编译链接阶段该符号的编译地址为0xc2146de0,重定位类型为“r_arm_abs32”。根据重定位类型可以知道地址为0xc000813c这个内存单元中应该存储_end这个符号的绝对地址,因此可以根据符号_end的编译地址找到该符号所属的内核镜像分片,然后通过以下方式计算所述符号对应的虚地址:虚地址=编译地址+所属内核镜像分片的重定位偏移量,并将计算得到的虚地址写入0xc000813c所对应的内存单元中。

(二)针对每个内核镜像分片依次进行处理。

针对所述内核镜像分片中的每个内核镜像分片,执行下述操作:遍历所述重定位信息中的条目,选取其中的编译地址属于当前内核镜像分片的所有重定位条目;当所选重定位条目的数量不为零时,针对每个所选重定位条目,执行下述操作:根据当前重定位条目包含的符号的编译地址、重定位类型、以及当前内核镜像分片的重定位偏移量,计算所述符号的虚地址,并将计算得到的虚地址写入当前重定位条目包含的重定位地址对应的内存单元中。

下面提供本实施例中步骤301的两种具体实施方式。

实施方式一:

在本实施方式中,内核加载空间中的各子区域的大小,是在复制内核镜像分片的过程中动态调整的。具体包括如下所示的步骤301-1至步骤301-7,下面结合图5作进一步说明。

步骤301-1、确定内核镜像分片的数目、以及每个内核镜像分片的起止分片符。

对于仅根据静态分片符划分得到内核镜像分片的实施方式,本步骤可以根据静态分片符确定内核镜像分片,即:静态分片,的数目以及每个静态分片的起止分片符。

如前所述,在向用于控制生成内核镜像的链接脚本中添加静态分片符时可以采用不同的方式,例如:可以针对每个静态分片添加一对儿分别用于标识起始和结束地址的静态分片符,也可以针对每个静态分片仅添加一个标识起始地址的静态分片符,本步骤通过对已添加的静态分片符的读取与分析,确定静态分片的数目,以及用于标识每个静态分片的起始地址的起始分片符、和标识其终止地址的终止分片符,统称起止分片符。

对于将静态分片方式和动态分片方式相结合的实施方式,则可以根据静态分片符以及执行动态分片时所选的动态分片符,确定内核镜像分片的数目、以及每个内核镜像分片的起止分片符。

例如:根据静态分片符划分了10个静态分片后,又对由静态分片符1和静态分片符2划分的静态分片进行动态划分,从中选取了函数funca的编译地址funca_addr作为动态分片符,那么内核镜像分片的数目为11个,其中包括9个静态分片,每个静态分片的起止分片符为相应的静态分片符;此外,还包括两个由静态分片进行动态划分得到的动态分片,其中一个动态分片的起始分片符为静态分片符1、终止分片符为动态分片符funca_addr,另一个动态分片的起始分片符为动态分片符funca_addr、终止分片符为静态分片符2。

步骤301-2、根据所述内核镜像分片的数目,将内核镜像加载空间均匀划分为相应数目的子区域。

例如,内核镜像分片的数目为10个,内核镜像加载空间总共为50mb,那么本步骤可以从内核镜像加载空间的基地址开始,将内核镜像加载空间划分为10个子区域,每个子区域的大小为5mb。

步骤301-3、从尚未被复制的内核镜像分片中随机选择一个内核镜像分片。

例如,可以将尚未被复制的n个内核镜像分片按照在链接脚本中的顺序分别分配编号0~n-1,然后生成取值范围在0~n-1之间的随机数,并以生成的随机数为编号、选择相对应的内核镜像分片。

步骤301-4、选择按照内存地址从低到高排序处于首位的、尚未存储内核镜像分片的子区域,并根据预设策略确定所述子区域中的随机偏移地址。

本步骤从划分好的、尚未存储内核镜像分片的子区域中,选择按照内存地址从低到高排序处于首位的,即:通常所说处于最前面的子区域,并根据预设策略确定所述子区域中的随机偏移地址。

所述根据预设策略确定所述子区域中的随机偏移地址,可以采用不同的方式实施,例如:可以在预设取值范围内选择随机数作为随机偏移地址,也可以在综合考虑所选内核镜像分片大小、以及所选子区域大小的基础上,选择随机偏移地址,使得尽可能将所选内核镜像分片复制到所选子区域中。

步骤301-5、根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据复制到从所选子区域的随机偏移地址开始的内存块中。

对于在步骤301-3所选的内核镜像分片,在步骤301-1中已经确定了其起止分片符,本步骤根据所述起止分片符,将所选内核镜像分片包含的代码和/或数据复制到从所选子区域的随机偏移地址开始的内存块中。

例如:所选内核镜像分片的起止分片符为静态分片符:静态分片符1和静态分片符2,通过查询符号表,可以获知这两个静态分片符对应的编译地址分别为:0xc000aaaa和0xc000bbbb,因此本步骤根据静态分片符1和静态分片符2,将该内核镜像分片包含的代码和/或数据复制到从所选子区域的随机偏移地址开始的内存块中,实际上就是将内核镜像中编译地址为0xc000aaaa-0xc000bbbb的这一段代码和/或数据复制到所述内存块中。需要说明的是,如果内核镜像分片的起始分片符,和/或,终止分片符为动态分片符,则无需针对动态分片符进行编译地址的转换,因为动态分片符本身即为编译地址信息。

通常在所选内核镜像分片比较小的情况下,本步骤执行的复制操作可能仅占用步骤301-4所选子区域中的内存,如果内核镜像分片比较大,则还可能占用位于所选子区域之后的部分内存。

步骤301-6、判断是否存在尚未被复制的内核镜像分片,若存在,执行步骤301-7,否则,结束内核镜像分片的复制过程。

如果没有尚未被复制的内核镜像分片,说明全部内核镜像分片已加载完毕,可以结束内核镜像分片的复制过程,否则执行步骤201-7重新划分子区域,为继续复制内核镜像分片做好准备。

步骤301-7、将内核镜像加载空间中、位于当前被复制内核镜像分片之后的剩余内存空间,均匀划分为与尚未被复制的内核镜像分片数目相符的子区域,并转到步骤301-3执行。

例如:步骤301-1确定的内核镜像分片的数目为10个,步骤301-5将其中一个内核镜像分片复制到步骤301-4所选的子区域中,此时尚未被复制的内核镜像分片数目为9,本步骤可以将内核镜像加载空间中、位于从当前被复制内核镜像分片之后的剩余内存空间,均匀划分为9个子区域,然后转到步骤301-3继续执行。

至此,通过步骤301-1至步骤301-7,将内核镜像对应的各内核镜像分片复制到内核镜像加载空间的不同子区域中。请参见图6,其为图2所示各内核镜像分片复制到不同子区域后的示意图,其中(a)为执行复制操作前的内核镜像加载空间的示意图,(b)为执行复制操作后的内核镜像加载空间的示意图,通过该示意图可以看出,复制到内核镜像加载空间中的各内核镜像分片是随机分布的,实现了内核地址的碎片化。

在本实施方式中,子区域的大小是动态调整的,通常可以在内核镜像分片的大小存在相对较大差异的情况下选用此实施方式,既可以实现内核镜像分片在内存中的随机分布,通常也能够保证全部内核镜像分片都完整地加载到内核镜像加载空间中。

实施方式二:

在本实施方式中,将内核镜像分片对应的各内核镜像分片复制到预先均匀划分好的不同子区域中。具体实现可以为:确定内核镜像分片的数目、以及每个内核镜像分片的起止分片符;根据所述内核镜像分片的数目,将所述内核镜像加载空间划分为相应数目的子区域;根据相应的起止分片符将不同内核镜像分片包含的代码和/或数据、随机复制到所述划分的不同子区域中。其中,在划分相应数目的子区域时,可以采用不同的策略,例如,可以均匀划分。

具体实施时,可以按照在内核镜像中的顺序依次选取内核镜像分片,并根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据、复制到随机选取的不同子区域中;或者,从内核镜像分片中随机选取每个内核镜像分片,并根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据、复制到根据内存地址依次选取的不同子区域中。上述这两种方式,一种是随机选取子区域,一种是随机选取内核镜像分片,从而将各内核镜像分片随机复制到不同的子区域中,实现内核地址的碎片化。

在具体实施时,不管采用上述何种方式,在选定内核镜像分片以及子区域后,可以将所选内核镜像分片包含的数据和/或代码复制到从所选子区域的起始地址开始的内存块中,也可以复制到从所选子区域的预设或者随机偏移地址开始的内存块中。

以上针对本实施例中的步骤301,列举了几种可能的实施方式,在具体实施中,也可以采用不同于上述实施方式的其他实施方式,只要将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中,从而实现内核地址的碎片化就都是可以的。例如:可以不预先将内核镜像加载空间划分为各子区域,而是随机选取内核镜像分片,并将每次随机选取的内核镜像分片顺序复制到内核镜像加载空间中,也是可以的。

本实施例中,通过执行步骤301-302,将各内核镜像分片复制到内核镜像加载空间的不同子区域中,并对内核镜像分片进行重定位操作,此后就可以启动内核了。

上述实施例重点对基于静态分片符(以及与动态分片方式相结合)划分内核镜像分片的实施方式进行了描述。在其他实施方式中,也可以根据符号表包含的预设内核符号划分划分内核镜像分片(这也属于静态分片方式),并同样可以与动态分片方式相结合。

具体的实施方式与基于静态分片符的实施方式是类似的,不同之处在于一些细节,例如:对内核镜像进行静态划分是根据符号表中的预设内核符号;在执行动态分片的步骤300-2时,针对当前处理的内核镜像分片,则可以根据划分所述内核镜像分片的预设内核符号以及所选函数的编译地址,将所述内核镜像分片划分为两个或者两个以上内核镜像分片;对于在复制操作过程中确定内核镜像分片的数目以及每个内核镜像分片的起止分片符时(例如步骤301-1),对于仅根据静态分片符划分得到内核镜像分片的实施方式,可以根据预设内核符号确定上述信息,对于将静态分片方式和动态分片方式相结合的实施方式,则可以根据预设内核符号以及执行动态分片时所选的动态分片符,确定上述信息。当然,预设内核符号所对应的编译地址,也可以通过查询符号表获取。

需要说明的是,本实施例中所举具体例子虽然大部分都是针对linux内核的,但是本申请所提供的技术方案也可以应用于其它内核的启动过程中,例如:windows内核等,并取得相同的有益效果:通过将各内核镜像分片分别复制到内核镜像加载空间的不同子区域中,并进行重定位操作,不仅可以保证内核的正常启动,而且实现了内核地址的碎片化,即使攻击者通过一个内核地址泄露漏洞获取到某个内核镜像分片的相对偏移,也无法计算出其他分片的位置,大大增加攻击者读取、修改内核的难度,从而能够更为有效地保障内核的安全。

此外,在具体实施时,本实施例提供的启动方法,可以单独实施,也可以与kaslr技术结合实施。单独实施时,可以根据预设的内存基地址(base_addr)以及最大偏移量(max_offset)确定内核镜像加载空间;在与kaslr技术结合实施时,可以在所述内存基地址base_addr的基础上,根据所选的用于加载内核镜像的整体随机偏移量(r_offset)进行浮动,并将内存地址为(base_addr+r_offset)~(base_addr+r_offset+max_offset)的内存区域作为步骤301所述的内核镜像加载空间。

在上述的实施例中,提供了一种启动方法,与之相对应的,本申请还提供一种启动装置。请参看图7,其为本申请的一种启动装置的实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。

本实施例的一种启动装置,包括:内核镜像分片复制单元701,用于将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;第一内核镜像分片重定位单元702,用于对所述内核镜像分片进行重定位,以启动内核。

可选的,所述内核镜像分片复制单元,具体用于将至少根据静态分片方式划分得到的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;所述静态分片方式是指,根据预设符号将内核镜像划分为内核镜像分片的方式。

可选的,所述装置还包括:内核镜像生成单元;所述内核镜像生成单元,包括:

可执行文件生成子单元,用于通过在链接命令中添加用于加入重定位信息的链接参数、以及执行添加了静态分片符的链接脚本,生成包含内核代码的可执行文件,并提取包含所述静态分片符与编译地址的对应关系的符号表;

重定位信息提取子单元,用于从所述可执行文件中提取与待生成的内核镜像对应的重定位信息;

内核镜像生成子单元,用于针对所述可执行文件执行二进制格式转换操作,生成具有对应的重定位信息、且可根据静态分片符分片加载的所述内核镜像。

可选的,所述内核镜像分片复制单元,具体用于将根据静态分片方式以及动态分片方式划分得到的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;所述动态分片方式是指,将采用静态分片方式划分得到的内核镜像分片划分成两个或者两个以上内核镜像分片的方式。

可选的,所述装置还包括:

内核镜像分片选择单元,用于在所述内核镜像分片复制单元工作之前,从采用静态分片方式划分内核镜像得到的内核镜像分片中,选择满足预设动态分片条件的内核镜像分片;

动态分片单元,用于针对每个所选内核镜像分片,执行下述操作:按照预设方式在当前内核镜像分片中选取函数,根据划分所述内核镜像分片的预设符号、以及所选函数的编译地址,将所述内核镜像分片划分为两个或两个以上内核镜像分片。

可选的,所述内核镜像分片复制单元包括:

分片数目及起止分片符确定子单元,用于确定内核镜像分片的数目、以及每个内核镜像分片的起止分片符;

第一加载空间划分子单元,用于根据所述内核镜像分片的数目,将所述内核镜像加载空间划分为相应数目的子区域;

分片随机复制子单元,用于根据相应的起止分片符将各内核镜像分片包含的代码和/或数据、分别复制到所述划分的不同子区域中。

可选的,所述分片随机复制子单元,具体用于按照在内核镜像中的顺序依次选取内核镜像分片,并根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据、复制到随机选取的不同子区域中;或者,从所述内核镜像分片中随机选取每个内核镜像分片,并根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据、复制到按照内存地址依次选取的子区域中。

可选的,所述内核镜像分片复制单元包括:

分片数目及起止分片符确定子单元,用于确定内核镜像分片的数目、以及每个内核镜像分片的起止分片符;

第二加载空间划分子单元,用于根据所述内核镜像分片的数目,将内核镜像加载空间均匀划分为相应数目的子区域;

内核镜像分片选择子单元,用于从尚未被复制的内核镜像分片中随机选择一个内核镜像分片;

子区域及随机偏移选择子单元,用于选择按照内存地址从低到高排序处于首位的、尚未存储内核镜像分片的子区域,并根据预设策略确定所述子区域中的随机偏移地址;

分片复制子单元,用于根据所选内核镜像分片的起止分片符,将其包含的代码和/或数据复制到从所选子区域的随机偏移地址开始的内存块中;

继续执行判断子单元,用于判断是否存在尚未被复制的内核镜像分片,若存在,触发剩余空间划分子单元工作,否则结束内核镜像分片的复制过程;

剩余空间划分子单元,用于将内核镜像加载空间中、位于当前被复制内核镜像分片之后的剩余内存空间,均匀划分为与尚未被复制的内核镜像分片数目相符的子区域,并触发内核镜像分片选择子单元工作。

可选的,所述内核镜像分片重定位单元,具体用于根据所述内核镜像的重定位信息、以及所述内核镜像分片被复制到不同子区域产生的重定位偏移量,对所述内核镜像分片进行重定位。

可选的,所述内核镜像分片重定位单元包括:

表项循环控制子单元,用于针对重定位信息中的每个重定位表项,触发以下子单元工作:

虚地址计算子单元,用于根据当前重定位表项所包含的符号的编译地址、重定位类型、以及所述符号所属的内核镜像分片的重定位偏移量,计算所述符号对应的虚地址;

第一重定位地址内容更新子单元,用于将计算得到的虚地址写入所述当前重定位表项所包含的重定位地址对应的内存单元中。

可选的,所述内核镜像分片重定位单元包括:

分片循环控制子单元,用于针对所述内核镜像分片中的每个内核镜像分片,触发以下子单元工作:

重定位信息遍历子单元,用于遍历所述重定位信息中的条目,选取其中编译地址属于当前内核镜像分片的所有重定位条目;

第二重定位地址内容更新子单元,用于当所选重定位条目的数量不为零时,针对每个所选重定位条目,根据当前重定位条目包含的符号的编译地址、重定位类型、以及当前内核镜像分片的重定位偏移量,计算所述符号的虚地址,并将计算得到的虚地址写入当前重定位条目包含的重定位地址对应的内存单元中。

可选的,所述内核镜像分片重定位单元还包括:重定位偏移量计算子单元;

所述重定位偏移量计算子单元,用于通过以下方式计算每个内核镜像分片的重定位偏移量:用内核镜像分片位于内核镜像加载空间中的起始地址,与其起始编译地址的差值,作为所述内核镜像分片的重定位偏移量。

此外,本申请还提供一种用于启动内核的方法。请参考图8,其为本申请的一种用于启动内核的方法的实施例的流程图,本实施例与上述方法实施例步骤相同的部分不再赘述,下面重点描述不同之处。本实施例的一种用于启动内核的方法,包括如下步骤:

步骤801、将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中。

步骤802、对所述内核镜像分片进行重定位。

在上述的实施例中,提供了一种用于启动内核的方法,与之相对应的,本申请还提供一种用于启动内核的装置。请参看图9,其为本申请的一种用于启动内核的装置的实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。

本实施例的一种用于启动内核的装置,包括:内核镜像分片复制单元901,用于将内核镜像对应的各内核镜像分片、分别复制到内核镜像加载空间的不同子区域中;第二内核镜像分片重定位单元902,用于对所述内核镜像分片进行重定位。

此外,本申请还提供一种生成内核镜像的方法。请参考图10,其为本申请的一种生成内核镜像的方法的实施例的流程图,本实施例与上述方法实施例步骤相同的部分不再赘述,下面重点描述不同之处。本实施例的一种生成内核镜像的方法包括如下步骤:

步骤1001、通过在链接命令中添加用于加入重定位信息的链接参数、以及执行添加了静态分片符的链接脚本,生成包含内核代码的可执行文件,并提取包含静态分片符与编译地址的对应关系的符号表。

步骤1002、从所述可执行文件中提取与待生成的内核镜像对应的重定位信息。

步骤1003、针对所述可执行文件执行二进制格式转换操作,生成具有对应的重定位信息、且可根据静态分片符分片加载的内核镜像。

在生成内核镜像分片后,还可以将提取的重定位信息添加到所述内核镜像的尾部。

采用本实施例提供的生成内核镜像的方法,能够在生成内核镜像的过程中,根据在链接脚本中添加的静态分片符实现对内核镜像的静态划分,从而可以在启动内核镜像的过程中、将至少根据静态分片符划分得到的各内核镜像分片复制到内核镜像空间的不同的子区域中,有助于提高内核的安全性。

在上述的实施例中,提供了一种生成内核镜像的方法,与之相对应的,本申请还提供一种生成内核镜像的装置。请参看图11,其为本申请的一种生成内核镜像的装置的实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。

本实施例的一种生成内核镜像的装置,包括:可执行文件生成单元1101,用于通过在链接命令中添加用于加入重定位信息的链接参数、以及执行添加了静态分片符的链接脚本,生成包含内核代码的可执行文件,并提取包含所述静态分片符与编译地址的对应关系的符号表;重定位信息提取单元1102,用于从所述可执行文件中提取与待生成的内核镜像对应的重定位信息;内核镜像生成单元1103,用于针对所述可执行文件执行二进制格式转换操作,生成具有对应的重定位信息、且可根据静态分片符分片加载的内核镜像。

本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

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