linux内存布局及页面映射

本文介绍了Linux系统中,32位x86架构下进程的4GB虚拟地址空间分为用户空间和内核空间。用户空间包括代码段、数据段、堆和栈,而内核空间包含物理内存映射等区域。内核通过页表进行地址映射,用户空间到物理地址需经过内核空间。高端内存和DMA内存区域各有特定用途。Linux通过动态映射处理高端内存访问。了解虚拟地址到物理地址的转换、设备IO地址映射和内存管理是深入理解的关键。
摘要由CSDN通过智能技术生成

       在Linux系统中,以32bit x86系统来说,进程的4GB内存空间(虚拟地址空间)被划分成为两个部分

------用户空间和内核空间,大小分别为0-3G,3-4G。

       用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间。

 

       每个进程的用户空间存放用户的程序和代码(堆栈,数据区,代码区等),因为是虚拟地址,所以每个进程的用户空间是完全独立的,互不影响。用户进程有自己的进程页表。

      内核空间是内核负责映射物理地址的(所有的进程共享一份内核空间的映射???这个还不太确定),内核空间有自己对应的页表,它与用户空间是独立的。

 

1.我们先来看一下用户空间的内存布局(即进程在内存的布局--C运行时库对内存的分配和管理)(下图中0--3G的范 围):

 

    从上图我们可以看到,用户进程的代码区一般从虚拟地址空间的0x08048000开始,这是为了便于检查空指针。代码区之上便是数据区,未初始化数据区,堆区,栈区,以及参数、全局环境变量。用户空间内存布局可以分为以下几个方面(用户程序中所申请分配的都是用户空间的虚拟地址):

   代码段(.text/ code segment):这里存放程序执行代码(cpu要执行的指令)的一块内存区域。这部分区域在程序运行前就确定了,通常情况下是只读的(防止程序由于错误而修改自身指令)。某些结构也允许代码段可写,即可以修改程序。代码段是可以共享的,相同的代码在内存中只有一份拷贝。除了代码外,这个区域里面也可能包含一些只读的常数变量,如字符串常量  char *p="12345" ,这里“12345”就存在代码段里面。


    初始化数据段(.data segment):这里存放的是程序中需要明确赋初始值的变量,如已经初始化的全局变量。数据段属于静态内存分配。包括static变量。


    未初始化数据段(.bss):存放未经初始化的全局变量。内核在执行该程序前,将其初始化为0或者null。BBS(block started by symbol), 属于静态内存分配。

   堆(Heap):存放程序中进行动态内存申请,例如经常用到的malloc,new系列函数就是从这个段中申请内存。堆的大小不固定,可以动态增加(malloc)和缩减(free)

    栈(Stack):又称堆栈࿰

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值