c - 为什么 proc/self/maps 没有正确显示映射

标签 c linux gcc x86-64

当我运行下面的代码时,

int x[4096];
int *y;
int *m;

void main()
{
    y = (int*)malloc( 4096 * sizeof(int) );
    m = (int*)mmap( 0, 4096 * sizeof(int), PROT_READ | PROT_WRITE, 
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 );

    printf( "x = %p, y = %p, m = %p\n\n", x, y, m );

    system( "cat /proc/self/maps" );
}

我得到以下输出,

x = 0x601060, y = 0x606010, m = 0x7ffff7ff5000

00400000-0040b000 r-xp 00000000 08:01 655382                             /bin/cat
0060a000-0060b000 r--p 0000a000 08:01 655382                             /bin/cat
0060b000-0060c000 rw-p 0000b000 08:01 655382                             /bin/cat
0060c000-0062d000 rw-p 00000000 00:00 0                                  [heap]
7ffff77b5000-7ffff7a59000 r--p 00000000 08:01 395618                     /usr/lib/locale/locale-archive
7ffff7a59000-7ffff7bd3000 r-xp 00000000 08:01 1062643                    /lib/libc-2.12.1.so
7ffff7bd3000-7ffff7dd2000 ---p 0017a000 08:01 1062643                    /lib/libc-2.12.1.so
7ffff7dd2000-7ffff7dd6000 r--p 00179000 08:01 1062643                    /lib/libc-2.12.1.so
7ffff7dd6000-7ffff7dd7000 rw-p 0017d000 08:01 1062643                    /lib/libc-2.12.1.so
7ffff7dd7000-7ffff7ddc000 rw-p 00000000 00:00 0 
7ffff7ddc000-7ffff7dfc000 r-xp 00000000 08:01 1062651                    /lib/ld-2.12.1.so
7ffff7fd9000-7ffff7fdc000 rw-p 00000000 00:00 0 
7ffff7ff9000-7ffff7ffb000 rw-p 00000000 00:00 0 
7ffff7ffb000-7ffff7ffc000 r-xp 00000000 00:00 0                          [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00020000 08:01 1062651                    /lib/ld-2.12.1.so
7ffff7ffd000-7ffff7ffe000 rw-p 00021000 08:01 1062651                    /lib/ld-2.12.1.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0 
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

现在,我的问题是,为什么分配为 malloc、mmap 或全局数据的内存不在 /proc/self/maps 显示的任何映射范围内?

最佳答案

当您运行 system( "cat/proc/self/maps"); 时,您会显示 cat 进程的映射。您可以在第一行输出中看到映射的是 cat 可执行文件:

00400000-0040b000 r-xp 00000000 08:01 655382                             /bin/cat

您需要执行snprintf(..., "cat/proc/%d/maps", getpid());,或者打开/proc/self/pid 文件并读取它你自己在你自己的过程中。

关于c - 为什么 proc/self/maps 没有正确显示映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8864382/

相关文章:

c - unlinkat() C 中的目录

c++ - 使用 Makefile、源代码生成器并使用 gcc 生成依赖项

c - 扫描有长度限制的字符串

c - 有针对 8086 的 C 编译器吗?

linux - Linux 中的自定义协议(protocol)?

linux - Docker-在单个主机上组合多个实例

c - 在代码块中使用 gcc 编译时使用命令行参数

gcc - 链接库的静态版本而不是动态版本

java - 在 C/Java 项目中,管理构建的合适方法是什么?

c - 在 c 中插入和编辑注释