Linux进程虚拟地址空间

在linux中,各个进程的虚拟地址空间是独立的。各个进程的虚拟地址空间起始于0,延伸至TASK_SIZE -1.

在32 bit系统中,内核分配1GB,而各个用户空间进程可用的部分为3GB。

进程虚拟地址空间由若干个区域组成,

1.当前运行代码的二进制代码.text段。

2.程序使用的动态库代码。

3.存储区局变量和静态变量的数据段,bss,data段

4.保存动态分配数据的堆

5.保存局部变量和实现函数 调用的栈

6.环境变量和命令行参数。

7.文件内容映射到虚拟地址空间的内存映射。

具体布局如下图所示,

如果全局变量randomize_va_space设置为1,那么启用地址空间随机化机制(上图的ramdom xxx offset)。用户可以通过/proc/sys/kernel/randomize_va_space停用该特性。

每个进程都有mm_struct(linux/mm_types.h)的实例,保存进程虚拟内存管理信息。

struct mm_struct {
struct vm_area_struct *mmap; /* list of VMAs */
struct rb_root mm_rb;
#ifdef CONFIG_MMU
unsigned long (*get_unmapped_area) (struct file *filp,unsigned long addr, unsigned long len,unsigned long pgoff, unsigned long flags);
#endif
unsigned long mmap_base; /* base of mmap area */
unsigned long mmap_legacy_base; /* base of mmap area in bottom-up allocations */
unsigned long task_size; /* size of task vm space */

struct list_head mmlist; /* List of maybe swapped mm‘s. These are globally strung

unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack;
unsigned long arg_start, arg_end, env_start, env_end;

....

};

时间: 2024-08-04 10:19:11

Linux进程虚拟地址空间的相关文章

LInux进程虚拟地址空间的管理

2017-04-07 脱离物理内存的管理,今天咱们来聊聊进程虚拟内存的管理.因为进程直接分配和使用的都是虚拟内存,而物理内存则是有系统"按需"分配给进程,在进程看来,只知道虚拟内存的存在! 前言: 关于虚拟内存和物理内存这些东东,本篇不作介绍,此等基础知识参考最普通的操作系统参考书籍即可.当然有问题也可留言,我们共同学习,共同进步! 进程虚拟地址空间: 每个进程拥有一个独立的虚拟地址空间,独立怎么体现?进程A有个地址1000,进程B也有个地址1000,为何两个地址不发生矛盾,还能正常工

linux进程的地址空间,核心栈,用户栈,内核线程

linux进程的地址空间,核心栈,用户栈,内核线程 地址空间: 32位linux系统上,进程的地址空间为4G,包括1G的内核地址空间,和3G的用户地址空间. 内核栈: 进程控制块task_struct中保存了2个page大小的信息. 为什么每一个进程都是用各自的内核栈呢? 引用(http://hi.baidu.com/iruler/blog/item/0c3363f377ccc5c90a46e023.html)“ 假设某个进程通过系统调用运行在内核态(使用这个全局内核堆栈),此时如果被抢占,发生

进程虚拟地址空间之数据分区存放【转】

转自:http://blog.csdn.net/bullbat/article/details/7318269 作者:bullbat 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示windows上的结果也一样). 我们还是利用前面看到过的这个图,如下图:32位X86机器的内存布局图,内存主要分为栈.堆.BSS段.数据段.代码段5个段.   代码段:代码段(code segment/text segme

Linux进程地址空间与虚拟内存

http://blog.csdn.net/xu3737284/article/details/12710217 32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间.进程的地址空间存在于虚拟内存中.虚拟内存不能被禁用. 进程地址空间 进程地址空间分为内核空间和用户空间 因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享.于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间. A.正文段.这是由cpu执行的

[linux]进程(二)--进程地址空间

7,linux进程命名空间的概念 关于命名空间具体可以参考深入linux内核架构2.3.2章节 linux的命名空间属于操作系统级虚拟化,各个命名空间互相隔离,互相不可见,不同命名空间的进程PID可以相同,因此从操作系统层面看可能有相同的uid和pid,父命名空间同时还可以包含子命名空间,子命名空间不知道父命名空间的存在,但是父命名空间知道子命名空间的存在. 命名空间的实现:为了task_struct的精简,内核引入了struct nsproxy来统一管理进程所属的命名空间,在task_stru

Linux进程地址空间的一步步探究

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间.其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间. 那虚拟内存空间是什么呢,它与实际物理内存空间又是怎样对应的呢,为什么有了虚拟内存技术,我们就能运行比实际物理内存大的应用程序,它是怎么做到的呢? 呵呵,这一切的一切都是个迷呀,下面我们就一步一步解开心中的谜团吧! 我们来看看,当我们写好一个应用程序,编译后它都有什么东东? 例如: 用命令size a.out会得到

Linux进程地址空间的理解

对于Linux的虚拟内存的理解,这个例子算是一个很好的引导了,原文链接:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26683523&id=3201345 <Linux内核设计与实现>15章节给出的例子更详细些. ************************************************************************** 先介绍Linux进程地址空间的数据结构更方便理解,

linux进程地址空间--vma的基本操作【转】

转自:http://blog.csdn.net/vanbreaker/article/details/7855007 版权声明:本文为博主原创文章,未经博主允许不得转载. 在32位的系统上,线性地址空间可达到4GB,这4GB一般按照3:1的比例进行分配,也就是说用户进程享有前3GB线性地址空间,而内核独享最后1GB线性地址空间.由于虚拟内存的引入,每个进程都可拥有3GB的虚拟内存,并且用户进程之间的地址空间是互不可见.互不影响的,也就是说即使两个进程对同一个地址进行操作,也不会产生问题.在前面介

linux 进程地址空间的一步步探究

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间.其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间. 那虚拟内存空间是什么呢,它与实际物理内存空间又是怎样对应的呢,为什么有了虚拟内存技术,我们就能运行比实际物理内存大的应用程序,它是怎么做到的呢?呵呵,这一切的一切都是个迷呀,下面我们就一步一步解开心中的谜团吧! 进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址.虚拟地址通过页表(Pa