虚拟地址、物理地址
很新的新手看这篇文章,可能有些地方暂时没办法理解,跳过不看没关系的(文中对这些地方进行了标记)。[*]理解“虚拟地址-物理地址”这对概念,首先要理解“程序-进程”的区别。
可以拿生活中更为常见的“剧本-电影”来对比理解,对于剧本来说,“张飞”由一个抽象的文字符号表示,对于电影来说,张飞由一个具体的演员饰演,同样一部《三国演义》,可以由不同阵容的演员拍摄成不同版本的电影,剧本是对故事的抽象描述,电影是对故事的具体展现。
回到“程序-进程”这对概念,程序是用计算机语言表达了一个通用且抽象的思路(通常是描述一个问题的解决方法),比如一段“交换两个变量值”的程序,不光计算机在交换两个数字时可以按照这样的思路去执行,生活中某些场合也可以按照这样的思路执行,比如强强发现萌萌的苹果比自己的小,为了表示关爱,他就把自己的大苹果放到果盘,然后把萌萌的小苹果抢过来,再告诉萌萌去果盘拿大苹果。而进程正是特指在计算机的环境执行程序表达的逻辑。
程序如同兵法,为了描述如何排兵布阵,需要用到一些代号,还是拿“交换两个数字”举例,可以这样描述:
① 把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,会非常不明白为什么会设计成这样(具体后面再一起学习)。
你也是挺拼的。赞 学习了! :em02: 学习了,期待后续总结
页:
[1]