免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5344 | 回复: 10

关于linux进程与虚拟内存的关系 [复制链接]

论坛徽章:
0
发表于 2012-02-21 23:54 |显示全部楼层
5可用积分
linux内核实现中进程的是不是也被分成了若干段,进程的每个段是如何映射到虚拟内存中的,如果想查找进程的代码段如何查找

最佳答案

查看完整内容

用工具readelf

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2012-02-21 23:54 |显示全部楼层
用工具readelf
  1. -laptop:~/work/test$ readelf -S a.out
  2. There are 29 section headers, starting at offset 0x1170:

  3. Section Headers:
  4.   [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  5.   [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  6.   [ 1] .interp           PROGBITS        08048134 000134 000013 00   A  0   0  1
  7.   [ 2] .note.ABI-tag     NOTE            08048148 000148 000020 00   A  0   0  4
  8.   [ 3] .note.gnu.build-i NOTE            08048168 000168 000024 00   A  0   0  4
  9.   [ 4] .gnu.hash         GNU_HASH        0804818c 00018c 000020 04   A  5   0  4
  10.   [ 5] .dynsym           DYNSYM          080481ac 0001ac 000050 10   A  6   1  4
  11.   [ 6] .dynstr           STRTAB          080481fc 0001fc 00004c 00   A  0   0  1
  12.   [ 7] .gnu.version      VERSYM          08048248 000248 00000a 02   A  5   0  2
  13.   [ 8] .gnu.version_r    VERNEED         08048254 000254 000020 00   A  6   1  4
  14.   [ 9] .rel.dyn          REL             08048274 000274 000008 08   A  5   0  4
  15.   [10] .rel.plt          REL             0804827c 00027c 000018 08   A  5  12  4
  16.   [11] .init             PROGBITS        08048294 000294 000030 00  AX  0   0  4
  17.   [12] .plt              PROGBITS        080482c4 0002c4 000040 04  AX  0   0  4
  18.   [13] .text             PROGBITS        08048310 000310 0001cc 00  AX  0   0 16
  19.   [14] .fini             PROGBITS        080484dc 0004dc 00001c 00  AX  0   0  4
  20.   [15] .rodata           PROGBITS        080484f8 0004f8 000016 00   A  0   0  4
  21.   [16] .eh_frame         PROGBITS        08048510 000510 000004 00   A  0   0  4
  22.   [17] .ctors            PROGBITS        08049f14 000f14 000008 00  WA  0   0  4
  23.   [18] .dtors            PROGBITS        08049f1c 000f1c 000008 00  WA  0   0  4
  24.   [19] .jcr              PROGBITS        08049f24 000f24 000004 00  WA  0   0  4
  25.   [20] .dynamic          DYNAMIC         08049f28 000f28 0000c8 08  WA  6   0  4
  26.   [21] .got              PROGBITS        08049ff0 000ff0 000004 04  WA  0   0  4
  27.   [22] .got.plt          PROGBITS        08049ff4 000ff4 000018 04  WA  0   0  4
  28.   [23] .data             PROGBITS        0804a00c 00100c 000008 00  WA  0   0  4
  29.   [24] .bss              NOBITS          0804a014 001014 000008 00  WA  0   0  4
  30.   [25] .comment          PROGBITS        00000000 001014 00006c 01  MS  0   0  1
  31.   [26] .shstrtab         STRTAB          00000000 001080 0000ee 00      0   0  1
  32.   [27] .symtab           SYMTAB          00000000 0015f8 000400 10     28  44  4
  33.   [28] .strtab           STRTAB          00000000 0019f8 0001f9 00      0   0  1
  34. Key to Flags:
  35.   W (write), A (alloc), X (execute), M (merge), S (strings)
  36.   I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  37.   O (extra OS processing required) o (OS specific), p (processor specific)
复制代码

论坛徽章:
0
发表于 2012-02-21 23:55 |显示全部楼层
123.png

论坛徽章:
0
发表于 2012-02-22 09:42 |显示全部楼层
cat /proc/pid/maps

论坛徽章:
0
发表于 2012-02-22 10:32 |显示全部楼层
我的理解:
elf为例,典型情况下是这样的,shell执行新的命令/程序时,他会fork出一个子进程,子进程复制父进程的所有资源(写时复制),然后execve()。execve根据elf映像文件中的程序头给出的映射关系把磁盘上的elf映像映射到虚拟内存中,同时修改mm结构中的线性区vma等数据结构。这样, 完成了磁盘文件到虚拟内存的映射。注意,磁盘elf文件并没有调入/拷贝到物理内存,也没有建立真正的页表,只有当进程正真执行时通过缺页异常来完成程序加载,同时建立页表。这样就完成了虚拟内存到物理内存的映射。
等高手拍砖。。。

论坛徽章:
0
发表于 2012-02-22 23:48 |显示全部楼层
up up 顶一下。。。

论坛徽章:
0
发表于 2012-02-23 21:44 |显示全部楼层
amarant 发表于 2012-02-23 07:56
用工具readelf

这个看不明白,是象我说的那样的内存映射么?

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2012-02-24 09:01 |显示全部楼层
回复 7# pang68599


    代码段是.text
.text             PROGBITS        08048310 000310 0001cc 00  AX  0   0 16

这句的意思就是1,代码段从虚拟地址08048310开始;2,长度为1cc;3在二进制文件的310地址开始

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2012-02-24 11:41 |显示全部楼层
你这个图。。。 所有进程共用同一个平面的虚拟地址空间。。。。好像Linux 0.01里是这么做的。

论坛徽章:
0
发表于 2012-02-24 12:55 |显示全部楼层
你的图的确是很久以前的做法,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP