我们知道内核管理物理内存,其实除了管理本身内存外,还必须管理用户空间中进程的内存,我们称这个内存为进程地址空间,也就是系统中每个用户空间进程所看到的内存。

传统的C语言编译出来的进程地址空间包含哪些对象呢?可以参照ELF文件格式对应看:

-->可执行文件代码的内存映射,称为代码段。【ELF中的代码段】

-->可执行文件的已初始化的全局变量的内存映射,成为数据段。【ELF中的数据段】

-->未初始化的全局变量,也就是bss段的零页。由于未初始化的变量没有对应的值,所以不需要放在可执行对象中,但是C标准规定了所有未初始化全局变量要被赋予特殊的值,所以内核需要将变量从可执行代码载入到内存中,然后把零页映射到该片内存上。【ELF中的bss段】

所以全局变量是否初始化影响该变量在可执行文件中的位置,初始化的全局变量在数据段,未初始化的全局变量在bss段且默认置0。

另外,静态变量也就是static变量,和全局变量在内存中的处理相同,即初始化的static变量放在数据段,未初始化的static变量放在bss段,static变量和全局变量的不同在于语言层面上的作用域不同。

-->用于进程用户空间栈的零页内存映射(不同于内核进程栈)。堆栈段是进程运行时使用,所以在可执行文件中不需要实际分配。【动态分配】

-->每一个诸如c库或者动态链接库等共享库的代码段,数据段和bss段也会被载入进程的地址空间。当然静态库会编译到可执行文件中,而动态的共享库需要运行时载入。【动态分配】

-->任何内存映射文件,任何共享内存段,任何匿名的内存映射,比如malloc分配的内存。【动态分配】

每个用户进程看到的内存或多或少都是上面的几部分,但是这些内存是怎么和CPU交互,需要内核做什么呢?

当内核将CPU使用权交给这个进程时,指向代码段的寄存器会被内核写入这个进程的代码段地址。

地址的分类:

逻辑地址:包含在机器语言中用来指定一个操作数或者一条指令的地址。每一个逻辑地址由一个段和偏移量组成,偏移量指明了从段开始的地方到实际地址之间的距离。

所以,逻辑地址一般是表示在可执行文件中机器语言所使用的地址,语境一般在可执行文件的机器指令中。内核一般不使用逻辑地址这个概念。

线性地址(或叫虚拟地址):是否用于描述内核中的地址。

物理地址:用于内存芯片级内存单元寻址。

CPU中有一个用于将逻辑地址直接映射为物理地址的控制线路,它叫MMU。内存控制单元(MMU)通过一种分段单元的硬件电路把一个逻辑地址转换成线性地址,接着,通过一个分页单元的硬件电路将线性地址转换为一个物理地址。就是说,一个hello可执行文件的机器指令,在使用比如一个定义的全局变量时,可以不通过内核,结合当前进程页表,通过MMU将全局变量的逻辑地址转换为实际的物理地址。

原文:http://www.cnblogs.com/minihaohao/p/5175056.html

