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定义的符号引用。

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

《Linux内核设计与实现》的地址空间读书笔记的过程的更多相关文章

  1. 《Linux内核设计与实现》 Chapter4 读书笔记

    <Linux内核设计与实现> Chapter4 读书笔记 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子 ...

  2. Linux内核设计与实现第四周读书笔记

    第5章系统调用 5.1与内核通信 主要作用: 为用户控件提供了一种硬件的抽象接口. 保证了系统稳定性与安全性. 为用户空间&系统提供公共接口. 5.2API.POSIX和C库 一般情况,应用程 ...

  3. 《Linux内核分析》第六周 读书笔记

    <Linux内核设计与实现>CHAPTER3阅读梳理 [学习时间:3hours] [学习内容:进程的描述:进程的生命周期(包括创建.终结)] 一.进程(任务)描述 1.进程是处于执行期的程 ...

  4. linux内核分析 1、2章读书笔记

    一.linux历史 20世纪60年代,MIT开发分时操作系统(Compatible TIme-Sharing System),支持30台终端访问主机: 1965年,Bell实验室.MIT.GE(通用电 ...

  5. 《Linux内核分析》第七周 读书笔记

    <深入理解计算机系统>CHAPTER7阅读梳理 [学习时间:3hours] [学习内容:链接需要的代码&数据:链接机制:链接生成的目标文件] 一.链接概述 1.链接 定义:链接是将 ...

  6. 《Linux内核设计》第17章学习笔记

  7. 《linux内核》课本第五章读书笔记

  8. 《Linux内核设计与实现》课本第一章&第二章学习笔记

    <Linux内核设计与实现>课本学习笔记 By20135203齐岳 一.Linux内核简介 Unix内核的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件 ...

  9. 《Linux内核设计与实现》读书笔记 - 目录 (完结)

    读完这本书回过头才发现, 第一篇笔记居然是 2012年8月发的, 将近一年半的时间才看完这本书(汗!!!). 为了方便以后查看, 做个<Linux内核设计与实现>读书笔记 的目录: < ...

随机推荐

  1. sql server 2012 数据库还原方法

    USE master RESTORE DATABASE WSS_Content FROM DISK = N'D:\bak\contentbak.bak' WITH REPLACE, NORECOVER ...

  2. PHP网站安装程序的原理及代码

    原文:PHP网站安装程序的原理及代码 原理: 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安 ...

  3. How to write simple HTTP proxy with Boost.Asio

    How to write simple HTTP proxy with Boost.Asio How to write simple HTTP proxy with Boost.Asio Russia ...

  4. spring MVC 下载文件(转)

    springle MVC中如何下载文件呢? 比struts2 下载文件简单得多 先看例子: @ResponseBody @RequestMapping(value = "/download& ...

  5. poj1836--Alignment(dp,最长上升子序列变形)

    Alignment Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13319   Accepted: 4282 Descri ...

  6. WebView混合开发

    现在开发APP的方式变化,不在是传统的APP开发了,有很多的APP慢慢的转向混合模式的开发,使用WebView是传统开发模式转向混合模式的桥梁工具,结合了很多的Web前端开发界面,使得开发的速度加快, ...

  7. HDU 4815 背包

    标题的含义给出N问题.和概率P,然后给予相应的分数为每个问题x(每个问题只有两种选择,纠正错误). 两个人来回答.一个人是随机选择的答案,问:还有一个人的至少一些点的能力有保证P概率不会失败. 01背 ...

  8. Android开源client之LookAround学习(一)Application &amp; 网络框架

    之前看过开源clientLookAround(下载地址:http://download.csdn.net/detail/hualulove/7306807),链接:http://blog.csdn.n ...

  9. Spark技术内幕:Stage划分及提交源代码分析

    当触发一个RDD的action后.以count为例,调用关系例如以下: org.apache.spark.rdd.RDD#count org.apache.spark.SparkContext#run ...

  10. C# 使用Tuple传递多个参数

    Tuple是基于.NET Framework 4.0 及以上版本才有的.微软称它为元组,如果有三个参数那就是三元组.如 Tuple(T1, T2, T3) Tuple的命名空间在 System 很短吧 ...