AIX 6 和 POWER 6 中的内存保护存储键(storage keys)
2008-09-06 08:19:31 来源:WEB开发网示例代码的说明:
宏 PERROR 只是删除代码和错误报告,以提高代码的可读性。
宏 ROUND_UP 用于计算最近的页面所需的内存大小。
结构 important_data 是我们尝试不受两个不允许的函数 untrusted_reader() 和 untrusted_writer() 影响的数据。
函数 sighandler() 捕获内存保护违规情况,但此处将返回到代码,将导致生成代码转储,不过此函数说明了如何捕获错误。
希望其他代码、注释和这篇文章能够对您有所帮助。
在其他 AIX 和硬件上使用存储键
如果您尝试使用其他 AIX 版本或非 POWER 6 硬件上的存储键,会怎样呢?
AIX 5.2 ML9 ukeyset_init() 返回零键
AIX 5.3 ML6 & AIX 6.1 ukeyset_init() 返回以下信息:
在 POWER6 上会返回键数量
非 POWER6 硬件会返回错误
其他未实现的 ML 版本——进程将不会启动
以将“键访问”函数放入可加载模块中,然后在运行之后确定存储键是否可用,接着引入正确的模板(即,一个模块使用真正的键,而其他使用非操作函数)来处理。
虚拟键和需要注意的地方
POWER6 处理器仅具有有限数量的存储键,对于用户程序,目前只有两个键可用。键之一是普通内存访问键,可以使用另一个键进行保护工作。这些键功能考虑了在以后的 POWER6 或后续处理器上使用更多键的情况。为了使用这两个键系统,您需要制定计划和规定模式,以便重新编译(或在应用程序启动时采用更为巧妙的方法)并将使用的键移动到要检查内存错误的模块中。
另外还应该注意以下方面
不能保护内存映射文件。
CPU 会在从内存读取程序指令时忽略存储键保护,因此无法保护代码,但代码通常都已经设置为只读。
受保护的内存必须采用页面对齐,请参见上面的示例,以了解如何通过从 vmgetinfo()、ROUND_UP 宏获取的页面大小使用 posix_memalign() 请求内存对齐来确保这一点。
需要对数据进行规划,以进行页面对齐,即使变量保存在共享内存或使用 malloc 分配的内存中。
保护恢复
您的程序出错了,您收到一个 SIGSEGV 信号,接下来怎样呢?我认为有三种策略:
可以使用调试程序命令 dbx 来确定错误在哪里。
可以捕获信号,并使用 setjmp()/longjmp() 回到出错的函数之前的代码。或许可以警告用户代码出错了,然后继续。
可以捕获信号,并使用 setjmp()/longjmp() 回到出错的函数之前的代码。然后可以记录错误日志中的问题,去掉内存保护功能,然后继续调用有问题的函数。这将使系统继续运行,但问题仍然存在。如果此代码是已经运行了很长时间的代码,则可以暂时避开这个问题,稍后进行代码修复,但这样有风险。
性能
存储键有什么性能影响:
使用 ukey_protect() 在内存页面上保护内存
这可能是一个开销很大的系统调用——根据页面数量而定,因为将要修改每个虚拟内存数据结构(页表)。
只能进行一次这样的操作。
使用 ukset_activate() 激活键,以在进程上设置使用的键
使用简单的系统调用设置处理器 ASR——不应该有大的影响,但对函数调用的影响可能到达数千倍,请尽量减少其使用
运行信号处理函数
仅在出现错误时运行,即影响非常小
- ››AIX 下 FTP 服务配置方法
- ››Powerpoint文档美化技巧
- ››PowerPoint2003上嵌入Excel Sheet
- ››PowerPoint 2010:图表技术与演示文稿的完美融合
- ››PowerPoint 2010:让幻灯片中的视频全屏播放
- ››PowerPoint 2010:小小指针的大用途
- ››PowerPoint 2010:图片版式效果让人耳目一新
- ››PowerPoint 2010:流程展现一目了然
- ››PowerPoint 2010:不可不知的放映快捷键
- ››PowerPoint 2010:对企业的幻灯片资源进行统一管理...
- ››PowerPoint 2010:让公司徽标出现在所有幻灯片上
- ››PowerPoint 2010:快速重用之前文档中的幻灯片
更多精彩
赞助商链接