首页 技术 正文
技术 2022年11月19日
0 收藏 744 点赞 2,868 浏览 2070 个字

1.核心区域进程包括各种内存对象

种内存对象,比方:

1.可运行文件代码能够包括各种内存映射,称为代码段(text section)。

2.可运行文件的已初始化全局变量的内存映射,称为数据段(data section)。

3.包括未初始化全局变量,也就是bss段的零页(页面中的信息所有为0值,所以能够用于映射bss段等目的)的内存映射。

4.用于进程用户空间栈的内存映射。

5.每个诸如c库或动态链接程序等共享库的代码段、数据段和bss段也会被加载进程的地址空间。

6.不论什么内存映射文件。

7.不论什么共享内存段

8.不论什么匿名的内存映射。比方由malloc()分配的内存。

2.内存描写叙述符

内核使用内存描写叙述符结构体表示进程的地址空间。该结构体包括了和进程地址空间有关的所有信息。内存描写叙述符由mm_struct结构体表示。它的定义为:

mm_user域记录正在使用该地址的进程数目。mmap和mm_rb这两个不同数据结构体描写叙述的对象是同样的:该地址空间中的所有内存区域。可是前者以链表的方式存放而后者以红黑树的结构存放。内核一般会避免使用两种数据结构组织同一种数据,但此时内核这种冗余全然派的上用场。

mmap作为链表,利于简单、高效地遍历所有元素;而mm_rb则更合适搜索指定的元素。

全部的mm_struct结构体都通过自身的mmlist域链接在一个双向链表中,该链表的首元素是init_mm内存描写叙述符,它代表init进程的地址空间,在操作该链表的时候须要使用mmlist_lock锁来防止并发訪问。

3.内存区域

内存区域由vm_area_struct结构体描写叙述,它的定义例如以下:

每一个内存描写叙述符都相应于进程地址空间中的唯一区间。vm_start域指向区间的首地址。vm_end域指向区间的尾地址。

须要注意的是,在同一个地址空间内的不同内存区间不能重叠。

vm_mm域指向和VMA相关的mm_struct结构体,注意每一个VMA对其相关的mm_struct结构体来说都是唯一的,所以即使两个独立的进程将同一个文件映射到各自的地址空间,它们分别都会有一个vm_area_struct结构体来标志自己的内存区域;可是假设两个线程共享同一个地址空间。那么它们也同一时候共享当中的全部vm_area_struct结构体。

4.VMA标志

VMA标志是一种位标志,它包括在vm_flags域内,标志了内存区域所包括的页面的行为和信息。当訪问VMA时。须要查看其訪问权限。

VMA的可选标志例如以下所看到的:

5.实际举例

我们用一个很easy的用户控件程序的样例,它事实上什么也不做。不过为了做说明用:

int main(int argc,char * argv[])

{

return 0;

}

以下列出该进程地址空间中包括的内存区域。

当中有代码段、数据段、和bss段等。该进程与C库动态链接,那么地址空间中还将分别包括libc.so和ld.so相应的上述三种内存区域。此外。地址空间中还要包括进程栈相应的内存区域。

前三行分别相应C库中libc.so的代码段、数据段、和bss段,接下来三行是动态链接程序ld.so的代码段、数据段、和bss段,最后一行是进程的栈。

该进程的所有地址空间大约1340KB,可是唯独约40KB的内存区域是可写和私有的。假设一片内存范围是共享的或不可写的,那么内核只须要在内存为文件保留一份映射多以C库在无力内存中只须要占用1212KB的空间,而不须要为每一个使用C库的进程在内存中都保存一个1212KB的空间。进程訪问了1340KB的数据和代码空间,然而只消耗了40KB的物理内存。能够看出利用这样的共享不可写内存的方法节约了大量的内存。

注意没有映射文件的内存区域的设备标志位00:00,索引节点标志也为0。这个区域就是零页。

假设将零页映射到可写的内存区域。那么该区域将被初始化为全0。这是零页的一个重要的用处。而bss段须要的就是全0的内存区域。因为内存未被共享,所以仅仅要一有进程写该数据,那么该数据就将被拷贝出来(就是我们说的写时拷贝),然后才被更新。

6.动态链接的过程举例(參考《CSAPP》)

动态链接的步骤例如以下所看到的:

在创建可运行文件p2时,没有不论什么libvector.so的代码和数据节真的被复制到可运行文件p2中。链接器仅仅拷贝了一些重定位和符号表信息,它们使得运行时能够解析对libvector.so中代码和数据的引用。

当载入器载入和运行可运行文件时,它注意到可运行文件有一个.interp节,这个节包括动态链接器的路径名。动态链接器本身就是一个共享目标,载入器不再像它通常那样将控制传递给可运行程序,而是载入和运行这个动态链接器。

然后,动态链接器通过运行以下的重定位完毕链接任务:

·重定位libc.so的文本和数据到某个存储器段。

·重定位libvector.so的文本和数据到还有一个存储器段。

·重定位p2中全部由libc.so和libvector.so定义的符号引用。

最后,动态连接器将被转移到整个应用程序的控制。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,996
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,510
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,353
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,137
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,770
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,848