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. AtCoder Beginner Contest 071 D - Coloring Dominoes

    Problem Statement We have a board with a 2×N grid. Snuke covered the board with N dominoes without o ...

  2. SPOJ Query on a tree V

    You are given a tree (an acyclic undirected connected graph) with N nodes. The tree nodes are number ...

  3. Delphi7数据库编程之TDataSet(转)

    TDataSet类由TBDEDataSet(BDE组件).TCustomADODataSet(ADO组件).TIBCustomDataSet(InterBase组件).TCustomSQLDataSe ...

  4. Restful中 @RequestParam,@PathParam,@PathVariable等注解区别

    @RequestParam 和 @PathVariable 注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是@RequestParam 是从request里面拿取值,而 @P ...

  5. Linux的管理类命令及其使用方法

    文件操作相关有一些命令可以帮助我们"修剪"之前看到的文件树. $touch a.txt 如果a.txt不存在,生成一个新的空文档a.txt.如果a.txt存在,那么只更改该文档的时 ...

  6. 解释session

    我理解的session就是,多个页面都要使用某一个或一些数据,这时就可以用session,将数据暂时保存起来,这样其他的页面开启session,就能将那些数据拿出来使用.

  7. ctf writeup之程序员密码

    起因 在v2ex上看到有人发了一篇帖子,说做了一个程序员小游戏,遂试玩了一下. 游戏的地址在这里: http://www.bettertomissthantomeet.com/pages/level. ...

  8. 深入理解DirectByteBuffer

    介绍 最近在工作中使用到了DirectBuffer来进行临时数据的存放,由于使用的是堆外内存,省去了数据到内核的拷贝,因此效率比用ByteBuffer要高不少.之前看过许多介绍DirectBuffer ...

  9. 《读书报告 -- Elasticsearch入门 》--简单使用(2)

    <读书报告 – Elasticsearch入门 > ' 第四章 分布式文件存储 这章的主要内容是理解数据如何在分布式系统中存储. 4.1 路由文档到分片 创建一个新文档时,它是如何确定应该 ...

  10. 安卓高级3 RecyclerView 和cardView使用案例

    cardView: 添加依赖:在Studio搜索cardview即可 在V7包中 或者直接在gradle中添加 compile 'com.android.support:cardview-v7:24. ...