c++ - C++ 中的 Linux 进程加载器

标签 c++ linux process linux-kernel

我正在使用 C++ 为 Linux 平台开发进程加载器;这只是一个娱乐项目。基本上,我想手动将可执行文件的所有部分加载到内存中,然后执行它。

我问了一个相关但更具体的问题 here大约一周前。然而,在阅读更多内容之后,我意识到在我学会如何实际创建进程之前,内存映射是无关紧要的。所以我的问题是,有没有办法在 Linux 上创建一个具有自己的虚拟地址空间(我将能够访问以加载代码和数据)的“空白”新进程?

即使是关于进程加载器开发的一般资源也会很有用,因为我还没有找到任何资源。

最佳答案

如果您有兴趣了解当您要求 Linux 进程加载器执行 exec() 操作时,Linux 进程加载器在幕后真正做了什么,请获取内核源代码的拷贝并查看 fs/exec.c 用于 do_execve_common()

ELF 处理程序本身位于 fs/binfmt_elf.c 中,如果您尝试运行 ELF 二进制文件,它最终会被调用。特别是,load_elf_binary() 执行实际加载,给定 struct linux_binprm 包含从磁盘加载过程镜像的必要信息。

观察Linux支持的二进制格式有很多binfmt_*.c文件;如果您有自定义二进制格式,那么您原则上可以编写自己的二进制格式并将其作为内核模块提供。进程加载的内部结构对于用户模式代码是不透明的(这是理所当然的:如果不这样做,将存在严重的安全漏洞)。

关于c++ - C++ 中的 Linux 进程加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11871040/

相关文章:

c++ - 将成员函数指针作为模板参数传递

c++ - Clang 上的重载运算符歧义,但 GCC 上没有,哪个是正确的?

linux - Bash 将大文件拆分为较小的文件

PHP 在后台运行 FFMPEG,并找出它何时完成

linux - 什么时候在 linux 中打开端口?

linux - 是否可以使用 Linux 实时监控进程的调度方式?

c++ - Bison/Flex Concat 字符 *

c++ - 为什么将 const 指针初始化为 null 时没有警告或错误?

linux - wget 命令在 linux 中工作但在 windows 中不工作

linux - 删除不包含用户拥有的文件的文件和文件夹