读/写自堆

时间:2010-08-10 12:29:55

标签: c pointers metaprogramming heap self-modifying

可以自己堆空间吗?软件可以在内存中自我修改吗?

我写了一些代码来展示主题,

我在内存中阅读自己的代码吗? 如何(如果可能的话)编写它并在运行时更改指令?

#include<stdio.h>
#include<stdint.h>

volatile int addressBase;
uint8_t read(int address);


int main(void) {

    printf("Helium word");

    addressBase=(int)&main;        
    printf("[%X]", read( 0 ));         
    getchar();

    return 0;
}


uint8_t read(int address)
{

       const uint8_t *addr;                        
       addr=(const unsigned char *)(addressBase+(int)address);
       return (*addr);
}

2 个答案:

答案 0 :(得分:1)

存储器通常分为只读指令存储器和可写数据存储器,可以执行也可以不执行。如果应用程序想要编写然后运行自己的代码(如JIT编译器),则可能需要使用一些特定于操作的方法来获取必要的内存块。所以是的,您可以阅读自己的说明,但我非常怀疑您是否能够修改它们。

答案 1 :(得分:1)

您可以自行承担读写堆空间的费用。

在小型嵌入式系统等受限制的小型环境中,自我修改代码可能是一种有用的技巧。然而,现代桌面或服务器CPU根本不喜欢自修改代码,因为它破坏了指令缓存,预取和流水线操作。一则轶事:TI-Scheme在386个CPU上跑得非常快。它使用自修改代码。 486个CPU引入了指令缓存,TI-Scheme崩溃了。