如何在Linux虚拟内存系统中尝试访问其他进程的内存

Hao*_*hen 3 linux virtual-memory

当我在Linux中学习虚拟内存系统时,我感到困惑.

由于每个进程都有自己的虚拟地址空间和自己的页表,将其虚拟地址转换为物理地址(我是对吗?),它怎么可能试图错误地访问其他进程的内存?页面表中应该没有条目,对吧?

Chr*_*odd 12

linux进程可以通过特殊文件/ proc/pid/mem 访问另一个进程的内存.例如,这是一个小程序调用poke:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

int main(int ac, char **av) {
    char    name[64];
    int             fd;
    if (ac != 3) {
        fprintf(stderr, "usage: %s pid address value\n", av[1]);
        exit(1); }
    sprintf(name, "/proc/%.10s/mem", av[1]);
    if ((fd = open(name, O_WRONLY)) < 0) {
        fprintf(stderr, "Can't access pid %s", av[1]);
        perror(":");
        exit(1); }
    lseek(fd, strtol(av[2], 0, 0), SEEK_SET);
    if (write(fd, av[3], strlen(av[3])) < 0)
        perror("write");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它会将一个字符串写入另一个进程的内存(可能导致它崩溃)......

  • 请注意,仅当运行此代码的进程具有对/ proc/pid/mem的写访问权时,此方法才有效.在我的系统上,/ proc及其内容由root拥有并标记为只读,因此大多数进程都无法执行此操作.基本的操作系统安全性 - 以及健壮性 - 要求除非具有特定权限或操作系统级权限,否则进程无法相互混淆. (2认同)

Dav*_*rtz 1

除非特别安排,否则一个进程可以访问的虚拟地址不应修改分配给另一进程的内存。