Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1362777
  • 博文数量: 118
  • 博客积分: 3888
  • 博客等级: 中校
  • 技术积分: 2940
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-10 18:15
个人简介

一看二做三总结

文章分类

全部博文(118)

分类: LINUX

2011-05-15 18:41:20

 

本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,并注明原作者及原链接,严禁用于任何商业用途。
作者:fireaxe_hq@hotmail.com
博客:fireaxe.blog.chinaunix.net 

 

如果申请的内存是低端内存,因为低端内存一直都被映射在内核页表中,因此只需要一个page_address()函数就可以完成转换,也就是图中的线性映射。

如果申请的是高端内存,就没有这么简单了。

首先,如果可以在高端申请到足够的内存,需要先在非线性区映射,操作结束后在解除映射,我们可以使用kmap()kunmap()解决这个问题。如果高端内存找不到足够的内存,则会在低端内存区分配一块,此时也该回调用kmap()kunmap()函数,但内部实现时就只是调用page_address()获取地址,而不需要再映射到非线性区。

 

1.       进程空间内存分配

malloc/free:最常用的内存分配函数

valloc/free:分配的内存按页对齐

 

2.       内核空间内存分配

__get_free_pages/free_pages:分配制定页数的低端内存,不能分配在高端

Alloc_pages/__free_pages:分配izhiding页数的内存,可以是高端内存

Kmalloc/kfree:分配的内存物理上连续,只能在低端分配

Vmalloc/vfree:分配的内存在内核空间中连续,物理上无需连续。Vmalloc由于不需要屋里也连续,会造成TLB抖动,所以性能很差,一般只有在必须申请大块内存时才使用,如动态插入模块时。

 

本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,并注明原作者及原链接,严禁用于任何商业用途。
作者:fireaxe_hq@hotmail.com
博客:fireaxe.blog.chinaunix.net 
阅读(6177) | 评论(6) | 转发(4) |
给主人留下些什么吧!~~

GFree_Wind2011-05-16 12:10:54

为啥3G~3G+896为非线性区呢?这个区域不是高端内存可以一一映射的区域吗?