[Linux]进程(十)——进程地址空间

1,进程的虚拟内存:

背景知识
a.out分段以及运行时候内存的结构点击打开链接

linux进程地址空间

linux进程地址空间

\

[cpp] view plaincopy

  1. struct mm_struct {
  2. struct vm_area_struct  *mmap;               /* list of memory areas */
  3. struct rb_root         mm_rb;               /* red-black tree of VMAs */
  4. 。。。。。。。。。
  5. }

mmap和mm_rb两个不同的数据结构描述的对象都是相同的,描述的是该地址空间全部的内存区域(struct vm_area_struct),但是前者以链表形式,后者以红黑树形式,链表优点是可以高效遍历所有元素,而红黑树更适合搜索指定的元素。mm_struct结构体双向链表结构体的首元素是init_mm内存描述符,它代表init进程的地址空间.进程描述符task_struct中有一个mm域,这里边存放的就是该进程使用的内存描述符,通过current->mm便可以指向当前进程的内存描述符

内核线程没有地址空间,所以内核线程中task_struct中该成员为空。在内核调度的时候,如果发现mm_struct区域为空,则会保留前一个进程的地址空间

内存区域由vm_area_struct结构体表示,描述指定地址空间内连续空间上一个独立的内存范围。内核将每个内存区域都作为一个单独的内存对象管理,每个内存对象有一致性属性,比如访问权限等

可以通过/proc/<pid>/maps的输出来查看各个进程地址空间的全部区域,每行的格式输入

开始--结束 访问权限偏移主设备号:次设备号i节点文件

mmap()和do_mmap()函数
内核使用do_mmap()函数来创建一个新的地址空间,如果创建的地址空间和一个已经存在的地址空间相邻并且属性都相同,那么两个区间会合并为一个。do_mmap()函数会将一个地址空间加入到进程的地址空间

[cpp] view plaincopy

  1. struct mm_struct {
  2. pgd_t                  *pgd;                /* page global directory */
  3. 。。。。。。。。
  4. }

页表是用来实现虚拟地址到物理地址的转变的,每个进程的内存描述符都有自己的页表,在mm_struct结构体的pgd成员指向。

时间: 2024-08-05 07:12:51

[Linux]进程(十)——进程地址空间的相关文章

Linux学习之进程管理(十九)

Linux学习之进程管理 进程查看 查看系统中所有进程,使用BSD操作系统的格式 语法:ps aux 选项: a:显示所有前台进程 x:显示所有后台进程 u:显示这个进程是由哪个用户产生的 语法:ps -le 查看系统中所有进程,使用Linux标准命令格式 选项 l:显示详细信息 e:显示所有进程 USER:该进程是由哪个用户产生的 PID:进程的ID号 %CPU:该进程占用CPU资源的百分比,占用越高,进程越消耗资源. %MEM:该进程占用物理内存的百分比,占用越高,进程越消耗资源. VSZ:

Linux内核学习-进程

先说几个术语: 一.Linux进程的五个段 下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干什么的.重点:代码段.数据段.堆栈段,这是一个概念堆.栈.全局区.常量区,这是另一个概念1)代码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像.代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作--它是不可写的.代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域.这部分

linux应用开发-进程控制理论

linux应用开发-进程控制理论 一 进程 进程是一个具有一定独立功能的程序的一次运行活动. 二 进程特点和状态 动态性 并发性 独立性 异步性 状态 就绪 执行 阻塞 三 调度算法 进程调度:按一定算法,从一组待运行的进程中选出一个来占有CPU运行. 先来先服务 短进程优先调度 高优先级优先调度 时间片轮转法 四 调度方式 在有了等待运行的进程和调度算法后,接下来需要讨论的问题是:什么时候调度? 按调度时机,调度可分为: 抢占式调度 非抢占式调度 五 死锁 多个进程抢占同一个资源而形成的一种僵

Linux内核分析——进程的描述和进程的创建

Linux内核分析——进程的描述和进程的创建 20135111李光豫 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验内容 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235: 分析fork函数对应的内核处理过程sys_clone,理解创建一个新进

Linux 线程与进程,以及通信

http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-id-3025213.html 1.首先要明确进程和线程的含义: 进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位.与程序相比,程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体.进程是程序在某个数据集上的执行,

Linux 内核开发 - 进程空间

1.1 虚拟内存 Linux 是一个多任务的系统,如果每个任务都独立的占用内存,则实际的物理内存将很快消耗殆尽,实际上对于前台正在运行的任务来说,所需要要的内存并不多,很多任务基本不需要运行,也就没有必要一直占用内存,虚拟内存技术采用硬盘来充当一部分内存,当内存不足时就将不需要在内存中使用的数据搬移到硬盘中去,当任务需要运行时又将硬盘中的数据搬回物理内存. 虚拟内存技术不仅起到了保护操作系统的作用,而且使得用户程序可以使用到比实际物理内存更大的地址空间,屏蔽了实际物理内存对用户地址空间的影响.

Linux中的进程

说进程之前要先说一下程序,相信大家都知道什么是程序,程序就是一个可执行文件,是一堆指令的集合.相对而言程序是静态的.而运行起来的程序就是进程,是动态的,是程序执行的过程.程序可以运行多次比如QQ可以启动多个,但是每一个都会在内存中有独立的隔离空间用于装载程序代码和数据. 我们通过ps命令可以查看Linux系统中当前运行的进程 ps -aux 具体字段请看 Linux系统的监控命令 这里面每一行都是一个进程,PID是进程号,后面的COMMAND这是具体进程或者说是程序名称.第一行永远都是PID 1

linux基础:进程管理

1.进程和程序(process and program) 首先我们对进程作一明确定义:所谓进程是由正文段(text).用户数据段(user segment)以及系统数据段(system segment)共同组成的一个执行环境. 程序只是一个普通文件,是一个机器代码指令和数据的集合,这些指令和数据存储在磁盘上的一个可执行映象(executable image)中,所以,程序是一个静态的实体.linux是一个多任务操作系统,也就是说,可以有多个程序同时装入内存并运行,操作系统为每个程序建立一个运行环

深入理解Linux内核-进程

1.进程的静态特性 进程:程序执行时的一个实例 进程描述符(task_struct): 进程的基本信息(thread_info).指向内存区描述符的指针(mm_struct).进程相关的tty(tty_struct).当前目录(fs_struct).指向 文件描述符的指针(files_struct).所接收的信号(signal_struct) 进程状态:1.可运行状态(TASK_RUNNING):正在运行或者准备执行 2.可中断的等待状态(TASK_INTERRUPTIBLE):进程挂起,产生硬

Linux内核中进程上下文和中断上下文的理解

参考: http://www.embedu.org/Column/Column240.htm http://www.cnblogs.com/Anker/p/3269106.html 用户空间与内核空间 有了用户空间和内核空间,整个linux内部结构可以分为三部分,从最底层到最上层依次是:硬件-->内核空间-->用户空间.如下图所示: 需要注意的细节问题: (1) 内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据.不管是内核空间还是用户空间,它们都处于虚拟空间中.