我正在编写一个自我修改程序;已经开始运作了。我找到了这两个函数,但不确定它们到底能做什么,我想适当地注释我的代码。

pagesize是使用getpagesize获得的

/*
 * 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) ) );

我发现偏移量的功能用于内存对齐检查。我隐约知道他们做了什么,但没有区别吗?

谢谢。

最佳答案

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

由于pagesize始终是2的幂,因此(pagesize-1)设置了全1。页面内的偏移量是最后12位(例如)(12与pagesize对应为4k = 2 ^ 12),因此第一条语句通过使用&清除所有位(除最后12位外,所有位掩码至少为12)有效位。

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

关于c++ - 这些对齐功能有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21290618/

10-14 10:21