我正在编写一个模拟器,我需要将机器代码直接写入内存,然后跳转到(调用)它.我用mmap分配内存,然后将代码写入其中.除了"ret"或"nop"指令之外的任何其他段落.我知道mmap返回没有错误,我已经在一个示例中分离了问题,我把它放在一起来说明问题.
#include <stdio.h>
#include <sys/mman.h>
#include <stdint.h>
int main()
{
uint8_t *data = mmap(NULL, 3 * sizeof(uint8_t), PROT_EXEC|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0), *p;
p = data;
if(data) {
*p++ = 0xb8; //mov $1, %eax
*p++ = 0x01;
*p++ = 0xC3; //ret
} else
perror("mmap");
uint8_t (*fp)();
fp = (void*) (data);
printf("%u\n",(uint8_t) fp());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
那个例子产生了问题.救命?
编辑:我应该提到我在Linux 2.6,x86上.