linux进程内存空间,(转)Linux X86-64 进程内存空间布局(续)

在很久很久以前,我曾详细的分析过应用程序里的dlmalloc解析连载完整word文档,这是站在应用程序角度来看的内存管理视图,更具体点说只是应用程序对自己所用到的堆空间内存的管理视图。

在不久之前,我又提到过Linux

X86-64 进程内存空间布局,这是2.6.38.8。

在linux内核里,一个进程对应一个task_struct结构体,或者这样说,一个task_struct结构体描述了一个进程所包含的各种信息(即可称之为进程描述符,process

descriptor),所以关于进程的内存信息在这个结构体内也能找到对应的记录字段:

1

2

3

4

5

6

7

8

9

10

11

12

struct task_struct {

...

#ifdef CONFIG_SMP

struct

plist_node pushable_tasks;

#endif

struct

mm_struct *mm, *active_mm;

#ifdef CONFIG_COMPAT_BRK

unsigned

brk_randomized:1;

#endif

...

};

有两个类型为mm_struct结构体的字段mm和active_mm,不过mm才是本文的主角,active_mm待后续再讲。对应前面说称task_struct结构体为进程描述符,那么结构体mm_struct可称为内存描述符(memory

descriptor),它概要了对应应用程序所使用的内存信息,比如所有段(segment)、各个主要段的始末位置、使用常驻内存的总大小等等:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

struct mm_struct {

struct

vm_area_struct *

mmap;

struct

rb_root mm_rb;

...

unsigned

long mmap_base;

...

unsigned

long hiwater_rss;

unsigned

long hiwater_vm;

unsigned

long total_vm, locked_vm, shared_vm, exec_vm;

unsigned

long stack_vm, reserved_vm, def_flags, nr_ptes;

unsigned

long start_code, end_code, start_data, end_data;

unsigned

long start_brk, brk, start_stack;

unsigned

long arg_start, arg_end, env_start, env_end;

...

};

还是来看图说话:

a4c26d1e5885305701be709a3d33442f.png

上图中mmap_base所指向的Mapping segment段起始位置并没有画错,在内核源码mmap.c里有这方面的准确信息,可以看到mmap_base的值由mmap_base()函数获得,而该函数返回的是一个靠近(TASK_SIZE

+ staack最大值)的值,当然,这只是一般情况,也有其它情况,Mapping段以Bottom-up的形式布局。

vm_area_struct结构体变量mmap是mm_struct结构体内另一个非常重要的字段,它将所有的segment段以双向链表的形式关联起来,每一个segment用一个或多个(比如应用程序多次mmap的位置不连续,此时就会有多个vm_area_struct与Mapping

segment对应)vm_area_struct描述。每一个vm_area_struct节点详细记录了该VMA(virtual

memory

area)的相关属性,比如起始地址(vm_start)、结束地址(vm_end)、访问权限(vm_flags)以及对应的映射文件(vm_file,可为NULL,此时为anonymous匿名)。这些vm_area_struct节点除了会按起始地址顺序以链表的形式组织起来外,还会以红黑树的形式组织起来以便快速查找,而根节点记录在mm_struct结构体的mm_rb字段内。当我们执行“cat

/proc/self/maps”时,当然只需顺序读取链表就行了。:)

备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来信讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值