一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种jailhouse的堆栈保护的方法与流程

2022-10-26 05:09:31 来源:中国专利 TAG:


1.本专利申请属于堆栈保护技术领域,更具体地说,是涉及一种jailhouse的堆栈保护的方法。


背景技术:

2.jailhouse是一个嵌入式系统的虚拟化工具,它非常强调partition。实时性比较好,隔离的安全性也比较好。由德国西门子开发,始于2013年11月。
3.现有技术的缺点是:
4.jailhouse的默认堆栈大小是4kb,当函数的调用栈超出4kb这个范围时,没有任何的保护措施。导致入栈的数据过多导致堆栈越界时,堆栈中保存的值可能会被程序改写。并且堆栈在出栈时,由之前入栈越界部分的数据被改写,导致出栈时弹出的数据是错误的,从而sp指针的值发生错误。
5.过程如图所示:
6.图1中,是在jailhouse中的正常使用状态,当前使用的栈大小并没有超出percpu栈的4kb大小。
7.当函数调用链过长,栈大小超过percpu栈的4kb大小时,如图2所示,图2中percpu数据1的超出部分已经踩写到了percpu数据2的位置。如果这个是后对percpu数据2的内容进行改写,势必会造成percpu数据1压入栈中的数据错误。
8.这种问题在出错时,在超出4kb大小的时候无法第一时间检测出问题,造成后续定位困难。


技术实现要素:

9.本发明需要解决的技术问题是提供一种jailhouse的堆栈保护的方法,可以在percpu的栈在超出4kb大小时,第一时间产生异常,从异常处理中定位到栈越界的问题。
10.为了解决上述问题,本发明所采用的技术方案是:
11.一种jailhouse的堆栈保护的方法,具体步骤如下:
12.s1、在每个percpu数据中插入一个保护页;
13.s2、设置保护页的属性为只读;
14.s3、在堆栈的异常向量表的异常处理函数中加入sp栈指针的判断,如果sp栈指针在保护页的范围内,则发生异常是由于栈越界导致,反之则不是。
15.本发明技术方案的进一步改进在于:保护页的设置方法为:
16.arm64(arm 64位cpu)的特权级别包括el0状态、el1状态、el2状态、el3状态,jailhouse是运行在el2状态;在arm64的l3页表中,由于ap[2:1]属性表示了在el2状态和el3状态下的访问权限;所以利用ap[2:1]属性,使保护页的页表项中ap[2:1]置1后,保护页的属性就会变成只读,如下表1所示:
[0017]
ap[2:1]access from el2 or el3
0read/write1read-only
[0018]
表1
[0019]
本发明技术方案的进一步改进在于:保护页的大小通过页表转换的方式映射得到,保护页的大小为4kb。
[0020]
本发明技术方案的进一步改进在于:arm64支持地址转换的颗粒度分为别4kb、16kb、64kb,通过ttbr0_el2寄存器设置jailhouse的页表颗粒度为4kb。
[0021]
本发明技术方案的进一步改进在于:保护页位于每个percpu数据的中间或末端。
[0022]
由于采用了上述技术方案,本发明取得的有益效果是:本发明是在percpu数据之间加入保护页从而起到栈越界时的监测,由于加入的保护页属性是只读,所以栈一旦发生越界就会发生异常。通过异常向量表处理函数中判断sp指针是否处在保护页范围内来判断是否产生栈越界。
附图说明
[0023]
图1为本发明中jailhouse中的正常使用状态一,当前使用的栈大小并没有超出percpu栈的4kb大小。
[0024]
图2为本发明中jailhouse中的正常使用状态二,当前使用的栈大小超过percpu栈的4kb大小;
[0025]
图3为本发明的示意图;
[0026]
图4为本发明保护页的页表转换过程图一;
[0027]
图5为本发明保护页的页表转换过程图二;
[0028]
图6为本发明中arm64的4kb页表转换图。
具体实施方式
[0029]
下面结合实施例对本发明做进一步详细说明。
[0030]
由于percpu数据在内存中的属性是可读可写,并且percpu1的数据和percpu2的数据是连续的,栈的越界势必会踩写和覆盖其他percpu的数据。
[0031]
本发明的思路是:通过在percpu数据之间插入保护页,保护页的大小是4kb,并且保护页的属性是只读。这样在发生栈越界时能cpu就会产生异常。第一时间跳转到异常向量表进行处理,方便了问题的定位。
[0032]
一种jailhouse的堆栈保护的方法,具体步骤如下:
[0033]
s1、在每个percpu数据中插入一个保护页,保护页位于每个percpu数据的中间或末端。如图3所示,保护页位于每个percpu数据的末端,由于percpu数据数量较多,命名为percpu数据1、percpu数据2、percpu数据3
……
,这样处于中间的相邻的两个percpu数据之间夹有一个保护页。
[0034]
s2、设置保护页的属性为只读;
[0035]
步骤s2中,保护页的设置方法为:
[0036]
如图4所示,arm64体系结构下操作系统访问的都是虚拟地址,虚拟地址通过页表转换成物理地址。
[0037]
保护页的大小也是通过页表转换的方式进行映射,arm64支持地址转换的颗粒度分为别4kb、16kb、64kb。可以通过设置ttbr0_el2寄存器设置jailhouse的页表颗粒度为4kb,如图5所示。
[0038]
arm64的4kb页表转换通过4级页表转换,4kb页表的转换方式如图6所示。最终,arm64的l3页表格式如下:
[0039][0040]
arm64(arm 64位cpu)的特权级别包括el0状态、el1状态、el2状态、el3状态,jailhouse是运行在el2状态;在arm64的l3页表中,在低位属性中数据访问属性占据bit6和bit7两位,bit6和bit7两位对应ap[2:1],所以ap[2:1]属性表示了在el2状态和el3状态下的访问权限,也即是可读属性还是可写属性。鉴于jailhouse运行在el2状态,属于ap[2:1]的管辖范围,所以利用ap[2:1]属性,使保护页的页表项中ap[2:1]置1后,保护页的属性就会变成只读,如下表1所示:
[0041]
ap[2:1]access from el2 or el30read/write(读/写)1read-only(只读)
[0042]
表1
[0043]
在保护页的属性设置好以后,执行步骤s3:
[0044]
s3、在堆栈的异常向量表的异常处理函数中加入sp栈指针的判断,如果sp栈指针在保护页的范围内,则发生异常是由于栈越界导致,反之则不是。
[0045]
本发明是在percpu数据之间加入保护页从而起到栈越界时的监测,由于加入的保护页属性是只读,所以栈一旦发生越界就会发生异常,通过异常向量表处理函数中判断sp指针是否处在保护页范围内来判断是否产生栈越界。本发明的方案,思路简洁,便于操作执行,能够在percpu的栈在超出4kb大小时,第一时间产生异常,从异常处理中定位到栈越界的问题。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献