Linux页框级内存管理处理细节
弄清楚伙伴系统算法的原理以后,我们就可以开开心心地处理页框了。
我们可以通过6个稍有差别的函数和宏请求页框。一般情况下,他们都返回第一个所分配页的线性地址,或者分配失败则返回NULL。
alloc_pages(gfp_mask, order):用这个函数请求2order 个连续的页框。他返回第一个所分配页框描述符的地址,或者如果失败,则返回NULL。
alloc_page(gfp_mask):用于获得一个单独页框的宏,它其实只是alloc_pages(gfp_mask, 0)。它返回所分配页框描述符的地址,或者如果分配失败,则返回NULL。
_ _get_free_pages(gfp_mask, order):该函数类似于alloc_pages( ),只不过它返回第一个所分配页对应的内存线性地址。
_ _get_free_page(gfp_mask):用于获得一个单独页框的宏,它也只是__get_free_pages(gfp_mask, 0)
get_zeroed_page(gfp_mask):函数用来获取满是0的页面,它调用alloc_pages(gfp_mask | __GFP_ZERO, 0),然后返回所获取页框的线性地址。
_ _get_dma_pages(gfp_mask, order):该宏获取用于DMA的页框,它扩展调用__get_free_pages(gfp_mask | _ _GFP_DMA, order)。
参数gfp_mask是一组标志,它指明了如何寻找空闲的页框:
标志
说明
_ _GFP_DMA
所请求的页框必须处于ZONE_DMA 管理区。
_ _GFP_HIGHMEM
所请求的页框处于ZONE_HIGHMEM 管理区
_ _GFP_WAIT
允许内核对等待空闲页框的当前进程进行阻塞
_ _GFP_HIGH
允许内核访问保留的页框池
_ _GFP_IO
允许内核在低端内存页上执行I/O 传输以释放页框
_ _GFP_FS
如果清0,则不允许内核执行依赖于文件系统的操作
_ _GFP_COLD
所请求的页框可能为“冷的”
_ _GFP_NOWARN
一次内存分配失败将不会产生警告信息
_ _GFP_REPEAT
内核重试内存分配直到成功
_ _GFP_NOFAIL
与__GFP_REPEAT 相同
_ _GFP_NORETRY
一次内存分配失败后不再重试
_ _GFP_NO_GROW
slab 分配器不允许增大slab 高速缓存
_ _GFP_COMP
属于扩展页的页框
_ _GFP_ZERO
任何返回的页框必须被填满0
下面4个函数和宏中的任意一个都可以释放页框:
_ _free_pages(page, order):该函数首先查找page指向的页描述符;如果该页框未被保留(PG_reserved标志为0),就把描述符count字段减1。如果count字段变为0,就假定从page对应页框开始的2order个连续页框不再被使用,在这种情况下,该函数释放页框。
free_pages(addr, order):这个函数类似于 _ _free_pages( ),只不过它接收的参数为要
相关文档:
一:前言
最近在研究android的sensor driver,主要是E-compass,其中用到了Linux input子系统.在网上也看了很多这方面的资料,感觉还是这篇分析的比较细致透彻,因此转载一下以便自己学习,同时和大家分享!
(这篇博客主要是以键盘驱动为例的,不过讲解的是Linux Input Subsystem,可以仔细的研究一下!)
键盘驱动将检 ......
//获取本机MAC地址函数QString GetLocalMac()
{
int sock_mac;
struct ifreq ifr_mac;
char mac_addr[30];
sock_mac = socket( AF_INET, SOCK_STREAM, 0 );
if( sock_mac == -1)
{
perror("create socket falise...mac\n");
return "";
}
memset(&ifr_mac,0,sizeof(ifr_mac));
......
不常用但非常实用的命令
UNIX命令是测试必备的知识,除了一些常用的命令需要熟悉以外,有很多非常有用但是不常用的命令也需要了解,这样对工作有很大的帮助,这里提供一些我平常工作中累积的知识,希望能帮助到大家 ^_^
1、统计所有文件中的记录数:wc -l filename
2、查看共享内存:ipcs -m
3、vi中的批量字符匹配(a- ......
测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%。同等情形下Windows上测试,仅丢几条数据。形势严峻,必须解决。考虑可能是因为协议栈Buffer太低所致,于是先看看默认情况:
sysctl -a |grep net.core
发现
net.core.rmem_max = 131071
net.core.rmem_default = 11264 ......