这些对齐功能有什么区别?

时间:2014-01-22 18:08:00

标签: c++ c memory-alignment mprotect

我正在写一个自我修改的程序;已经搞定了。我找到了这两个函数,但不确定它们做了什么,我喜欢正确地评论我的代码。

使用getpagesize

获取pagesize
/*
 * Defining variables:
 * func - function in memory I'm using mprotect on
 * offset - the offset in memory
 * ptr - the pointer to the memory
 */

unsigned int offset = (unsigned int)( ((long)func) & (pagesize-1) );
unsigned char * ptr = (unsigned char *) ((long)func & (~(pagesize-1) ) );

我发现offset的函数用于内存对齐检查。我隐约知道他们做了什么,但没有区别?

感谢。

2 个答案:

答案 0 :(得分:4)

假设pagesize是页面的大小,它们使用位掩码来计算指向包含ptr的页面开头的指针(func)和偏移量({{ 1}})在该页面内以字节为单位。

由于offset始终是2的幂,pagesize已设置全部。页面中的偏移量是最后12个(例如)位(12对应于pagesize是4k = 2 ^ 12),因此第一个语句通过使用(pagesize-1)全部清除除最后一个12之外的所有位12个最低有效位的位掩码。

第二行通过清除最后4位来计算指向页面本身的指针;通过使用前一个位掩码的逻辑逆(&),然后使用~,它清除所有其他位。

答案 1 :(得分:0)

(我假设“pagesize”是平台的页面大小,它是2的幂 - 例如在x86上它是0x1000。而且我假设“func”是指向函数的指针,即代码你想改变。)

“offset”包含代码页面的偏移量,而“pthr”包含映射包含代码的内存页面的虚拟地址。 我的猜测是,程序中的某个位置会创建代码页面的新虚拟视图(具有不同的访问权限,特别是写入权限)。假设这个新地址存储在“unsigned char * page2”中。因此,可以通过写入*(page2 + offset)来更改代码。