0

可以读取自己的堆空间吗?软件可以在内存中自行修改吗?

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

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

#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);
}
4

2 回答 2

1

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

于 2010-08-10T13:11:35.150 回答
1

您可以自行承担读取和写入堆空间的风险。

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

于 2010-08-10T13:23:23.360 回答