linux内存寻址解析 (一)
1.内存地址
1.逻辑地址:每一个逻辑地址都有一个段和偏移量组成。
2.线性地址:也叫虚拟地址,是一个32位无符号整数,可以用来表示高达4GB的地址,值得范围从0x00000000到0xffffffff。
3.物理地址:用于内存芯片级内存单元寻址
内存控制单元(MMU)将逻辑地址转化成线性地址,再转化成物理地址。
2.硬件中的分段
1.段选择符(段寄存器 )
?包括:索引、TI、RPL
?存放段描述符在段表中的索引号(段编号),TI标志用于说明是是GDT还是LDT表,RPL标志权限。
2.段描述符:段描述符表中的一项,表示一段的信息:
?段的基地址(Base Address):在线性地址空间中段的起始地址。
?段的界限(Limit):即段大小,在虚拟地址空间中,段内可以使用的最大偏移量。
?段的保护属性(Attribute): 表示段的特性。例如,该段是否可被读出或写入,或者该段是否作为一个程序来执行,以及段的特权级等等。
3.段描述符放在全局描述符表GDT,或局部描述符表LDT中。能够保存在GDT中的段描述符的最大数目是8191个。
4.段寻址过程(得到线性地址)
(1.判断指令类型,确定使用哪个段寄存器
(2.读段寄存器的内容,找到存放段描述信息的数据结构。(GDTR、LDTR)
①通过TI标志,判断本次操作所用段是到全局段描述表中找,还是到局部段描述表中找
②读GDTR或LDTR寄存器中存放的地址,找到描述表的首地址
③根据段寄存器中记录的索引号从描述表首址处偏移,找到第n个描述符,既是要找的段信息。
(3.得到基地址
(4.指令地址做偏移,判断是否长度越界
(5.根据指令性质及段描述符中的访问权限判断是否越权
(6.将基地址与指令中的偏移地址相加得到实际的内存地址,完成地址映射。
5.保护的表现
(1.界限保护
?越界判断:段长参数
?特权指令:新增的GDTR或LDTR寄存器不存在与旧指令兼容问题,访问他们的指令设定为特权指令,段寄存器的访问属性仍然同以往一样无特权,既保持了兼容,又保证了程序无法故意修改段描述进行越界。
(2.权限保护
?根据段的保护属性判断是否具有访问权限。如,只读段中不允许写入。
?系统态、用户态分离。段寄存器中的后两位RPL表示请求者操作要求的特权级。GDTR或LDTR中的dpl字段设定了段的访问权限。指令段rpl标志要求的权限应不低于dpl规定的级别。特权指令只能在系统态执行。
3.Linux中的分段
1.linux中的四个段
运行在用户态的所有linux进程使用一对相同的段来对指令和数据寻址,即用户代码段和用户数据段;运行在内核态的所有linux进程也使用一对相同的段来对指令和数据寻址,即内核代码段和内核数据段。
段 |
G |
S |
DPL |
P |
0x00000000 |
0xfffff |
10 |
1 |
用户数据段 |
1 |
1 |
3 |
1 |
0x00000000 |
0xfffff |
10 |
1 |
内核数据段 |
1 |
1 |
0 |
1<span "="" style="word-wrap: break-word;"> |
2.linux段机制
他们都是从0开始,即意味着用户态和内核态下的所有进程使用相同的逻辑地址。因为段机制就是将逻辑地址转化为线性地址,也就是说在linux中分段机制并没有起到实际的作用,只是走一下过程,而linux下的逻辑地址就等于线性地址。
3.GDT和LDT
每个cpu对应一个GDT,所有的GDT都存放在cpu_gdt_table数组中,而所有GDT的地址和他们的大小被存放在cpu_gdt_descr数组中。每个GDT包含18个段描述符和14个空的。
Linux中基本不使用LDT。
4.硬件中的分页
为了效率起见,线性地址分成以固定长度为单位的组,称为页。
分页单元把所有的RAM分成固定长度的页框(也叫物理页),每个页框包含一个页,也就是说一个页框的长度与一个页的长度一致。页框是主存的一部分,也是一个存储区域。页只是一个数据块,可以存放在任何页框或磁盘中。分页单元把线性地址转化成物理地址。
把线性地址映射到物理地址的数据结构称为页表。页表放在主存中,并在启用分页单元之前必须由内核对页表进行适当的初始化。
1.常规分页:
分页单元处理4KB的页。32位的线性地址分成3个域:目录(最高10位)、页表(中间10位)、偏移量(最低12位)。
每个活动的进程必须有一个分配给它的页目录。但没有必要马上为进程所有的页表都分配RAM。正在使用的页目录的物理地址存在寄存器cr3中。线性地址中的目录字段决定页目录中的目录项,而目录项指向适当的页表。地址的页表字段又决定页表中的表项,而表项含有页所在页框的物理地址。偏移量字段决定页框内的相对位置。每一页含有4096个字节。
页目录和页表都可以多大1024项,所以一个页目录可以寻址高达1024*1024*4096=2^32.这和32位地址所期望的一样。
或者下图:
2.扩展分页:
它允许页框大小为4MB。目录字段10位,偏移量字段为22位。
3.物理地址扩展(PAE)分页机制:
32位的物理地址,由于用户进程线性地址空间的需要,内核不能直接对1GB以上的RAM进行寻址。而许多服务器需要大于4GB的RAM来运行数以千计的进程。所以Intel将管教数增加到36,现在处理器的寻址能力为2^36=64GB.
4.硬件高速缓存:
高速缓存单元插在分页单元和内存之间。
在linux设置中,对于所有的页框都启用高速缓存,对于写操作总是采用回写策略。
5.转换后援缓冲器TLB:
除硬件缓存外,还采用TLB的高速缓存来用于加快线性地址的转换。
linux内存寻址解析 (一)相关推荐
- linux内存寻址实例,Linux内存寻址
我会尽力以最简洁清晰的思路来写这篇文章. 所谓内存寻址也就是从写在指令里的地址,转化为实际物理地址的过程.因为操作系统要兼顾许多东西,所以也就变得复杂. 逻辑地址 → 线性地址 → 物理地址 逻辑地址 ...
- linux 进程装入 物理内存 页表,linux内存管理解析----linux物理,线性内存布局及页表的初始化...
主要议题: 1分页,分段模式及实模式 2Linux分页 3linux内存线性地址空间布局及物理内存空间布局 4linux页表初始化及代码解析 1.1.1内存寻址和保护模式 在X86平台上,内存控制单元 ...
- Linux内存工具解析之RSS/VSS/USS/PSS区别于联系
对于Linux系统程序开发人员,经常需要和进程所使用的内存情况打交道,比如,分析程序的内存泄漏问题.这时候我们可能使用ps.top.procrank.dumpsys(后两个命令为Android系统)来 ...
- Linux内存寻址(一):分段机制
参考链接https://www.cnblogs.com/zgq0/p/8612910.html https://blog.csdn.net/farmwang/article/details/52333 ...
- Linux内存工具解析之free
Linux系统提供了很多关于系统和特定进程对于内存的使用情况的探测和管理工具,其中最耳熟能详的就是free和top.free命令可以为用户提供系统级的内存使用情况报告,top命令更为强大,其可以提供整 ...
- Linux内存管理:内存寻址之分段机制与分页机制
目录 Linux 内存寻址之分段机制 前言 分段到底是怎么回事? 实模式的诞生(16位处理器及寻址) 保护模式的诞生(32位处理器及寻址) IA32的内存寻址机制 寻址硬件 IA32的三种地址 MMU ...
- 深入理解Linux内存映射机制
Author: wzt EMail: [email]wzt@xsec.org[/email] Site: [url]http://www.xsec.org[/url] Date: 2008-6-13 ...
- linux应用对物理内存映射,深入理解Linux内存映射机制 (1)
一. 绪 论 二. X86的硬件寻址方法 三. 内核对页表的设置 四. 实例分析映射机制 一. 绪 论 我们经常在程序的反汇编代码中看到一些类似0x32118965这样的地址,操作系统中称为线性地址, ...
- mini2440 linux 内存布局
mini2440 linux 内存布局 在学习linux内存寻址的过程中,注意到在x86架构上,分段与分页机制共存.而在RSIC体系结构下一般只支持分页.<深入理解linux内核>是在x8 ...
- Linux内存、Swap、Cache、Buffer详细解析
点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:r6d.cn/abK6G 1. 通过free命令看Li ...
最新文章
- 机器人过程自动化的10个秘密
- python中ocr软件tesseract使用
- python装饰器函数-Python精进-装饰器与函数对象
- Java多线程编程模式实战指南(二):Immutable Object模式--转载
- 所有计算机都可以安装win7,几种安装win7系统的方法介绍
- Vigenere加密法C++实现代码
- 阿里云全站加速DCDN全面支持WebSocket协议
- 开始学习 limodou 的 Django step by step 了
- dbms_java 包不存在_Oracle的sql开发之包技术实战
- journalctl命令详解,与如何查看系统日志
- 检查计算机新的更新失败,原神PC启动器检查更新失败怎么办?PC客户端报错解决方法...
- 二十年前割麦的童年(看哭了)
- 债券价格和到期收益率的关系_债券市场价格与到期收益率
- paypal支付接口说明
- Mac Gem Menu for OneNote 激活——应用任何版本
- 马托石头问题-java(大马中马小马托石头)
- 用php造了一个地址自动识别功能
- 微信游戏奇迹暖暖选取服务器失败,奇迹暖暖微信区为什么登不上_奇迹暖暖微信区登不上解决办法-66街机网...
- 浅谈图片加载:逐行扫描VS交错扫描
- 2022A特种设备相关管理(电梯)复训题库及模拟考试
热门文章
- matlab实现epirb调制,[单选] 根据《建筑安装工程费用项目组成》(建标[2003]206号)的规定,下列属于直接工程费中材料费的是()。...
- 剖析Disruptor:为什么会这么快?(一)Ringbuffer的特别之处
- WebSocket+HTML5实现在线聊天室
- ACL2016最佳论文:通过交互学习语言游戏
- 阻止picker.js插件弹出键盘
- Velocity 语法(转)
- Ubuntu桌面生存指南:Linux 的哲学
- Apache Mahout的Taste基于Hadoop实现协同过滤推荐引擎的代码分析
- HP刀片带外管理系统OA各功能实例示范
- java B2B2C 多租户电子商城系统-SpringCloud动态刷新配置信息