免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1549 | 回复: 7
打印 上一主题 下一主题

请教内存寻址的几个概念 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-06 15:41 |只看该作者 |倒序浏览
最近在看这部分,感觉很理论,有些概念很难懂。有几个疑问请教一下大家。

逻辑地址,书中给的解释是:包含在机器语言指令中用来指定一个操作数或者一条指令的地址。这个能给一个实例吗?

线性地址,可以用来表示高达4GB的地址。这个和“虚拟寻址能力可达到4GB”说的是一回事吗?这4GB的地址空间来自哪里?肯定不是物理(地址)内存。只是一个虚拟的东西吗?只是表示有这种能力?

刚搜到一个帖子

  1. 我们通常打印的地址,比如int a = 2; printf("addr = %u\n“, &a);结果是虚拟地址还是物理地址?应该是虚拟地址吧?
复制代码

我一开始以为是逻辑地址,后来的朋友都说是虚拟地址。我想肯定不是物理地址。说是“虚拟地址”是因为打印出来的地址已经经过分段单元转换了吗?那逻辑地址在这里面是什么?

谢谢大家,我迷糊了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2009-08-06 16:23 |只看该作者
这个是虚拟地址。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2009-08-06 16:24 |只看该作者
看一下九贱兄的这篇精华帖:
http://linux.chinaunix.net/bbs/thread-919019-1-1.html

论坛徽章:
0
4 [报告]
发表于 2009-08-06 16:36 |只看该作者
int a = 2; printf("addr = %u\n“, &a);

肯定是虚拟地址~  物理地址对于一切用户程序都是透明的~  

在内核中也只有MM模块会接触物理地址~

其实虚拟地址 线性地址和物理地址可以分成2层来看~

第一层是虚拟地址到物理地址
所有的程序都有自己的地址,这样在编译的时候才不会冲突,然后系统负责将这些冲突的地址转换成不冲突的地址分布在物理地址上
例如10个程序都要使用0x01这个地址,但编译器天知道这个地址有没有人使用,干脆就当没人使用编译过去
但是实际上10个程序都要使用0x01这个地址,系统就负责将这10个0x1转换成0x1-0x10这10个不冲突的地址

然后第二层是线性地址到物理地址
这层是这样的~ 我有一个程序要使用4G的内存空间,但是每个人的电脑配置都不一样,有些人有4G 有些人只有1G内存,怎么办呢?~
于是又多了1个地址,线性地址,这个地址是虚的,只是数字上存在的,用于虚拟每个用户都有4G内存
有4G内存的用户就直接给出物理地址,没有4G的用户就将不用的内存数据交换到硬盘上,这样就能空出实际的物理地址来处理新的数据~

这样说不知道LZ能明白么 = =

LZ有时间的话推荐看一下LINUX0.11内核~ 短小精悍 基本诠释了虚拟地址 线性地址 物理地址的意思~

[ 本帖最后由 superfight 于 2009-8-6 16:37 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-08-06 16:46 |只看该作者

回复 #4 superfight 的帖子 回复 #3 Godbach 的帖子

谢谢两位。


那逻辑地址呢,有实际的例子吗?

另外,superfight,说的是否有误?虚拟地址 不就是 线性地址,kernel书上是这么说的。

我刚搜到一篇文章,作者说:
1 逻辑地址:我们一般在用汇编语言写程序时可能用到 seg register :offset
2 线形地址:0x00000000~0xffffffff,用来描述进程的地址空间
3 x86上逻辑地址到线形地址的转换规则:线形地址=[seg register]+offset
4 现代操作系统进程的线形地址到物理地址的转换一般是通过分页机制来完成的
...
现代通用操作系统windows,linux,aix等在运行时都是使用线形地址而不是逻辑
地址来访问数据
,即使在硬件一级上强制用逻辑地址,但是OS都会通过将这个逻
辑地址的OFFSET=线形地址的手段处理掉这个逻辑地址问题。
...

这个说法如果是对的,那我就理解了。

论坛徽章:
0
6 [报告]
发表于 2009-08-06 16:55 |只看该作者
是使用虚拟地址就等同于使用线性地址了吧~

其实还是分开的~ 只不过为了以后移植其它平台方便~ 出了一些小技巧让这两个值相等了~

新内核的地址使用方法我还没看过~ 所以这个就不大清楚了~ = 3=

等我有时间把新内核的地址使用方法看一看~

论坛徽章:
0
7 [报告]
发表于 2009-08-07 05:54 |只看该作者
我觉得要看INTEL CPU手册。同时搞清楚运行时的环境。

首先,INTEL X86-32 CPU 提供了2个管理内存的机制:一个是分段,一个是分页。分段是最早的,古老的方式,分页是现代的。这2个机制又可以重叠或者不重叠。也就是说,可以只开启分段,而不开启分页模式。 也可以把分段和分页模式都打开。

对于每一个内存管理机制(分段或者分页),都会把地址翻译一下。对于分段,会把地址从逻辑地址(带段基地址的)翻译成物理地址(或者是线性地址,这个要看分页是否打开)。对于分页,它会把虚拟地址(也可以说是线性地址)转换成物理地址。另外,在分段和分页同时打开的时候,总是先分段的进行翻译,然后分页的再翻译。

严格来说,逻辑地址和线性地址是不一样的。逻辑地址是带了段基地址的,也就是SEG:OFFSET 的格式。但是,在现代的WINDOWS, LINUX上,分段机制没有实际在用。也就是说所有的段都是映射到同一段物理内存。所以逻辑地址也就不再需要加上段基地址了。因为所有都一样,就那一个。这时,你可以说逻辑地址就是线性地址,也可以说没有逻辑地址了。另外,我记得虚拟地址就是指线性地址。
(注意:在WINDOWS下面,有一个段还是在用的,就是FS段,如果你看的是WINDOWS下的一些内核汇编的话,会碰到FS的)

在古老(又纯真)的DOS年代(或者是现在的BIOS程序),那时CPU工作在实模式下,只有分段,没有分页。

有人也许会问,搞了个分段之后,为啥再高个分页呢?其实2者提供的功能是类似的。这个是历史原因。最早INTEL 是只提供分段的,后来发现不够灵活,才引入了分页。但是又有一些老程序在用老的分段,所以分段也保留着。 在新的INTEL X86-64 下面,分段已经寿终正寝了。

PS: 我觉得5楼说的对。

论坛徽章:
0
8 [报告]
发表于 2009-08-07 08:22 |只看该作者
进来学习一下,最近在看也在看这部分,也很迷糊,拿到Intel手册了,好好研究一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP