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内核分配内存的方式的更多相关文章

  1. 24小时学通Linux内核之内存管理方式

    昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...

  2. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  3. linux内核申请内存函数

    kmap函数:    把某块高端内存映射到页表,然后返回给用户一个填好vitual字段的page结构    建立永久地址映射,不是简单的返回virtual字段的pageioremap:    驱动程序 ...

  4. Linux内核之内存管理

    Linux内核之内存管理 Linux利用的是分段+分页单元把逻辑地址转换为物理地址; RAM的某些部分永久地分配给内核, 并用来存放内核代码以及静态内核数据结构; RAM的其余部分称动态内存(dyna ...

  5. (笔记)Linux内核中内存相关的操作函数

    linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) ...

  6. Linux内核中内存cache的实现【转】

    Linux内核中内存cache的实现 转自:http://blog.chinaunix.net/uid-127037-id-2919545.html   本文档的Copyleft归yfydz所有,使用 ...

  7. Linux内核笔记——内存管理之slab分配器

    内核版本:linux-2.6.11 内存区和内存对象 伙伴系统是linux用于满足对不同大小块内存分配和释放请求的解决方案,它为slab分配器提供页框分配请求的实现. 如果我们需要请求具有连续物理地址 ...

  8. Linux进程分配内存的两种方式--brk() 和mmap()

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  9. Linux内核之内存管理完全剖析

    linux虚拟内存管理功能 ? 大地址空间:? 进程保护:? 内存映射:? 公平的物理内存分配:? 共享虚拟内存.实现结构剖析   (1)内存映射模块(mmap):负责把磁盘文件的逻辑地址映射到虚拟地 ...

随机推荐

  1. 【CodeVs 6128 Lence的方块们】

    ·希望除了内部人员以外能有人通过这道题,因为这是大米饼第一次改编的题 ·我所见到的"本题原版"的题解也很少,搜索一下应该是: #include<stdio.h> #in ...

  2. hdu5651 xiaoxin juju needs help(逆元)

    xiaoxin juju needs help  Accepts: 150  Submissions: 966  Time Limit: 2000/1000 MS (Java/Others)  Mem ...

  3. bzoj 4033: [HAOI2015]树上染色

    Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距 ...

  4. Excel实现双击插入当前日期时间

    用vba做一个事件驱动程序. 第一步:点击开发工具-visual basic. 第二步:在当前工作表中编制程序如下: Private Sub Worksheet_BeforeDoubleClick(B ...

  5. java实现生产者/消费者的三种方式

    package com.wenki.thread; import java.util.LinkedList; import java.util.concurrent.LinkedBlockingQue ...

  6. SQL Server 2008作业失败无法确定所有者是否有服务器访问权限

    调用作业---错误提示内容 该作业失败. 无法确定所有者 WIN-3TH1KNIT12D\Administrator (拥有作业 Database_Backup.step1)是否有服务器访问权限 (原 ...

  7. python基础学习(一)

    python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum),诞生时间1989年圣诞 一.变量的命令规则 1.变量只能由大小写字母.数字和下划线三部分组成,并且不能以数字 ...

  8. JAVA 中转义符的理解

    生物信息中有时候会遇到JAVA写的程序,今天阅读源码的时候发现对于正则中的转义符不好理解,后来查资料后终于弄明白了,这里详细说明一下: 字符串的表示有三种方法:1.直接单字符,例如"A&qu ...

  9. Swift基础之实现选择图片时,出现类似于ActionSheet的样式

    之前看到过有APP在选择图片时,调用手机相册时,将手机相册做成了左右滑动选择的效果,这次展示的就是这种样式,用OC语言已经有人实现过类似的代码,在这里写的仅仅是效果展示的代码调用,具体代码,可以自己研 ...

  10. Dynamics CRM 查找字段下拉的最多10个选项的排序规则

    原文链接来自DTCCh论坛http://dynamics.ms-talent.com.cn/bbs/content/?id=1406&catogory=CRM 如果你是从事dynamics c ...