Linux内核之进程地址空间
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内核之进程地址空间的更多相关文章
- 深入理解Linux内核-进程地址空间
给内核分配内存和给用户态进程分配内存是有区别的:1.内核的优先级最高,如果某个内核函数请求动态内存,不会被延时2.内核信任自己,不必保护措施3.用户态进程对动态内存的请求被认为不是紧迫的,总是被尽量推 ...
- (转)Linux内核之进程和系统调用
Linux内核之进程和系统调用 什么是系统调用 在Linux的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的.功能十分强大的一系列的函数.这些系统调用是在内核中实现的,再通过一定 ...
- 深入Linux内核架构——进程管理和调度(上)
如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停 ...
- 24小时学通Linux内核之进程
都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲的全是进程,这点在大二的时候就困惑了我,结果那 ...
- 分析Linux内核中进程的调度(时间片轮转)-《Linux内核分析》Week2作业
1.环境的搭建: 这个可以参考孟宁老师的github:mykernel,这里不再进行赘述.主要是就是下载Linux3.9的代码,然后安装孟宁老师编写的patch,最后进行编译. 2.代码的解读 课上的 ...
- Linux 内核开发 - 进程空间
1.1 虚拟内存 Linux 的系统.假设每一个任务都独立的占用内存,则实际的物理内存将非常快消耗殆尽.实际上对于前台正在执行的任务来说,所须要要的内存并不多,非常多任务基本不须要执行,也就没有必要一 ...
- Linux内核分析——进程的切换和系统的一般执行过程
进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 (一)进程调度与进程调度的时机分析 1.不同类型的进程有不同的调度需求 第一种分类: (1)I/O-bound:频繁进行I ...
- Linux内核中进程上下文、中断上下文、原子上下文、用户上下文的理解【转】
转自:http://blog.csdn.net/laoliu_lcl/article/details/39972459 进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不 ...
- 深入理解Linux内核-进程
1.进程的静态特性 进程:程序执行时的一个实例 进程描述符(task_struct): 进程的基本信息(thread_info).指向内存区描述符的指针(mm_struct).进程相关的tty(tty ...
随机推荐
- Spring Boot 启动:No active profile set, falling back to default profiles: default
启动 Spring Boot 失败,但是没有出现多余的异常信息: 检查之后发现是依赖的问题(之前依赖的是 spring-boot-starter),修改即可: 方法二: pom.xml加上下面两个依赖 ...
- flask请求异步执行(转载)
Flask默认是不支持非阻塞IO的,表现为: 当 请求1未完成之前,请求2是需要等待处理状态,效率非常低. 在flask中非阻塞实现可以由2种: 启用flask多线程机制 # Flask from f ...
- Mac OS X 启用超级用户 sudo -s 获得系统权限 Mac终端命令
为了防止误操作破坏系统,用户状态下时没有权限操作系统重要文件, 所以先要取得root权限:“sudo -s” 详见:https://www.jianshu.com/p/138b98e662ed
- C# 数据类型之 String(字符串)
Ø 简介 在开发中最常见的数据类型就是 String 类型,即字符串类型.为什么要单独讨论下这个类型,是因为:它是系统内置的基础数据类型:它的使用频率非常高:它是一个特殊的引用类型.其实大家都会使用 ...
- windows生成dump文件
windows下程序有时突然崩溃了,偶发性的崩溃很难找.于是就需要保存崩溃时的dump信息了. 下面是关于如何生成dmp文件的代码. 头文件 #pragma once #include <win ...
- Docker摘要
Docker https://www.docker.com/ 消除应用的依赖矩阵. 消除硬件依赖 和 软件依赖. Escape the app dependency matrix Eliminate ...
- luogu 4180 严格次小生成树
次小生成树,顾名思义和次短路的思路似乎很类似呀, 于是就先写了个kruskal(prim不会)跑出最小生成树,给所有路径打标记,再逐个跑最小生成树取大于最小生成树的最小值 50分 #include&l ...
- 本地测试使用Tomcat,生产环境使用GlassFish。
总结:Tomcat8 = javaee7规范(servlet3.1 + jsp2.3 + el3.0 + websocket1.0) + java7 [配置初始化参数使用jdk8编译]conf/web ...
- webxml样板
<!--<!DOCTYPE web-app PUBLIC--> <!--"-//Sun Microsystems, Inc.//DTD Web Application ...
- Ubuntu中创建、删除、更改、移动文件的命令
1.创建一个目录 $ sudo mkdir <目录名> 2.删除一个非空目录下的一切 $ sudo rm -rf <目录名> 3.将文件file1,更改文件名为file ...