【问题标题】:What is the difference between these alignment functions?这些对齐功能有什么区别?
【发布时间】:2014-02-12 23:09:20
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: c++ c memory-alignment mprotect


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,为什么是-1?有什么方法可以解释为什么可以从指针中提取位置?
    • 试着在纸上写下这些内容。第 3 页的偏移量 5(二进制 101)(二进制 11)将位于位置 11 0000 0000 0101。 4k 的二进制是01 0000 0000 0000。所以 4k-1 是00 1111 1111 1111。现在我们可以使用它作为一个掩码来与给出00 0000 0000 0101的位置(即5,偏移量)。如果我们反转它,我们会得到...(ones)... 1111 0000 0000 0000 0000,然后我们可以将其与位置进行与运算,得到11 0000 0000 0000,即指向页面的指针。不太清楚“为什么可以从指针中提取位置”是什么意思。指针位置。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 2011-01-10
      • 2013-01-16
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多