Chinaunix首页 | 论坛 | 博客
  • 博客访问: 204897
  • 博文数量: 70
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 412
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-30 11:07
文章分类

全部博文(70)

文章存档

2014年(68)

2013年(2)

我的朋友

分类: LINUX

2014-04-17 19:50:44

虚拟地址:不同硬件平台需要都使用的一个一般性概念。CPU进行指令加载、数据的读写依赖的是虚拟地址。
线性地址:可否看成Interl 0x86平台对虚拟地址的一个别名
逻辑地址:也是特定于Interl 0x86平台存储管理特有的概念。对于其它硬件平台,也许就不存在这样的概念。
所以,与存储相关的概念,应了解多数硬件平台都支持的一般性的概念,再了解特定平台相关的专有概念

虚拟地址是3G-4G这段地址,它与物理地址通过页表来映射,逻辑地址是指3G-3G+main_memory_size这段虚拟地址,它与物理地址的映射是线性的,当然也可以通过页表映射。所以逻辑地址是虚拟地址的一部分。

逻辑地址的使用不是由内核决定的,而是由处理器决定的,段是历史造成的
X86,当要找一个字节的时候,它是由seg+offset决定的,改变了一个就改变了地址了(虽然不一定改变了物理地址)
段:偏移 就是逻辑地址,内存中任何数据都是由它们来寻找的
逻辑地址会被计算机被称作线性地址的一个32值(32位),虚拟地址也就是在分页的情况下的线性地址(我是这么理解的,很少听说虚拟地址这个说法),因为这个时候线性地址不是物理地址,通过页表映射到物理地址。如果没有分页,那么线性地址就直接是物理地址
物理地址被用来放在地址总线上寻址。

linux代码使用的都是offset字段,因为内核段的值不会改变,所以逻辑地址的offset也就是线性地址(段的基地址为0),这样就在某种层度上隐藏了段和逻辑地址


凡是通过MMU页表访问的地址都叫虚拟地址,而一旦启用了MMU,那CPU发出的所有地址都是虚拟地址
内核用到的地址范围是3G-4G(不是很精确,与CPU体系有关吧),这当然就称为内核虚拟地址了(这跟用户态的0-3G的用户虚拟地址相对应),在3G-4G这段范围内,有段子集3G -3G+main_memory_size,这段主存大小的虚拟地址空间,由于在MMU页表映射时是采用的是平坦的线性映射,在LDD里所以又给她起个专门称呼,叫内核逻辑地址
2) 用不同名字分开叫的原因,与所有的名字的作用一样,是为了方便称呼,方便描述,因此可以说,在内核代码里,对于内核逻辑地址,你可以通过简单的偏移(3G),获晓对应的物理地址,而不是内核逻辑地址的那部分内核虚拟地址,是不能获晓物理地址的

详谈高端内存和低端内存 
一、高端内存和低端内存的划分 
     Linux物理内存空间分为DMA内存区(DMA Zone)、低端内存区(Normal Zone)与高端内存区(Highmem Zone)三部分。DMA Zone通常很小,只有几十M,低端内存区与高端内存区的划分来源于Linux内核空间大小的限制。

二、来源: 
过去,CPU的地址总线只有32位, 32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间(232=4Gbit),在物理上理论上最多拥有4G内存(除了IO地址空间,实际内存容量小于4G),逻辑空间也只能描述4G的线性地址空间。 
为了合理的利用逻辑4G空间,Linux采用了3:1的策略,即内核占用1G的线性地址空间,用户占用3G的线性地址空间。所以用户进程的地址范围从0~3G,内核地址范围从3G~4G,也就是说,内核空间只有1G的逻辑线性地址空间。


如果Linux物理内存小于1G的空间,通常内核把物理内存与其地址空间做了线性映射,也就是一一映射,这样可以提高访问速度。但是,当Linux物理内存超过1G时,线性访问机制就不够用了,因为只能有1G的内存可以被映射,剩余的物理内存无法被内核管理,所以,为了解决这一问题,Linux把内核地址分为线性区和非线性区两部分,线性区规定最大为896M,剩下的128M为非线性区。从而,线性区映射的物理内存成为低端内存,剩下的物理内存被成为高端内存。与线性区不同,非线性区不会提前进行内存映射,而是在使用时动态映射。


三、例子


假设物理内存为2G,则低段的896M为低端内存,通过线性映射给内核使用,其他的1128M物理内存为高端内存,可以被内核的非线性区使用。由于要使用128M非线性区来管理超过1G的高端内存,所以通常都不会映射,只有使用时才使kmap映射,使用完后要尽快用kunmap释放。


对于物理内存为1G的内核,系统不会真的分配896M给线性空间,896M最大限制。下面是一个1.5G物理内存linux系统的真实分配情况,只有721M分配给了低端内存区,如果是1G的linxu系统,分配的就更少了。


MemTotal   1547MB


HighTotal     825MB


LowTotal     721MB


申请高端内存时,如果高端内存不够了,linux也会去低端内存区申请,反之则不行。



阅读(1001) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~