进程的虚拟内存中的开始和结束地址

时间:2013-09-20 04:45:45

标签: c linux memory-management

我有一个我写过的C程序,我正在尝试制作它的记忆图。

如何在屏幕上打印过程环境的起始地址和结束地址(在虚拟内存中)。

该程序始终将在Linux上运行,不确定这是否有所作为,但它不需要任何类型的可移植性。

我正在寻找一些最好只给我一个开头和结尾的十六进制地址的东西。

3 个答案:

答案 0 :(得分:2)

在C编程中看一下这个例子。

user@linux:~$ cat hello.c 
#include<stdio.h>

int main()
{
 printf("Hello World\n");
 getchar();
}
user@linux:~$ gcc hello.c -o hello
user@linux:~$ ./hello 
Hello World

打开另一个控制台以找出进程ID(pid)。 运行ps命令如下;使用您的计划名称更改hello

在这种情况下,进程ID(pid)为2011

user@linux:~$ ps -ef | grep hello | grep -v grep
user      2011  1864  0 17:21 pts/2    00:00:00 ./hello
user@linux:~$ 

然后,使用/proc/[pid]/maps命令

检查cat文件
user@linux:~$ cat /proc/2011/maps | grep stack
bffeb000-c0000000 rw-p 00000000 00:00 0          [stack]
user@linux:~$ 

或者,您也可以使用pmap命令

user@linux:~$ pmap 2011 | grep stack
bffeb000     84K rw---    [ stack ]
user@linux:~$ 

在这两种情况下,我们都可以看到堆栈从地址bffeb000

开始

答案 1 :(得分:1)

根据您的要求,如果您知道其PID,我认为您可以获取特定进程的内存映射。使用命令“ pmap ”获取更多信息http://linux.die.net/man/1/pmap

&安培;如果你想在你的程序中打印它然后尝试在函数 getpid()的帮助下获得pid; 然后使用 system() call 执行pmap命令。

答案 2 :(得分:0)

您只需打印出/proc/[PID]/maps文件的内容,其中[PID]是您的流程的流程标识符的值(调用getpid()以找出此值是什么)。