我正在为 Linux 编写一个非常简单的进程加载器。我正在加载的可执行文件已经编译,并且我知道每个可执行文件在内存中的位置。我尝试的第一种方法是mmap()
手动将每个代码或数据部分放在正确的位置,例如
mmap(addr, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0)
除非我删除 MAP_FIXED 标志,否则会出现段错误,因为似乎一个块的地址与内存中已经存在的东西冲突,甚至可能与加载程序本身冲突;该地址0x401000
似乎是有问题的地址。
我什至不确定从哪里开始。有朋友建议虚拟化内存访问操作;我不确定我会为此采取什么样的性能打击,我也不知道它是如何完成的,但它可能是一种选择。我真正想做的是创建一个“空”进程,就它而言,它会完全运行内存,因此在我想要它之前不会将任何内容加载到用户空间中。“空”过程的整个概念可能毫无意义,但它是描述我想要什么的最佳方式。我非常渴望一些可能对我有帮助的参考资料或示例。