WEB开发网
开发学院操作系统Linux/Unix AIX 6 和 POWER 6 中的内存保护存储键(storage k... 阅读

AIX 6 和 POWER 6 中的内存保护存储键(storage keys)

 2008-09-06 08:19:31 来源:WEB开发网   
核心提示: 示例代码的说明: 宏 PERROR 只是删除代码和错误报告,以提高代码的可读性,AIX 6 和 POWER 6 中的内存保护存储键(storage keys)(4), 宏 ROUND_UP 用于计算最近的页面所需的内存大小, 结构 important_data 是我们尝试不受两个不允许的函

示例代码的说明:

宏 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——不应该有大的影响,但对函数调用的影响可能到达数千倍,请尽量减少其使用

运行信号处理函数

仅在出现错误时运行,即影响非常小

上一页  1 2 3 4 

Tags:AIX POWER 内存

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接