当前位置:  技术问答>linux和unix

请教linux内存管理问题.谢谢

    来源: 互联网  发布时间:2017-03-31

    本文导语:  一, 书上说vmalloc()在3G+896M以上线性地址空间分配连续虚拟内存,3G到3G+896M线性地址被永久固定映射到了0--896M物理地址. 问题:如果计算机的物理内存小于896M,比如512M,那么vmalloc()是不是就没有用处了? 二,ULK(understanding t...

一, 书上说vmalloc()在3G+896M以上线性地址空间分配连续虚拟内存,3G到3G+896M线性地址被永久固定映射到了0--896M物理地址.

问题:如果计算机的物理内存小于896M,比如512M,那么vmalloc()是不是就没有用处了?


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

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

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

|
>>问题:如果计算机的物理内存小于896M,比如512M,那么vmalloc()是不是就没有用处了?
物理内存多大,与vmalloc()有关系吗?
vmalloc()在3G+896M~4G线性地址空间分配连续虚拟内存
3G~3G+896M线性地址被永久固定映射到了0~896M物理地址.

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

对于用户程序来说,可见的是线性地址空间,线性地址到底映射到哪个物理内存地址,只有内核才知道
线性地址到物理内存的映射是内核和MMU单元做的事

|
一, 书上说vmalloc()在3G+896M以上线性地址空间分配连续虚拟内存,3G到3G+896M线性地址被永久固定映射到了0--896M物理地址.

问题:如果计算机的物理内存小于896M,比如512M,那么vmalloc()是不是就没有用处了?

首先,你要弄清楚为什么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区可以解决这个问题
当然还有些,我也有点淡忘了。

|
一般说来,kernel根本用不上1G的空间,也就是说1G的虚拟空间对内核已经足够了。如果你觉得不够,像路由设备(有很多的内核程序,需要很多内核空间),你可以修改内核的配置

|
将3:1的比例划分成1:1 or 跟小,这在kernel里面是允许的

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

内核0~3G的线性地址是虚拟的地址并不在内存真正的物理内存地址。

3G到3G+896M线性地址被永久固定映射到了0--896M物理地址. 3G+896M是虚拟地址。0~896M的物理地址。如果内核开启处理器MMU的话,虚拟地址到物理地址是需要进行转化的。0~3G的虚拟地址转换时,转换为不确定的物理地址,3G+896转换为固定的地址。

|
1, 如果小于896,比如512,那么物理地址的0到512M被映射到3G到3G+512M,3G+512M到4G可由vmalloc()控制。
2,大于896M的空间可以映射到0到3G空间中,这与vmalloc关系不太大,vmalloc经常应用于设备驱动中,比如一块网卡里面有一个1M的空间,很显然你不能把这1M的空间映射到应用空间的0到3G里面啊,就只能通过vmalloc映射到搞线性空间里面,然后进行访问。

    
 
 

您可能感兴趣的文章:

  • 请教一个关于内存分配的问题(系统和DMA共享一块物理内存空间)
  • 请教关于linux内存管理问题,如何给定义的变量指定固定内存段
  • 请教!Linux系统C开发的程序,为什么我的程序运行时内存持续增长,程序退出后内存也没有降低?
  • 请教redhat9上如何进行内存整理
  • 请教Linux内存分配策略与Windows有何异同?
  • 请教一个内存方面的问题
  • 请教几个虚拟内存的问题!谢谢
  • 请教一个AIX下内存分配的问题
  • 请教: gdb中能否打印内存中某个位(或某些位)的值???
  • 请教多线程程序的内存占用问题
  • 请教POSIX 和 System V 实现的内存共享的相同及不同之处
  • 请教,在linux下如何判断程序的内存泄露?
  • 请教高手,一个关于共享内存的问题。
  • 菜鸟请教有关共享内存管理的一个问题
  • 请教:linux下如何检测并控制进程的内存大小?
  • 请教:IBM AIX 4.3下面如何获得系统当前的物理内存占用率啊?
  • 请教高手如何释放内存
  • 请教关于red hat linux系统内存消耗接近100%的原因?
  • 请教查看某个特定进程内存消耗情况的命令,急!
  • 请教一个定时获取cpu、内存占用率
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 内核裁减 请教 谢谢谢谢
  • 请教:$PWD 这个东西是什么意思啊?谢谢!
  • 如何将一个jdbc数据源绑定到JNDI树上。请教!谢谢!
  • 新手请教,我用VI时按ESC键,总是回嘟嘟嘟嘟响,请问如何去掉!谢谢!
  • 请教:unix或linux下的c++标准库在哪个目录??谢谢!
  • linux起不来了,请教高手,谢谢
  • 请教unix下参数的问题,谢谢
  • 请教高手,如何在VMware下安装suse10.0??请指教,谢谢。
  • 请教Linux内存分配策略与Windows有何异同? iis7站长之家
  • 请教一个AIX题 谢谢
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题
  • 请教unix常用命令命令问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,