总结win7平台的dep机制-由phoneme jit功能异常说起

        最近在编译j2me的开源工程phoneme,编译出来的虚拟机在xp中运行良好,到了win7就出现问题。经过调试发现,虚拟机在开启jit的时候会把动态编译的代码放到堆中执行,而dep开启的情况下是不允许这么做的,这样就引发了access violation异常。xp默认是关闭dep的,这个问题也就一直没有发现。

        dep全名就是data execution protection,即数据执行保护。在支持dep的cpu中,内存页表增加了一个NX(not execution)位,NX位置1的情况下这个页面的内容是不能被执行的,否则会发生异常。而jit就是把频繁使用的java代码动态编译成本地代码放在堆上执行,这就是问题的原因。

        经过网上搜索,得知windows系统有四种dep配置:alwayson(永远开启),alwaysoff(永远关闭),optin(列表内开启),optout(列表内禁用),这四种配置具体有以下特点:

        1.alwayson,无论程序本身有没有设置NX位,所有的程序都开启dep.

        2. alwaysoff,无所程序本身有没有设置NX位,所有程序都禁用dep.

        3. optin,仅为基本的系统服务和程序开启dep,对于非系统程序,根据程序的NX位来决定开启还是禁用。

        4. optout,列表内的程序禁用,表外的开启。根据我的使用经历发现,列表内的程序也只能是没有设置NX位的程序,设置了就加不进来了。

        在win7下,我们可以使用 计算机-属性-高级系统设置-性能-数据执行保护 进行optin和optout配置选项的配置,默认是optin配置,而对于alwayson和alwaysoff配置选项就只能用命令来设置了,命令如下:

         bcdedit /set nx alwayson或者bcdedit /set nx alwaysoff。

        上面提到程序本身的NX位置,查看windows的PE文件格式可以知道,文件头有个IMAGE_DLLCHARACTERISTICS_NX_COMPAT标志位,也就是NX。对于我们自己开发的程序,如果是visual studio工程的话,可以在 属性-连接器-高级-数据执行保护中设置。值得注意的是,从vs 2010开始,dep链接选项是默认开启的,以前版本的vs都是默认关闭。如果使用命令行方式链接程序,可以用/NXCOMPAT选项。

            如果不是自己的程序要修改起来也不难,想简单点就找个PE修改工具改改,要代码实现那就得自己去熟悉PE格式了。        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值