static在内存层面的作用_虚拟地址空间--用户进程看到的自己所占用的内存相关推荐

  1. static在内存层面的作用_「C++ Primer plus 心得」9.内存模型和名称空间

    本章内容包括: 单独编译 存储持续性.作用域和链接性 定位new运算符 名称空间 C++ 为在内存中存储数据方面提供了多种选择.可以厅数据保留在内存中的时间长度(存储持续性)以及程序的哪一部分可以访问 ...

  2. Windows内存体系(1) -- 虚拟地址空间

    一.实模式下内存分配机制 在8086或者80186以前,要运行一个程序,操作系统会把这些程序全都装入内存,程序都是直接运行在物理内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址.当计算机同 ...

  3. static在内存层面的作用_static关键字总结

    static,即静态声明.它在 作用域.存储方式.生命周期 等各方面影响一个变量或函数.文章将从 局部变量.全局变量.普通函数.类的static成员(包括数据成员与成员函数)来总结static. 全局 ...

  4. static在内存层面的作用_static的作用和内存划分?

    有时希望函数中的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次再调用的时候该变量已经有值.这时就应该指定该局部变量为静态变量,用关键字 static 进行声明. ...

  5. static在内存层面的作用_C++内存管理笔记

    第一部分--基础部分 1.内存分配层次 C++ 申请内存分配: 1. CRT : malloc / free 2. C++ primitives : new , new[] , new() , ::o ...

  6. java内存分配模型优点_高并发实战(二)-并发基础 缓存 MESI 内存模型

    左图为高速缓存 右图为多级缓存 数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一条特殊的快速通道.主存与高速缓存都是连接在系统总线上,当然其他组件也是在此基础上进行通信的. 在高速缓存出现后不 ...

  7. TF卡里删掉文件后内存没变大_不用第三方,手机自带软件也能清扫内存!教你4个清理技巧...

    手机使用一两年后,难免会堆积了很多文件占用手机内存,今天花部长就来给大家发干货,教你如何正确地清理内存和缓存,让手机运行恢复流畅. 1.手机管家,一键清理 大家应该都知道,清理内存最直接的方法就是打开 ...

  8. TF卡里删掉文件后内存没变大_不用第三方,手机自带软件也能清扫内存!教你4个正确清理技巧...

    手机使用一两年后,难免会堆积了很多文件占用手机内存,今天花部长就来给大家发干货,教你如何正确地清理内存和缓存,让手机运行恢复流畅. 1.手机管家,一键清理 大家应该都知道,清理内存最直接的方法就是打开 ...

  9. linux内核1G虚拟地址空间的映射规则以及什么是高端内存?

    前面我们讲了,在32位linux内核里,内核地址空间是0xc0000000~0xffffffff, 大小1G:内核地址空间是0x00000000~0xbfffffff,大小3G.当内核代码访问内存时, ...

最新文章

  1. 美国多个州对谷歌提起新的反垄断诉讼
  2. Meta首个元宇宙平台Horizon被吐槽,用户只配有半截身子!
  3. altium designer PCB板厚度设置
  4. C# Keycode对照表
  5. 使用VC++ 读取显示DEM文件
  6. Javascript面向对象编程(二):构造函数的继承
  7. 从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装
  8. 基于ARM Cortex-M和Eclipse的SWO单总线输出
  9. Spring Boot集成Swagger
  10. mysql 实施索引_MySQL 索引实现
  11. 生成的头_谷歌新款怪物制造机,用GAN一键生成定制版哥斯拉
  12. 一个简单的(基于redisson的)分布式同步工具类封装
  13. 职场004: 开放心态的意义
  14. Elasticsearch可视化管理工具dejavu的安装使用
  15. python爬取京东评论怎么翻页_爬取京东网页评论(动态网页)
  16. 【解题报告】博弈专场 (CF 2000~2200)前五题
  17. [Python] 黑白棋(翻转棋)小游戏
  18. 他说:“程序员是出轨率最高群体”,然后就被解约了...
  19. 国家级荣誉!烽火参建的这个项目获“鲁班奖”
  20. 使用TPFanCtrl2 控制 Thinkpad P15v Gen1的风扇噪音

热门文章

  1. Teradata QA Tester 职位
  2. Matlab mean() mean2() std() 函数的使用
  3. GPU视频解码之CUVID
  4. 详解/etc/profile、/etc/bash.bahsrc、~/.profile、~/.bashrc的用途
  5. Kinect学习(五):提取带用户ID的深度数据
  6. Caffe官方教程翻译(9):Multilabel Classification with Python Data Layer
  7. Caffe官方教程翻译(8):Brewing Logistic Regression then Going Deeper
  8. 三维重建学习(1):基础知识:旋转矩阵与旋转向量
  9. 重置忘记的mysql root密码
  10. 判断丑数python_LintCode Python 简单级题目 517.丑数