免费注册 查看新帖 |

Chinaunix

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

[内核入门] 虚拟地址、物理地址 [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-09-14 18:58 |只看该作者 |倒序浏览
很新的新手看这篇文章,可能有些地方暂时没办法理解,跳过不看没关系的(文中对这些地方进行了标记)。


  • 理解“虚拟地址-物理地址”这对概念,首先要理解“程序-进程”的区别。

    可以拿生活中更为常见的“剧本-电影”来对比理解,对于剧本来说,“张飞”由一个抽象的文字符号表示,对于电影来说,张飞由一个具体的演员饰演,同样一部《三国演义》,可以由不同阵容的演员拍摄成不同版本的电影,剧本是对故事的抽象描述,电影是对故事的具体展现。

    回到“程序-进程”这对概念,程序是用计算机语言表达了一个通用且抽象的思路(通常是描述一个问题的解决方法),比如一段“交换两个变量值”的程序,不光计算机在交换两个数字时可以按照这样的思路去执行,生活中某些场合也可以按照这样的思路执行,比如强强发现萌萌的苹果比自己的小,为了表示关爱,他就把自己的大苹果放到果盘,然后把萌萌的小苹果抢过来,再告诉萌萌去果盘拿大苹果。而进程正是特指在计算机的环境执行程序表达的逻辑。

    程序如同兵法,为了描述如何排兵布阵,需要用到一些代号,还是拿“交换两个数字”举例,可以这样描述:
    ① 把1号位置的数字放到3号位置
    ② 把2号位置的数字放到1号位置
    ③ 把3号位置的数字放到2号位置

    程序并不关心1、2、3的值本身,用7、3、100三个数字也可以表达出同样的逻辑,只要保证不冲突即可。还是换到《三国演义》里面,如果把全书中的“张飞”替换成另外一个不冲突的名字,故事情节仍然一样,但如果替换成“赵云”,那就会矛盾重重了,导演就没办法导了。
那么程序在编写、编译、执行这几个阶段中,都由谁来保证不“冲突”呢?首先程序员要保证程序中“变量名代号”的含义不冲突,其次,编译器会保证将不冲突的“变量名代号”替换成不冲突的“数字代号”(需要了解ELF格式,编译链接原理)最后,内核保证将经过编译后的“数字代号”映射为不冲突的“实际内存地址值”,内核建立了不冲突的映射关系,硬件根据映射关系映射得到的物理地址自然也不会有问题(需要了解CPU的MMU原理和Linux内存管理知识)

  • 顺便再想一下哪些情况会冲突呢?
    ① 32位系统中,“数字代号”由32位数字表示,即最多可以同时使用2^32个,那么当程序中的变量极端的多,编译器就有可能没办法找到更多的代号替换变量(对于上述这种交换变量的逻辑来说,少于3个代号就没办法描述了,自然不能排除少于2^32个就没办法描述的程序);
    ② 运行时动态分配出来的大块空间,内核也会相应的建立一大块虚拟地址(代号)与物理地址映射,比如malloc(4G),即使开启页式内存管理和交换分区功能,物理内存虽然可以到真正要用的时候再分配,或者即使正在用,也可以被换出到磁盘,但虚拟地址还是要求系统能一下子给到位的,否则访问到某个虚拟地址时,怎么知道是还没分配还是只是对应的物理内存没有分配呢(这里看不懂也没关系,后面一起学习)。

  • 撇开还没有学过的知识,感性的总结一下“虚拟地址-物理地址”(本文目标,希望新手朋友,可以理解了呀):
    虚拟地址就是我们的程序编译后,编译器把我们的“变量代号”替换成的“数字代号”。
    物理地址就是根据内核设置的映射关系,每个虚拟地址对应的那个地址。我们不妨先把这些内存条中大量的电子管或晶体管按从左到右、从上到下编号,认为是内存的物理地址,那么CPU不是直接拿虚拟地址的值去找相应的电子管或晶体管,而是根据根据物理地址的值去找。


  • 一一映射也是映射,也不需要内核去建一张表了,程序里什么地址,执行时就用什么地址,多简单,为什么内核不采取一一映射?
    远古计算机时代的应用程序,以及现代计算机系统程序刚启动的一段时间,CPU处于“实模式”状态,正是用所谓的“一一映射”。然而实模式的弊端很容易想到,不同程序包含相同的“数字代号”时,它们同时执行时就会相互干扰(注意“进程间通信”是可控的,而干扰是不可预测的),所以计算机大牛们后来发明了“保护模式”。
    为了支持新出现的保护模式,硬件方面也要升级,增加一些新特性(需要了解一种CPU,比如Intel i386 CPU)。硬件升级的原因很多,其中内核对于“虚拟地址→物理地址”的映射,开始只有段式映射这一种方法,后来才发明页式映射这种更先进的内存管理方式,所以这也迫使硬件升级,而段式内存管理和页式内存管理实际上就是两种不种的“虚拟地址→物理地址”映射方法,相互没有任何依赖关系,本可以用其一即可,但Intel x86系列CPU考虑到对老版本的兼容,不光加入了用于实现页式映射映射的新特性,还保留了用于支持段式映射的旧特性,所以映射到最终的物理前,要多经过一步映射,即逻辑地址→线性地址(段式映射)→物理地址(页式映射),导致内核如果想支持Intel X86 CPU,就必须设置两个映射关系,而又明知道在保护模式时,段式映射是多余的,所以该“糊弄”的就糊弄,此外如果不了解Intel X86 CPU对许多兼容性的考虑,直接去学个系列的CPU,会非常不明白为什么会设计成这样(具体后面再一起学习)。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
2 [报告]
发表于 2016-09-15 09:01 |只看该作者
你也是挺拼的。赞

论坛徽章:
4
程序设计版块每日发帖之星
日期:2016-08-11 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-14 06:20:00数据库技术版块每日发帖之星
日期:2016-08-14 06:20:00
3 [报告]
发表于 2016-09-15 18:23 |只看该作者
学习了!

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:13:29
4 [报告]
发表于 2016-09-18 15:41 |只看该作者
学习了,期待后续总结
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP