C 调用进程的扫描内存

C 调用进程的扫描内存,c,linux,C,Linux,我必须用C语言扫描调用进程的内存空间。这是做作业用的。我的问题是我不完全理解虚拟内存寻址 我通过尝试读取和写入内存地址来扫描内存空间。我不能使用proc文件或任何其他方法 所以我的问题是设置指针 据我所知,“用户模式空间”从地址0x0开始,但是,如果我将函数的起点设置为0x0,那么我不是在扫描当前进程的地址空间吗?您建议如何调整指针(如果有的话)来寻址父进程地址空间 编辑:好的,很抱歉造成混乱,我感谢您的帮助。我们不能使用proc文件系统,因为该任务旨在让我们了解信号 所以,基本上,我将尝试读取

我必须用C语言扫描调用进程的内存空间。这是做作业用的。我的问题是我不完全理解虚拟内存寻址

我通过尝试读取和写入内存地址来扫描内存空间。我不能使用proc文件或任何其他方法

所以我的问题是设置指针

据我所知,“用户模式空间”从地址0x0开始,但是,如果我将函数的起点设置为0x0,那么我不是在扫描当前进程的地址空间吗?您建议如何调整指针(如果有的话)来寻址父进程地址空间

编辑:好的,很抱歉造成混乱,我感谢您的帮助。我们不能使用proc文件系统,因为该任务旨在让我们了解信号

所以,基本上,我将尝试读取然后写入内存每页中的地址,以测试它是
R
RW
还是不可访问。为了看我是否成功,我将倾听某些信号——我还不知道该怎么做。我将创建一个结构链表来表示内存的可访问性。该程序将编译为32位程序

关于父进程和子进程:确切的文本状态

调用时,该函数将扫描调用进程的整个内存区域

也许我在子进程和父进程的交互方面弄错了,因为我们在类中已经讨论了这个(fork函数等),所以我假设我的函数将扫描父进程。我想请教授澄清一下


所以,从这张图片来看,我将从0x0开始

这比乍一看要难一点。在Linux中,每个进程都有自己的内存空间。使用任意内存地址只能指向此进程的内存空间。然而,有一些机制允许一个进程访问另一个进程的内存区域。某些Linux函数允许此共享内存功能。例如,看一看
它给出了在Linux下使用
shmget
shmctl
和其他系统调用使用共享内存的一些示例。您还可以搜索
mmap
系统调用,该调用用于将文件映射到进程的内存中,但也可用于访问另一个进程的内存。

这比乍一看要困难一些。在Linux中,每个进程都有自己的内存空间。使用任意内存地址只能指向此进程的内存空间。然而,有一些机制允许一个进程访问另一个进程的内存区域。某些Linux函数允许此共享内存功能。例如,看一看 它给出了在Linux下使用
shmget
shmctl
和其他系统调用使用共享内存的一些示例。您还可以搜索
mmap
系统调用,该调用用于将文件映射到进程内存,但也可用于访问另一进程的内存。

您可以从程序中读取
/proc/self/maps
文件。首先在终端中尝试以下两个命令

 cat /proc/self/maps
 cat /proc/$$/maps
(至少要了解地址空间是什么)

然后阅读,当然还有关于、、、的维基页面

如果要在两个进程之间共享内存,请先读取

如果不能使用<代码> /PRO/</代码>(很遗憾),请考虑

您还可以不可移植地尝试从某个地址读取(或者使用
volatile int*
将相同的值重写到)并捕获
SIGSEGV
信号(在信号处理程序中使用a),然后以二分法循环(以4KB的倍数)从某个正常的起始和结束地址执行此操作(当然不是从0开始,但可能是从
(void*)0x10000开始,直到
(void*)0xffffff600000为止)
看

您还可以使用Linux(GNULIBC)特定的

此外,您还可以研究和读取自己的可执行文件。通常,它是
/proc/self/exe
(一个符号链接),但您应该能够从
主文件的
argv[0]
中获取它(可能按照惯例,您的程序应该以其完整路径名启动)

如果您的老师允许,请注意并禁用它

顺便说一句,我想不出你的老师对你的期望是什么。

你可以从你的程序中读取
/proc/self/maps
文件。在终端中首先尝试以下两个命令

 cat /proc/self/maps
 cat /proc/$$/maps
(至少要了解地址空间是什么)

然后阅读,当然还有关于、、、的维基页面

如果要在两个进程之间共享内存,请先读取

如果不能使用<代码> /PRO/</代码>(很遗憾),请考虑

您还可以不可移植地尝试从某个地址读取(或者使用
volatile int*
将相同的值重写到)并捕获
SIGSEGV
信号(在信号处理程序中使用a),然后以二分法循环(以4KB的倍数)从某个正常的起始和结束地址执行此操作(当然不是从0开始,但可能是从
(void*)0x10000开始,直到
(void*)0xffffff600000为止)
看

您还可以使用Linux(GNULIBC)特定的

此外,您还可以研究和读取自己的可执行文件。通常,它是
/proc/self/exe
(一个符号链接),但您应该能够从
主文件的
argv[0]
中获取它(可能按照惯例,您的程序应该以其完整路径名启动)

如果您的老师允许,请注意并禁用它

另外,我不能用菲古语