linux内存寻址实例,Linux内存寻址

我会尽力以最简洁清晰的思路来写这篇文章。

所谓内存寻址也就是从写在指令里的地址,转化为实际物理地址的过程。因为操作系统要兼顾许多东西,所以也就变得复杂。

逻辑地址 → 线性地址 → 物理地址

逻辑地址 = 段 + 偏移量

因为:最开始cpu中的alu宽度只有16位,但地址总线宽度有20位。所以设置四个段寄存器:cs(指令),ds(数据),ss(堆栈),es(其它)。

每个段寄存器16位,对应地址总线高16位。每条指令中的16位内部地址与某个段寄存器中内容相加,得到20位的实际地址。

上述的16位内部地址到20位实际地址的转换还是8086的时代。

到了80386,32位cpu的时代,许多情况都发生改变。其中一点:要实施“保护模式”。还要兼容过去的段寄存器。

于是,之前的公式从新写为:

逻辑地址 = 段选择符(16位) + 偏移量(32位)

所以对80386cpu的寻址还是要基于从前8086寻址方式来理解,《linux内核源代码情景分析》中这样描述:

50ba46eecbe5d18112fdd2b0061e4306.png

可简单记为:段寄存器(段选择符) → 地址段描述结构(段描述符) → 基地址 → 指令中发出的地址 + 基地址 = 物理地址

地址段描述结构(段描述符) 从何而来:在cpu中增设两个寄存器,一个是全局性的段描述表寄存器GDTR;一个是局部性的段描述表寄存器LDTR。

段描述符地址  =  段选择符index字段×8 + gdtr/ldtr寄存器中的值

这张图可以表现,怎样由段寄存器(段选择符)得到段描述符 。

04a6023c2b6848fc105aa1987419ec48.png

段选择符得到“段”的过程,一种是访问段描述表得到段描述符。

另外还可以通过非编程寄存器,不访问段描述表得到段描述符。

总之,是段选择符(段寄存器) → ( 段描述符表 → )段描述符 → 基地址的过程。

08f6703235278680f811054910eba429.png

段描述符:

2105a07b5cca347d9d6251c54a3a63bb.png

继续推导之前的式子:

段描述符的获得:段选择符index字段×8 + gdtr/ldtr寄存器中的值

基址 = 段描述符Base字段

逻辑地址 = 段选择符(16位) + 偏移量(32位) = 段描述符Base字段 + 偏移量

6f3ab48693e90398d91e246d1c4ce58a.png

参考资料:

《汇编语言》王爽

《linux内核源代码情景分析》毛德操

《Understanding the Linux Kernel》Daniel P. Bovet / Marco Cesati

Linux内存寻址之分页机制

在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性—物理地址的转换过程.段 ...

Linux内存寻址之分段机制及分页机制【转】

前言 本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制: 最近在学习Linux内核,读到的内存寻址一章.原本以为 ...

Linux内存寻址之分段机制

前言 最近在学习Linux内核,读到的内存寻址一章.原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解.于是,查找了很多资料,最终理顺了内存寻址的知识. ...

Linux内核源码分析 day01——内存寻址

前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...

Linux内存管理1---内存寻址

1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...

【读书笔记::深入理解linux内核】内存寻址【转】

转自:http://www.cnblogs.com/likeyiyy/p/3837272.html 我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0 ...

【读书笔记::深入理解linux内核】内存寻址

我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开 ...

linux内存管理

一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...

探索 Linux 内存模型--转

引用:http://www.ibm.com/developerworks/cn/linux/l-memmod/index.html 理解 Linux 使用的内存模型是从更大程度上掌握 Linux 设计 ...

随机推荐

folder、source folder、package 区别与联系

在eclipse下,package,source folder,folder都是文件夹.  它们的区别如下:  package:当你在建立一个package时,它自动建立到source folder下 ...

kendo-ui学习笔记——题记

1.Kendo UI基于最新技术HTML5.CSS3和JavaScript标准设计开发.2.官方网址:http://www.kendoui.com/3.API网上查阅英文版网址:http://docs ...

让低版本的IE浏览器 强制渲染为IE8 或者 以上 浏览器模式

让低版本的IE浏览器 强制渲染为IE8 或者 以上 浏览器模式 那么就要用下面的方法:让网页兼容ie9 复制代码 代码如下:  

Go语言搭建自己的博客

我是如何用Go语言搭建自己的博客的   前言: 话说,已经很久没有在博客园更新博客了,之前写的关于go语言的系列学习文章也由于种种原因一度中断.但是,正如我之前在文章中所 ...

转:深入Java集合学习系列:HashSet的实现原理

0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特 ...

JS 显示隐藏DIV

JS关闭DIV HTML

关闭&l ...

Eclipse下内存溢出错误(OutOfMemoryError)

写了一个图片缩放程序,当图片尺寸过大时会报错: Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: ...

activity 与 fragment生命周期

一.Activity的生命周期图: 二.Fragment生命周期图 三.对比图 Log数据 Activity﹕    onCreateFragment﹕ onAttachFragment﹕ onCre ...

Hello Vizhub

VizHub.com 一.介绍 Vizhub是一个使用D3.js和svg进行数据可视化的教学练三位一体的平台. 并且可以把在线编辑的代码保存到网站中. 右上角可以使用github账号登录. 二.Get ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值