Linux高端内存
得到的VADDR空间中间要留一个PAGE的空(空洞),目的和上面的空开一样.你vmalloc(100)2次,得到的2个地址中间相距8K.
如果连续分配无空洞,那么比如 p1=vmalloc(4096); p2=vmalloc(4096); 如果p1使用越界到p2中了,也不会mm_falut. 那不容易debug. 下面说明VMALLOC_RESERVE和896M的问题. 上面假设机器物理512M的case. 如果机器有1G物理内存如何是好?那vmalloc()的vaddr是不是要在3G 1G 8M 空洞以上分配?超过寻址空间了吗. 这时,4G 下面保留的VMALLOC_RESERVE 128m 就派上用场了. 也就是说如果物理内存超过896M, high_memory也只能在3G 896地方.可寻址空间最高处要保留VMALLOC_RESREVE 128M给vmalloc用. 这128M的VADDR空间是为了vmalloc在物理超过了896M时候使用.如果物理仅仅有512M, 一般使用不到.VMALLOC_START很低了.如果vmalloc太多了才会用到. high_memory在arch/i386/kernel, mm的初始化中设置.根据物理内存大小和VMALLOC_RESERVE得到数值. 说那128M的内核线性地址仅仅是为了影射1G以上的物理内存的不对的.如果物理内存2G,1G以下的vmalloc也用那空间影射.总之,内核的高端线性地址是为了访问内核固定映射以外的内存资源 看vmalloc分配的东西可以用 show_vmalloc() { struct vm_struct **p, *tmp; for(p = &vmlist; (tmp = *p); p = &tmp->next) { printk("%p %p %dn", tmp, tmp->addr, tmp->size } } 用户空间当然可以使用高端内存,是正常的使用,内核在分配那些不经常使用的内存时,都用高端内存空间(如果有),所谓不经常使用是相对来说的,比如内核的一些数据结构就属于经常使用的,而用户的一些数据就属于不经常使用的. 用户在启动一个应用程序时,是需要内存的,而每个应用程序都有3G的线性地址,给这些地址映射页表时就可以直接使用高端内存. 还要纠正一点的是:那128M线性地址不仅仅是用在这些地方的,如果你要加载一个设备,而这个设备需要映射其内存到内核中,它也需要使用这段线性地址空间来完成,否则内核就不能访问设备上的内存空间了. 总之,内核的高端线性地址是为了访问内核固定映射以外的内存资源 实际上高端内存是针对内核一段特殊的线性空间提出的概念,和实际的物理内存是两码事.进程在使用内存时,触发缺页异常,具体将哪些物理页映射给用户进程是内核考虑的事情.在用户空间中没有高端内存这个概念. |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |