Linux内核分配内存的方式
page = alloc_pages(GFP_KERNEL, get_order(1234));
分配失败返回NULL
GFP_KERNEL ---> 分配标志,当没有足够内存分配时,睡眠阻塞,直到有内存分配
其他常用分配标志 GFP_ATOMIC,不会阻塞,没有足够内存分配时返回错误
分配2的get_order(1234)次方个页框
分配页框,如果分配多个页,分配的多个页在物理地址上是连续的
释放连续的页框
__free_pages(page, get_order(1234));
unsigned long p;
p = __get_free_pages(GFP_KERNEL, get_order(1234));
失败返回0
成功返回虚拟地址
释放连续的页框
free_pages(p, get_order(1234));
分配内存
void *p;
p = kmalloc(1234, GFP_KERNEL);
一般来说,kmalloc通常用于分配少量内存,保证可移植一般不超过128k
分配内存:
在虚拟地址上连续, 在物理地址上也连续
kzalloc();
kfree(p);
void *p;
p = vmalloc(0x900000);
一般来说,vmalloc通常用于分配大量内存,
分配内存:
在虚拟地址上连续, 在物理地址上不一定连续
vfree(p);
使用高速内存池对象
struct kmem_cache *kc;
void *p;
创建对象
kc = kmem_cache_create("kc", 16, 0, SLAB_HWCACHE_ALIGN, NULL);
分配内存块
p = kmem_cache_alloc(kc, GFP_KERNEL);
释放内存块
kmem_cache_free(kc, p);
销毁对象
kmem_cache_destroy(kc);
##########################################################
使用永久映射区访问高端内存(物理内存896M以上部分)
struct page *page
void *p;
page = alloc_pages(GFP_KERNEL | __GFP_HIGHMEM, get_order(1234));
p = kmap(page);
##########################################################
void *p;
p = ioremap(0, SZ_1K) ---> 把一段物理地址映射到虚拟地址空间
iounmap(p); ---> 取消映射
v = ioread32(p); ---> p:寄存器虚拟地址
iowrite32(v, p);---> v:要写入的值
v = ioread16(p);
iowrite16(v, p);
v = ioread8(p);
iowrite8(v, p);
为dma设备分配内存
virt = dma_alloc_coherent(NULL, 512, &phys, GFP_KERNEL);
返回2个地址:
virt ---> 虚拟地址
phys ---> 物理地址
释放内存
dma_free_coherent(NULL, 512, virt, phys);
传递参数:
virt ---> 虚拟地址
phys ---> 物理地址
Linux内核分配内存的方式的更多相关文章
- 24小时学通Linux内核之内存管理方式
昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...
- Linux内核笔记--内存管理之用户态进程内存分配
内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...
- linux内核申请内存函数
kmap函数: 把某块高端内存映射到页表,然后返回给用户一个填好vitual字段的page结构 建立永久地址映射,不是简单的返回virtual字段的pageioremap: 驱动程序 ...
- Linux内核之内存管理
Linux内核之内存管理 Linux利用的是分段+分页单元把逻辑地址转换为物理地址; RAM的某些部分永久地分配给内核, 并用来存放内核代码以及静态内核数据结构; RAM的其余部分称动态内存(dyna ...
- (笔记)Linux内核中内存相关的操作函数
linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) ...
- Linux内核中内存cache的实现【转】
Linux内核中内存cache的实现 转自:http://blog.chinaunix.net/uid-127037-id-2919545.html 本文档的Copyleft归yfydz所有,使用 ...
- Linux内核笔记——内存管理之slab分配器
内核版本:linux-2.6.11 内存区和内存对象 伙伴系统是linux用于满足对不同大小块内存分配和释放请求的解决方案,它为slab分配器提供页框分配请求的实现. 如果我们需要请求具有连续物理地址 ...
- Linux进程分配内存的两种方式--brk() 和mmap()
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...
- Linux内核之内存管理完全剖析
linux虚拟内存管理功能 ? 大地址空间:? 进程保护:? 内存映射:? 公平的物理内存分配:? 共享虚拟内存.实现结构剖析 (1)内存映射模块(mmap):负责把磁盘文件的逻辑地址映射到虚拟地 ...
随机推荐
- 【NOIP2013】华容道 广搜+spfa
题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...
- [bzoj4908][BeiJing2017]开车
来自FallDream的博客,未经允许,请勿转载,谢谢. 你有n辆车,分别a1, a2, ..., an位置和n个加油站,分别在b1, b2, ... ,bn .每个加油站只能支持一辆车的加油,所以你 ...
- 美团java后台实习三面
美团一面(50分钟) 1.spring的理解. 1.项目相关 2.Redis缓存的应用 3.http解析的全过程 4.Java中的锁 5.Hashmap和concurrenthashMap源码 6.死 ...
- TCP 通信
一.TCP与UDP的区别 二.ServerSocket与Socket 1 ServerSocket 以上介绍的几个构造方法中,第二个构造方法最常用. 2.Socket import java.io.* ...
- Linux sort -n 与 -g 排序对比
公司业务需要,天天用awk统计数值然后排序,出问题了,如下: count.sh 是一个统计脚本,把awk输出的值按占比.条数.类型 在重新输出 awk -F\| '{print $16}' *MQTT ...
- easing--缓动函数--贝塞尔函数--圆盘转动抽奖应用
http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js http://www.robertpenner.com/easing/penn ...
- javascript requestAnimationFarme
今天看到一篇很好的文章推荐一下:原文地址:http://www.zhangxinxu.com/wordpress/?p=3695 CSS3动画那么强,requestAnimationFrame还有毛线 ...
- 【python进阶】Garbage collection垃圾回收2
前言 在上一篇文章[python进阶]Garbage collection垃圾回收1,我们讲述了Garbage collection(GC垃圾回收),画说Ruby与Python垃圾回收,Python中 ...
- Python中将一个对象倒序输出的4种方法
Python中将一个对象倒序输出的4种方法就用列表来举例说明吧: >>> lst = [1,2,3,4,5,6] #创建测试列表 #方法1: >>> lst.rev ...
- 【python标准库模块四】Json模块和Pickle模块学习
Json模块 原来有个eval函数能能够从字符串中提取出对应的数据类型,比如"{"name":"zhangsan"}",可以提取出一个字典. ...