为啥没有给另一个进程访问内存位置的权限?

Posted

技术标签:

【中文标题】为啥没有给另一个进程访问内存位置的权限?【英文标题】:Why no access to a memory location is given to another process?为什么没有给另一个进程访问内存位置的权限? 【发布时间】:2014-11-15 22:46:12 【问题描述】:

我有三个 C 代码。在第一个代码 c0.c 中,整数指针 (p) 被动态分配用于保存一个整数值的内存。值 325 分配给此指针变量 (p) 指向的内存。该指针的整数值存储在文件中。在不释放内存的情况下,此指针变量 (p) 被分配一个 NULL 值。然后将整数值再次读入 long 变量 (i),并为指针变量 (p) 分配此变量 (i) 的 (int*) 值。取消引用并打印时,它会打印值 325。代码如下所示。

#include <stdio.h>
#include <stdlib.h>

int main()

  int *p = (int*)malloc(sizeof(int));
  *p = 325;

  FILE *F;
  F = fopen("xxx", "w");
  fprintf(F, "%ld", (long)p);
  fclose(F);

  p = NULL;

  long i;
  F = fopen("xxx", "r");
  fscanf(F, "%ld", &i);
  p = (int*)i;
  fclose(F);

  printf("value stored in read pointer = %d\n", *p);

  return(0);

现在尝试使用两个单独的文件 c1.c 和 c2.c 来做同样的事情。在 c1.c 中,指针 p 被分配内存,值 325 存储在它指向的内存中。指针的整数值存储在文件中,程序执行由 scanf 暂停。在 c2.c 中,指针的整数值被读取并分配给另一个整数指针。该指针变量被取消引用并尝试打印该值。预计输出为 325。因此,当 c1.c 编译并运行并暂停时,c2.c 的已编译可执行文件将运行。它崩溃了。为什么?

c1.c 和 c2.c 如下所示。

c1.c:

#include <stdio.h>
#include <stdlib.h>

int main()

  int *p = (int*)malloc(sizeof(int));
  *p = 325;

  FILE *F;
  F = fopen("xxx", "w");
  fprintf(F, "%ld", (long)p);
  fclose(F);

  int j;
  scanf("%d", &j); // To pause the program and run c2.c executable
  return(0);

c2.c:

#include <stdio.h>
#include <stdlib.h>

int main()

  int *p;
  long i;

  FILE *F;
  F = fopen("xxx", "r");
  fscanf(F, "%ld", &i);
  p = (int*)i;
  fclose(F);

  printf("value stored in read pointer = %d\n", *p);
  return(0);

【问题讨论】:

为了您自己的保护。 独立进程不共享内存。只有使用共享内存才能做到这一点。 不清楚实际问题是什么。 “这不是因为孤立的地址空间”这个答案似乎太微不足道了。 当只有一个程序访问给定的(物理)内存位置时,很难让程序正确;当有多个程序访问给定的内存位置时,它变得更加困难。你必须协调访问,这需要工作。可以这样做,但需要小心并使用旨在使这种“进程间通信”(IPC)成为可能的设施。 【参考方案1】:

所有现代操作系统都使用虚拟内存。在虚拟内存中,每个进程都有自己的虚拟地址空间。虚拟地址空间分为两个不同的区域:用户空间和系统(或内核)空间。

所有进程的系统空间都相同。但是,它在用户模式下是不可写的,并且大多数地址在用户模式下都是不可读取或可执行的。

用户模式地址空间(您可以处理的部分)对于每个进程都是唯一的。一个进程中的地址 1000 通常与另一个进程中的地址 1000 不同。

通常可以创建可由多个进程访问的共享内存区域。但是,这些可以映射到不同的虚拟地址。在共享内存区域中,地址 1000 的更改 在一个进程中可能会在另一个进程中的地址 2000000 处看到。

当您正在读取一个进程写入的地址值并尝试在另一个进程中访问它们时,这些地址无法访问并且正在崩溃。由于不可访问,这些地址尚未在进程的虚拟地址空间中创建。即使它们被创建,它们也不会与您的其他进程中的内存相同。

【讨论】:

【参考方案2】:

您的操作系统将virtual address space 用于process isolation。

【讨论】:

以上是关于为啥没有给另一个进程访问内存位置的权限?的主要内容,如果未能解决你的问题,请参考以下文章

linux进程为啥有用户栈和内核栈,

操作系统之内存管理

在 Windows 中,是不是可以授予另一个进程访问您自己进程内存的一部分的权限?

如何在没有 root 访问权限的情况下在服务器上杀死其他人的 Python 进程?

C#:进程线程应用程序域(AppDomain)与上下文分析

为啥没有产生core 文件