毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> linux >> 正文

linux内存管理问题 第2页

更新时间:2013-1-21:  来源:毕业论文
首先,你要弄清楚为什么kernel会给我们提供应该vmalloc函数供我们调用。试想一下,如果你的操作系统长期运行,现在我们要分配一块较大的内存(eg:2M),现在的空闲内存其实还有很多,但是就是找不到连续的内存,如果用kmalloc分配,那么肯定会失败。为什么?因为kmalloc分配的内存不仅是在虚拟空间上面是连续的,并且在物理空间上面也是连续的(因为此时的物理地址到虚拟地址是一致性映射 (32bit机器:默认phy + 0xc0000000))。那么这时候不就分配不到内存了,别急!kernel不是为我们提供了vmalloc吗?它就想用户空间分配的内存一样,分配的虚拟地址是连续的,而物理内存不一定是连续的,它分配的虚拟地址会在VMALLOC_START(896M + 8M)~VMALLOC_END之间。

所以,其实你指的3G+896M是指的虚拟空间,而当你的内存只有512M时,照样是可以映射到VMALLOC_START~VMALLOC_END之间。

二,ULK(understanding the linux kernel)书中说:
.从0到3G的线性地址空间,无论用户态还是内核态都可以访问寻址.

.从3G到4G的线性地址空间,只有内核态可以访问寻址.

问题:既然内核态可以访问0到4G的所有线性地址,那么所谓的大于896M的高端物理内存,内核不就可以通过0到3G的线性地址来映射访问吗?

同样的道理,内核分配内存的虚拟空间是3G~4G(可配置),也就是说分配内存时,只有这么大的虚拟空间(0~3G给用户,当然内核可以访问用户态的内存,这里说的是分配内存)。用一个high_memory(896M)就是为了防止以下几点:

  1,像上面所说的,实际内存还很多时,而连续内存很少,这样我们可以定义一个vmalloc区解决这个问题。
  2,如果实际内存大于1G,那么我们需要kernel也能分配大于1G的物理地址到内核空间(3G~4G)。fix_map区可以解决这个问题
当然还有些,我也有点淡忘了。

上一页  [1] [2] 

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。