- 论坛徽章:
- 0
|
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 编辑 ] |
|