我是靠谱客的博主 独特灯泡,最近开发中收集的这篇文章主要介绍linux进程内存构成,Linux下进程的内存结构,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

描述

Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该地址空间是大小为4GB的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可以使用比实际物理内存更大的地址空间。

4GB的进程地址空间会被分成两个部分:用户空间与内核空间。用户地址空间是从0到3GB(0xC0000000),内核地址空间占据3GB到4GB。用户进程在通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。只有用户进程使用系统调用(代表用户进程在内核态执行)时可以访问到内核空间。每当进程切换时,用户空间就会跟着变化;而内核空间由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。每个进程的用户空间都是完全独立、互不相干的。进程的虚拟内存地址空间如图3.3所示,其中用户空间包括以下几个功能区域。

● 只读段:包含程序代码(.init和.text)和只读数据(.rodata)。

● 数据段:存放的是全局变量和静态变量。其中可读可写数据段(.data)存放已初始化的全局变量和静态变量,BSS数据段(.bss)存放未初始化的全局变量和静态变量。

● 堆:由系统自动分配释放,存放函数的参数值、局部变量的值、返回地址等。

● 堆栈:存放动态分配的数据,一般由程序员动态分配和释放。若程序员不释放,程序结束时可能由操作系统回收。

● 共享库的内存映射区域:这是Linux动态链接器和其他共享库代码的映射区域。

fe85c1eb48c97a9ed73a12d52a9ccc2d.png

由于在Linux系统中每一个进程都会有/proc文件系统下与之对应的一个目录(如将init进程的相关信息在/proc/1目录下的文件中描述),因此通过proc文件系统可以查看某个进程的地址空间的映射情况。例如,运行一个应用程序(示例中的可运行程序是在/home/david/project/目录下的test文件),如果它的进程号为13703,则输入“cat /proc/13703/maps”命令,可以查看该进程的内存映射情况,其结果如下:

$ cat /proc/13703/maps

/* 只读段:代码段、只读数据段 */

08048000-08049000 r-xp 00000000 08:01 876817 /home/david/project/test

08049000-0804a000 r--p 00000000 08:01 876817 /home/david/project/test

/* 可读写数据段 */

0804a000-0804b000 rw-p 00001000 08:01 876817 /home/david/project/test

0804b000-0804c000 rw-p 0804b000 00:00 0

08502000-08523000 rw-p 08502000 00:00 0 [heap] /* 堆 */

b7dec000-b7ded000 rw-p b7dec000 00:00 0

/* 动态共享库 */

b7ded000-b7f45000 r-xp 00000000 08:01 541691

/lib/tls/i686/cmov/libc-2.8.90.so

b7f45000-b7f47000 r--p 00158000 08:01 541691

/lib/tls/i686/cmov/libc-2.8.90.so

b7f47000-b7f48000 rw-p 0015a000 08:01 541691

/lib/tls/i686/cmov/libc-2.8.90.so

b7f48000-b7f4b000 rw-p b7f48000 00:00 0

b7f57000-b7f5a000 rw-p b7f57000 00:00 0

/* 动态链接器 */

b7f5a000-b7f74000 r-xp 00000000 08:01 524307 /lib/ld-2.8.90.so

b7f74000-b7f75000 r-xp b7f74000 00:00 0 [vdso]

b7f75000-b7f76000 r--p 0001a000 08:01 524307 /lib/ld-2.8.90.so

b7f76000-b7f77000 rw-p 0001b000 08:01 524307 /lib/ld-2.8.90.so

bff61000-bff76000 rw-p bffeb000 00:00 0 [stack] /* 堆栈 */

打开APP阅读更多精彩内容

点击阅读全文

最后

以上就是独特灯泡为你收集整理的linux进程内存构成,Linux下进程的内存结构的全部内容,希望文章能够帮你解决linux进程内存构成,Linux下进程的内存结构所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部