微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

控制另一个进程的内存映射

在某种程度上可以改变Linux中另一个进程的内存映射吗? 相反,也就是说,只能通过在调用mmap的进程中运行的代码来控制它。

我问的原因是因为我想能够build立一个非常自定义的内存映射的进程,而不能使用共享库甚至是VDSO,我没有看到任何方式来做到这一点这个过程本身并不涉及基本写自己的libc来处理系统调用等等。 (即使我是静态链接libc ,是不是会尝试使用vDSO?)

Linux映射虚拟内存范围到现有的虚拟内存范围?

Linux内核,用户空间缓冲区,做access_ok并等待创build竞争条件?

自动恢复虚拟内存分配

内核内存在Windows操作系统中包含什么?

Linux:页面错误和networking文件系统

mmap映射的内存由fork保存,但是被exec系统的系统调用擦除,因此这不能被经典的序列fork ,setup东西, exec 。

一个简单的解决方案是使用LD_PRELOAD钩子。 让我们把这段代码放在add_mmap.c 。

#include <sys/mman.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> void add_mmap(void) __attribute__((constructor)); void add_mmap(void) { int fd; void *addr; printf("calling mmap() before main...n"); fd = open("/etc/passwd",O_RDONLY); printf("fd=%dn",fd); /* map the first 100 bytes of the file to an address chosen by the kernel */ addr = mmap(0,100,PROT_READ,MAP_SHARED,fd,0); printf("addr=%llxn",(long long unsigned)addr); }

然后,将其构建为一个动态库:

gcc -Wall -g -fPIC -shared -o add_mmap.so add_mmap.c

最后运行一些现有的程序:

$ LD_PRELOAD=./add_mmap.so /bin/cat calling mmap() before main... fd=3 addr=7fe4916f8000

我们可以在cat运行之前检查映射是否已经建立并保存:

$ cat /proc/27967/maps ... 7f2f7f2d0000-7f2f7f2d1000 r--s 00000000 09:00 1056387 /etc/passwd ...

编辑

我只在这里展示如何在程序启动之前添加内存映射,但是我的示例可以很容易地扩展为在程序中透明地注入一个“内存管理器”线程。 这个线程将通过一个像socket这样的IPC机制来接收命令,并相应地操纵映射。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