Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1346681
  • 博文数量: 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 
阅读(6071) | 评论(6) | 转发(4) |
给主人留下些什么吧!~~

fireaxe2011-05-22 18:39:28

GFree_Wind: 你理解错我的意思了。我的意思是说896以下的是一一映射,可是图中为什么没有看到.....
呵呵,确实忘画了,已改正

GFree_Wind2011-05-21 22:40:12

fireaxe: 在上篇文章中有过说明,内存常常是超过1G,内核的1G线性映射显然不够。另外,为了保证内核有地址空间去映射某些外设,需要预留一部分地址空间。既然如此还不如留.....
你理解错我的意思了。我的意思是说896以下的是一一映射,可是图中为什么没有看到

fireaxe2011-05-21 17:34:14

GFree_Wind: 为啥3G~3G+896为非线性区呢?这个区域不是高端内存可以一一映射的区域吗?.....
在上篇文章中有过说明,内存常常是超过1G,内核的1G线性映射显然不够。另外,为了保证内核有地址空间去映射某些外设,需要预留一部分地址空间。既然如此还不如留一部分出来做机动映射,需要用哪块内存就映射哪块。因此,物理内存概念上的高端内存与内核空间中的非线性区不不会是一一映射,也无法做到一一映射

fireaxe2011-05-21 16:58:20

kgatheko: 3G以上的不都是内核空间吗?不都是线性映射区麼?.....
内核区分为线性映射与非线性映射。内核要管理全部内存,比如物理内存为2G,如果完全采取线性映射,只能管理1G,所以linux内核只线性映射一部分,其他的做非线性映射。所谓的非线性映射,就不是简单的物理地址加3G便宜这么简单了。

kgatheko2011-05-17 09:43:51

3G以上的不都是内核空间吗?不都是线性映射区麼?