Linux内存管理之分段机制

逻辑地址就是我们普通的段+偏移的表现方式,而线性地址就是段+偏移之后算出来的一个地址,前者可以认

为是二维的地址,而后者可以理解是一维的。线性地址和虚拟地址的概念相接近,不知道其根本的区别。而

物理地址就是实际在地址总线上传输的地址,也就是物理内存访问的真正地址。

如上图,Linux在内存管理上,把逻辑地址通过分段机制变化成线性地址,线性地址也就是4G(32位系统)

的程序地址。线性地址再通过分页机制转化成物理地址,最后CPU去访问物理地址。

去年写个一篇关于IA32内存寻址的文章,现在再重温下。下面是一张很好的内存寻址图

采用分段机制的好处就是方便了程序员的编码,把整个地址分成不同的数据段,代码段,数据段,堆栈

等等。每个段都是动态调整的,在程序重定向的时候。那么对于每一个段的基本信息:段的起始地址,

段的长度,段的访问权限等,都会保存在段描述表中(上面的GDT),GDT是存在物理内存中的。也就说

我们普通的程序执行一条指令的时候(比如C语言中的&操作),我们操作的是一个逻辑地址,逻辑地址必须

通过段机制转化成线性地址,而根据什么转化呢?就是GDT!GDT会告诉你在线性地址哪里到哪里是你的数

据段,哪里到哪里是代码段。那么我们怎么找到GDT呢?GDT是在内存里的,这就用到寄存器GDTR了,

GDTR会告诉你GDT在内存的起始位置,然后就可以去问GDT我要访问的逻辑地址所对应的线性地址是什

么。再深入点,上面说的了GDT里面是描述每个段的基本信息的,其中就是每个段在线性地址里对应的起始

位置。

GDT里面存的是各个段的索引,叫做段选择子(Seg.Selector),现代计算机为了减少对内存访问的次数,

就把段选择子存于我们平时说的CS寄存器,DS寄存器等,这样,一个逻辑地址到线性地址的转换就大大地

加快了。

现在完整地说一遍上面分段的整个流程,对于一个逻辑地址(段:偏移),首先通过GDTR找到GDT,GDT

里面是段选择子,直接从段寄存器获得,通过段选择子找到该段在内存里的基地址,然后加上逻辑地址的偏

移部分,这就完整地得到了一个线性地址。

linux 内存 段,Linux内存储器管理之分段机制相关推荐

  1. Linux内存寻址(一):分段机制

    参考链接https://www.cnblogs.com/zgq0/p/8612910.html https://blog.csdn.net/farmwang/article/details/52333 ...

  2. linux内存段页,linux内存管理-段式和页式管理

    该博文参考国嵌视频和http://www.cnblogs.com/image-eye/archive/2011/07/13/2105765.html,在此感谢作者. 一.地址类型 物理地址:CPU通过 ...

  3. linux如何看分配固定共享内存段,Linux共享内存的查看和删除

    在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 L ...

  4. 查看linux内存优化,Linux性能优化和监控系列(三) 分析Memory使用状况

    Linux性能优化和监控系列(三) 分析Mem 分析Memory使用状况 内存是影响服务器性能的一个主要因素, 当进程已经驻留内存或者系能够分配给进程足够的内存给它, CPU能顺利自如的运行. 如果发 ...

  5. linux 内存 shared,Linux Shared Memory的查看与设置

    Linux Shared Memory的查看与设置 共享内存就是进程之间可以共享的一段内存,通过一个唯一的KEY值绑定 shmget()创建或获取 shmat()连接 shmdt()断连 共享内存的访 ...

  6. linux内存专题,linux内存浅析

    前言: 内存是linux中很重要的一块,内存不足.内存泄漏.内存溢出也是在测试项目中经常会遇到的问题. 1. 物理内存和虚拟内存 内存的读写性能要比硬盘快的多,因此,在设计上会充分利用内存进行数据的读 ...

  7. linux内存平均值,linux下查看内存使用情况[转载]

    在Linux下查看内存我们一般用free命令: [root@scs-2 tmp]# free total used free shared buffers cached Mem: 3266180 32 ...

  8. linux 内存 实例,linux内存地址分配(示例代码)

    32位下的内存地址分布图如下:1g为内核空间,3g为用户空间 内核空间:内核空间表示运行在处理器最高级别的超级用户模式(supervisor mode)下的代码或数据,内核空间占用从0xC000000 ...

  9. Linux内存page,Linux虚拟内存管理 - Page Table的作用

    虚拟内存的作用: 1. 扩展实际有限的物理内存,当然这种扩展是虚拟的,比如物理内存512M,对于一个需要1G空间的进程来说,照样可以运行.这增加了操作系统是应用范围. 2. 使得进程中的数据空间增大, ...

最新文章

  1. Linux下的软件安装方法介绍
  2. linux模式匹配,sed的模式匹配用法探讨
  3. 前端学习(1644):前端系列实战课程之上移和下移
  4. docker 远程连接 文件看不到_开发提升十倍生产力: IDEA 远程一键部署 Spring Boot 到 Docker...
  5. 搜索回溯——N皇后(hdu2553)
  6. Moss/Sharepoint:自定义 Oracle Membership
  7. 计算机专业中职好就业不,内江计算机专业中职好不好
  8. 概要设计说明书模板_实验报告的书写案例word模板
  9. chrome plugins
  10. android开发完全退出activity
  11. 在群晖NAS上使用Docker 蒲公英
  12. 精密光纤激光打标机目前技术如何
  13. 数据恢复基础和进阶教程(二)
  14. 基于动物性去思考人性
  15. 毕业设计php做个人网站,个人网站的设计与实现
  16. 《拥抱机器人时代——Servo杂志中文精华合集》——4.3 理解智能设备
  17. 干得好也要说得好| 这样向领导汇报,让你在职场上如鱼得水
  18. html内容页上一页下一页,帝国CMS内容页增加内容分页上一页标签功能!
  19. Java数组初始化长度
  20. 数据库---数据库恢复技术

热门文章

  1. java 怎么比较两个日期_如何在Java中比较两个日期?
  2. 爱迪尔 门锁接口文档_爱迪尔门锁系统接口函数(SDK)说明
  3. Uipath 学习栏目基础教学:3Uipath条件判断(if/else)
  4. OpenCASCADE绘制测试线束:拓扑命令之拓扑变换
  5. boost::proto模块实现简单的算术表达式求值器的测试程序
  6. boost::outcome模块constexpr相关的测试程序
  7. boost::log::sources::severity_channel_logger_mt用法的测试程序
  8. boost::fusion::copy用法的测试程序
  9. boost::function_types::components用法的测试程序
  10. GDCM:gdcm::StreamImageWriter的测试程序