Чтение / запись кучи
Может ли быть прочитано собственное пространство кучи? Может ли программное обеспечение самостоятельно изменяться в памяти?
Я пишу код, чтобы показать тему,
я читаю собственный код в памяти? как (если возможно) написать это и изменить инструкцию во время выполнения?
#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 ответа
Вы можете читать и писать кучи на свой страх и риск.
Самомодифицирующийся код может быть полезен в ограниченных небольших средах, таких как небольшие встроенные системы. Однако современные процессоры для настольных компьютеров или серверов вообще не любят самоизменяющийся код, потому что он нарушает кэширование инструкций, предварительную выборку и конвейерную обработку. Один анекдот: TI-Scheme работала невероятно быстро на 386 процессорах. Он использовал самоизменяющийся код. В 486 процессорах введено кеширование команд, а TI-схема потерпела крах.
Память обычно делится на постоянную память команд и память для записи данных, которая может быть или не быть исполняемой. Если ваше приложение хочет написать, а затем запустить свой собственный код (например, JIT-компилятор), вам, вероятно, потребуется использовать какой-то конкретный операционный метод для получения необходимого блока памяти. Да, вы можете прочитать свои собственные инструкции, но я очень сомневаюсь, что вы сможете изменить их.