Linux内核设计与实现-进程内存使用
int main(int argc, char *argv[])
{
while (1) {
};
return 0;
}
用pmap 进程号 -d 来查看进程
Address Kbytes Mode Offset Device Mapping
0000000000400000 4 r-x-- 0000000000000000 4f9:2c566 a.out
0000000000500000 4 rw--- 0000000000000000 4f9:2c566 a.out
000000302ad00000 84 r-x-- 0000000000000000 008:00002 ld-2.3.4.so
000000302ae14000 8 rw--- 0000000000014000 008:00002 ld-2.3.4.so
000000302af00000 1196 r-x-- 0000000000000000 008:00002 libc-2.3.4.so
000000302b02b000 1020 ----- 000000000012b000 008:00002 libc-2.3.4.so
000000302b12a000 12 r---- 000000000012a000 008:00002 libc-2.3.4.so
000000302b12d000 12 rw--- 000000000012d000 008:00002 libc-2.3.4.so
000000302b130000 16 rw--- 000000302b130000 000:00000 [ anon ]
00002ae829a73000 4 rw--- 00002ae829a73000 000:00000 [ anon ]
00002ae829a87000 8 rw--- 00002ae829a87000 000:00000 [ anon ]
00007fff81022000 84 rw--- 00007fff81022000 000:00000 [ stack ]
ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ]
mapped: 2456K writeable/private: 136K shared: 0K
这里的顺序就是进程的地址空间中各个区域的顺序 第一行 a.out 的代码段 执行权限是r-x 第二行 a.out 的数据段 执行权限是rw- 然后是mapped file ld的代码段 执行权限r-x ld的数据段 执行权限rw- libc库代码段 执行权限r-w libc库这个我也不太清楚 libc库.... libc库的数据段 执行权限rw-
接下来有三行的anon, 分别是a.out, ld, libc 的BSS段, BSS段映射文件的内存区域的设备标志为000:00000 这个区域是0页,0页映射的内容全部为零.因为bss段是未初始化的全局变量区,在进程里面未初始化数据区存的都是0.操作系统有写时复制机制,这样子真正有修改的时候,才会从物理内存中获得空间.
该进程全部地址空间2456K, 可写空间136K.不可写区域可以和其他进程共享,所以多个进程都共享libc库,以及内核的代码.所以物理内存里面只需要保存一份libc库的代码节省了大量的空间