进程用户空间的代码描述

2010年11月9日 由 edsionte 留言 »

在前文中,我们对进程的虚拟地址空间进行了概述。本文将从内核代码的角度来分析进程的用户空间的的组织和结构。

上文中提到,每一个进程都拥有3GB大小的用户空间,而连续用户空间又按照存储内容的不同被划分成若干个区域。在内核中,主要通过mm_struct结构体和vm_area_struct结构体对进程用户空间进行描述。前者是对进程的用户空间进行整体的描述;而后者则是对用户空间中的某个区域进行描述。显然,每一个进程对应的有一个mm_struct结构和多个vm_area_struct结构。

1.mm_struct结构

最新版本中的mm_struct结构字段比较多,接下来只对部分字段做以说明。

mmap:vm_area_struct结构体类型的指针。指向进程用户空间中各区域所组成的双链表。链表方式可以高效的遍历所有元素;
mm_rb:rb_root结构体类型。同样描述内存区域块,只不过采用红黑树来表示。用红黑树可以快速索引到指定的元素;
mm_users:atomic_t类型。用来记录正在使用该地址空间的进程数目。比如,当前有3个进程正在共享该地址空间,那么其值为3;
mm_count:atomic_t类型。记录mm_struct结构体被引用的次数。如果当前该地址空间只被两个进程所共享,那么该值为1,mm_users为2;当这两个进程都退出时,该值为0,mm_users也为0。另外,内核线程并不需要访问用户的内存空间,也并不需要创建页表。内核线程一般会直接使用前一个进程的mm_struct结构。因此该字段的计数还包括内核线程对这个结构的引用。
map_count:int类型。内存区域的个数;
pgd:pgd_t类型,该结构体类型内部封装的是unsigned long类型的数据。pgd表示的是页目录基址。当调度程序调度一个进程运行时,就将这个线性地址转化为物理地址,并写入CR3控制寄存器中;
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:unsigned long类型。命令行参数所在内存的起始地址和终止地址,环境变量所在内存的起始地址和终止地址;

2.vm_area_struct结构

上面我们已经知道,该结构体描述的是进程用户空间中的一个虚拟内存区间(Virtual Memory Area,VMA)。
vm_mm:mm_struct结构体类型指针。指向该区域所属的用户空间对应的mm_struct结构体。
vm_start,vm_end:unsigned long类型。该虚存区域的起始地址和终止地址。
vm_next,vm_prev:vm_area_struct结构体类型指针。构成VMA双联表。
vm_flags:unsigned long类型。该虚存区的标志。
vm_page_prot:pgprot_t结构体类型,内部封装了unsigned long类型。访问控制权限。
vm_ops:vm_operations_struct结构体类型。该虚存区域的操作函数接口,这些函数可以对虚存区中的页进行操作。

3.数据结构的关系

了解了上述结构体的关键字段,它们与进程之间的逻辑关系便是我们接下来要关心的重点。我们知道,一个进程在内核中使用task_struct结构对其进行描述。task_struct结构中有一个mm字段,它所指向的便是与该进程用户空间所对应的mm_struct结构体。通过上述分析,我们知道mm_struct结构中有mmap字段,它指向VMA双链表。因此,我们使用current->mm->mmap就可以获得VMA链表的头指针。那么current->mm->mmap->vm->next就可以获得指向该VMA双联表的下一个结点的指针。

4.动手查看内存区域

上述我们从代码角度分析了用户地址空间和内存区域。那么对于一个任意的进程,我们如何查看它的内存空间和所划分的内存区域?

我们先看一个简单的测试程序:

#include 
#include 

int main()
{
	int i=1;
	char *str=NULL;
	printf("hello,world!\n");
	str=(char *)malloc(sizeof(char)*1119);

	sleep(1000);

	return 0;
}

这个程序中使用到了malloc函数,因此str变量存储于堆中。我们通过打印/proc/3530/maps文件,即可看到该进程的内存空间划分。其中3530是该进程的id。

edsionte@edsionte-desktop:~$ cat /proc/3530/maps
0014a000-00165000 r-xp 00000000 08:07 398276     /lib/ld-2.11.1.so
00165000-00166000 r--p 0001a000 08:07 398276     /lib/ld-2.11.1.so
00166000-00167000 rw-p 0001b000 08:07 398276     /lib/ld-2.11.1.so
001d8000-0032b000 r-xp 00000000 08:07 421931     /lib/tls/i686/cmov/libc-2.11.1.so
0032b000-0032c000 ---p 00153000 08:07 421931     /lib/tls/i686/cmov/libc-2.11.1.so
0032c000-0032e000 r--p 00153000 08:07 421931     /lib/tls/i686/cmov/libc-2.11.1.so
0032e000-0032f000 rw-p 00155000 08:07 421931     /lib/tls/i686/cmov/libc-2.11.1.so
0032f000-00332000 rw-p 00000000 00:00 0
00441000-00442000 r-xp 00000000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 08:09 326401     /home/edsionte/test
08049000-0804a000 r--p 00000000 08:09 326401     /home/edsionte/test
0804a000-0804b000 rw-p 00001000 08:09 326401     /home/edsionte/test
08958000-08979000 rw-p 00000000 00:00 0          [heap]
b78ce000-b78cf000 rw-p 00000000 00:00 0
b78dd000-b78e0000 rw-p 00000000 00:00 0
bfa6a000-bfa7f000 rw-p 00000000 00:00 0          [stack]

每一行信息依次显示的内容为内存区域其实地址-终止地址,访问权限,偏移量,主设备号:次设备号,inode,文件。

上面的信息不但包含了test可执行对象的各内存区域,而且还分别显示了 /lib/ld-2.11.1.so(动态连接程序)文件和/lib/tls/i686/cmov/libc-2.11.1.so(C库)文件的内存区域信息。

我们从某个内存区域的访问权限上可以大致判断该区域的类型。各个属性符号的意义为:r-read,w-write,x-execute,s-shared,p-private。因此,r-x一般代表程序的代码段,即可读,可执行。rw-可能代表数据段,BSS段和堆栈段等,即可读,可写。堆栈段从行信息的文件名就可以区分;如果某行信息的文件名为空,那么可能是BSS段。另外,上述test进程共享了内核动态库,所以在00441000-00442000行处文件名显示为vdso(Virtual Dynamic Shared Object)。

广告位

发表评论

windows 7 ultimate product key

windows 7 ultimate product key

winrar download free

winrar download free

winzip registration code

winzip registration code

winzip free download

winzip free download

winzip activation code

winzip activation code

windows 7 key generator

windows 7 key generator

winzip freeware

winzip freeware

winzip free download full version

winzip free download full version

free winrar download

free winrar download

free winrar

free winrar

windows 7 crack

windows 7 crack

windows xp product key

windows xp product key

windows 7 activation crack

windows7 activation crack

free winzip

free winzip

winrar free download

winrar free download

winrar free

winrar free

download winrar free

download winrar free

windows 7 product key

windows 7 product key