我正在使用C ++开发Linux平台的进程加载器;这只是一个娱乐项目。基本上,我想手动将可执行文件的所有部分加载到内存中,然后执行它。
我在一周前问了一个相关但更具体的问题here。但是,在做了更多阅读之后,我意识到在我学习如何实际创建过程之前,内存映射将无关紧要。所以我的问题是,有没有办法在Linux上创建一个“空白”的新进程,它有自己的虚拟地址空间(我可以访问它来加载代码和数据)?
即使是关于流程加载器开发的一般资源也很有用,因为我还没有找到任何。
答案 0 :(得分:3)
如果您有兴趣了解Linux进程加载器在您要求exec()
某些内容时在幕后做什么,请抓取内核源代码的副本并查看fs/exec.c
内{ {1}}。
ELF处理程序本身,如果你正在尝试运行ELF二进制文件,最终会被调用,它位于do_execve_common()
。特别是,fs/binfmt_elf.c
执行实际加载,给定load_elf_binary()
包含从磁盘加载过程映像的必要信息。
观察到Linux支持的二进制格式有许多struct linux_binprm
个文件;如果您有自定义二进制格式,那么可以原则上编写自己的格式并将其作为内核模块提供。进程加载的内部对用户模式代码是不透明的(理所当然:如果没有,则会存在严重的安全漏洞。)
答案 1 :(得分:1)
您可以使用fork()函数创建一个新进程,该进程将创建父进程的副本,然后使用exec系列函数之一,您可以加载可执行文件并执行它。