Linux内核之进程地址空间

  • 内核中的函数以相当直接了当的方式获得动态内存:

    • __get_free_pages 或 alloc_pages从分区页框分配器中获得页框;
    • kmem_cache_alloc或kmalloc使用slab分配器为专用或通用对象分配块;
    • vmalloc获得一块非连续的内存块;
    • 返回一个页描述符地址或线性地址;
  • 内核是操作系统中优先级最高的成分;
  • 内核信任自己;
  • 内核总是尽量推迟给用户态进程分配动态内存;
  • 内核必须能随时准备捕获用户态进程引起的所有寻址错误;
  • 当用户态进程请求动态内存时, 并没有会的请求页框, 而仅仅获得对一个新的线性地址区间的使用权, 而这一线性地址区间就称为进程地址空间的一部分, 这一区间叫作线性区;
  • 缺页议程处理程序在推迟给进程分配页框中所起的作用;

进程的地址空间

  • 进程地址空间是进程使用的全部线性地址组成, 每个进程看到的线性地址集合是不同的;
  • 内核可以通过增加或删除某些线性地址区间来动态地修改进程的地址空间;
  • 内核通过所谓线性区的资源来表示线性私自区间, 线性区是有起始线性地址、长度和一些访问权限来描述, 起始地址和线性区的长度必须是4096的倍数;
  • malloc内部调用brk函数来改变进程堆的大小;

内存描述符

  • 与进程相关的全部信息都包含在一个叫做内存描述读的数据结构中;
  • 进程所拥有的线性区从来不重叠, 并且内核尽力把新分配的线性区与紧邻的现有线性区进行合并;

缺页异常处理程序

  • Linux的缺页异常处理程序必须区分两种情况:

    • 由编程错误引起的异常;
    • 由引用属于进程地址空间但还尚未分配物理页框所引起的异常;
  • 线性区描述符可以让缺页异常处理程序非常有效地完成它的工作;
    • do_page_fault函数是缺页中断服务程序;
  • 请求调页: 进程开始运行的时候并不访问其地址空间中的全部地址, 实际上, 有一部分地址也许永远不会被进程使用;
    • 程序的局部性原理; 请求调页从重提上使系统有更大的吞吐量, 把页框的分配推迟到不能再推迟为止;

创建进程的地址空间

  • 通过copy_mm函数创建新进程的所有页表和内存描述符来创建进程的地址空间;
  • 通过exit_mm函数释放进程的地址空间;
  • 进程调用brk系统调用, 内核执行sys_brk函数来修改进程堆的大小;

Linux内核之进程地址空间的更多相关文章

  1. 深入理解Linux内核-进程地址空间

    给内核分配内存和给用户态进程分配内存是有区别的:1.内核的优先级最高,如果某个内核函数请求动态内存,不会被延时2.内核信任自己,不必保护措施3.用户态进程对动态内存的请求被认为不是紧迫的,总是被尽量推 ...

  2. (转)Linux内核之进程和系统调用

    Linux内核之进程和系统调用 什么是系统调用 在Linux的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的.功能十分强大的一系列的函数.这些系统调用是在内核中实现的,再通过一定 ...

  3. 深入Linux内核架构——进程管理和调度(上)

    如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停 ...

  4. 24小时学通Linux内核之进程

    都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲的全是进程,这点在大二的时候就困惑了我,结果那 ...

  5. 分析Linux内核中进程的调度(时间片轮转)-《Linux内核分析》Week2作业

    1.环境的搭建: 这个可以参考孟宁老师的github:mykernel,这里不再进行赘述.主要是就是下载Linux3.9的代码,然后安装孟宁老师编写的patch,最后进行编译. 2.代码的解读 课上的 ...

  6. Linux 内核开发 - 进程空间

    1.1 虚拟内存 Linux 的系统.假设每一个任务都独立的占用内存,则实际的物理内存将非常快消耗殆尽.实际上对于前台正在执行的任务来说,所须要要的内存并不多,非常多任务基本不须要执行,也就没有必要一 ...

  7. Linux内核分析——进程的切换和系统的一般执行过程

    进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 (一)进程调度与进程调度的时机分析 1.不同类型的进程有不同的调度需求 第一种分类: (1)I/O-bound:频繁进行I ...

  8. Linux内核中进程上下文、中断上下文、原子上下文、用户上下文的理解【转】

    转自:http://blog.csdn.net/laoliu_lcl/article/details/39972459 进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不 ...

  9. 深入理解Linux内核-进程

    1.进程的静态特性 进程:程序执行时的一个实例 进程描述符(task_struct): 进程的基本信息(thread_info).指向内存区描述符的指针(mm_struct).进程相关的tty(tty ...

随机推荐

  1. HTML5 accesskey的用法

    <button onclick="start()" accesskey="s">开始</button> <button oncli ...

  2. Redis_集群_主从模式_哨兵模式

    1.主从模式 2.哨兵模式

  3. ACM-ICPC 2018 南京赛区网络预赛 G Lpl and Energy-saving Lamps(模拟+线段树)

    https://nanti.jisuanke.com/t/30996 题意 每天增加m个灯泡,n个房间,能一次性换就换,模拟换灯泡过程.询问第几天的状态 分析 离线做,按题意模拟.比赛时线段树写挫了. ...

  4. hihoCoder #1457 : 后缀自动机四·重复旋律7(后缀自动机 + 拓扑排序)

    http://hihocoder.com/problemset/problem/1457 val[i] 表示状态i所表示的所有字符串的十进制之和 ans= ∑ val[i]在后缀自动机上,从起始状态走 ...

  5. bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...

  6. UUID在Java中的实现与应用

    UUID是什么 UUID的全称为:Universally Unique IDentifier,也被称为GUID(Globally Unique IDentifier).是一种由算法生成的唯一标识,它实 ...

  7. vue-cli3 第三版安装搭建项目

    Vue CLI是一个用于快速Vue.js开发的完整系统 3.X较2.X结构变了很多,更优雅,开发体验更好 官方:https://cli.vuejs.org/guide/ 安装:https://cli. ...

  8. 一次针对多台服务器交互式主机命令采集Python脚本编写

    [环境介绍]   系统环境:Linux + Python 2.7.10(监控主机)   [背景描述] 需求:每次节假日或者重要时间时,需要对数据库主机信息进行检查,比如主机空间使用率之类.有时候需要执 ...

  9. 13.CrawlSpider类爬虫

    1.CrawlSpider介绍 Scrapy框架中分两类爬虫,Spider类和CrawlSpider类. 此案例采用的是CrawlSpider类实现爬虫. 它是Spider的派生类,Spider类的设 ...

  10. Servlet 快速开始 表单中文字段

    req.getParameter | getParameterValue 一大特点是 返回null表示没有. [web.xml] <servlet> <serlvlet-mappin ...