#include<linux/slab.h>
void*kmalloc(size_tsize,intflags);
voidkfree(void*obj);
内存分配的最常用接口.
#include<linux/mm.h>
GFP_USER
GFP_KERNEL
GFP_NOFS
GFP_NOIO
GFP_ATOMIC
控制内存分配如何进行的标志,从最少限制的到最多的.GFP_USER和GFP_KERNEL优先级
允许当前进程被置为睡眠来满足请求.GFP_NOFS和GFP_NOIO禁止文件系统操作和所有
的I/O操作,分别地,而GFP_ATOMIC分配根本不能睡眠.
__GFP_DMA
__GFP_HIGHMEM
__GFP_COLD
__GFP_NOWARN
__GFP_HIGH
__GFP_REPEAT
__GFP_NOFAIL
__GFP_NORETRY
这些标志修改内核的行为,当分配内存时.
#include<linux/malloc.h>
kmem_cache_t*kmem_cache_create(char*name,size_tsize,size_toffset,unsignedlongflags,constructor
(),destructor());
intkmem_cache_destroy(kmem_cache_t*cache);
创建和销毁一个slab缓存.这个缓存可被用来分配几个相同大小的对象.
SLAB_NO_REAP
SLAB_HWCACHE_ALIGN
SLAB_CACHE_DMA
在创建一个缓存时可指定的标志.
SLAB_CTOR_ATOMIC
SLAB_CTOR_CONSTRUCTOR
分配器可用传递给构造函数和析构函数的标志.
void*kmem_cache_alloc(kmem_cache_t*cache,intflags);
voidkmem_cache_free(kmem_cache_t*cache,constvoid*obj);
从缓存中分配和释放一个单个对象./proc/slabinfo一个包含对slab缓存使用情况统计的虚拟
文件.
#include<linux/mempool.h>
mempool_t*mempool_create(intmin_nr,mempool_alloc_t*alloc_fn,mempool_free_t*free_fn,void
*data);
voidmempool_destroy(mempool_t*pool);
创建内存池的函数,它试图避免内存分配设备,通过保持一个已分配项的"紧急列表".
void*mempool_alloc(mempool_t*pool,intgfp_mask);
voidmempool_free(void*element,mempool_t*pool);
从(并且返回它们给)内存池分配项的函数.
unsignedlongget_zeroed_page(intflags);
unsignedlong__get_free_page(intflags);
unsignedlong__get_free_pages(intflags,unsignedlongorder);
面向页的分配函数.get_zeroed_page返回一个单个的,零填充的页.这个调用的所有的其他版
本不初始化返回页的内容.
intget_order(unsignedlongsize);
返回关联在当前平台的大小的分配级别,根据PAGE_SIZE.这个参数必须是2的幂,并且返回
值至少是0.
voidfree_page(unsignedlongaddr);
voidfree_pages(unsignedlongaddr,unsignedlongorder);
释放面向页分配的函数.
structpage*alloc_pages_node(intnid,unsignedintflags,unsignedintorder);
structpage*alloc_pages(unsignedintflags,unsignedintorder);
structpage*alloc_page(unsignedintflags);
Linux内核中最底层页分配器的所有变体.
void__free_page(structpage*page);
void__free_pages(structpage*page,unsignedintorder);
voidfree_hot_page(structpage*page);
使用一个alloc_page形式分配的页的各种释放方法.
#include<linux/vmalloc.h>
void*vmalloc(unsignedlongsize);
voidvfree(void*addr);
#include<asm/io.h>
void*ioremap(unsignedlongoffset,unsignedlongsize);
voidiounmap(void*addr);
分配或释放一个连续虚拟地址空间的函数.iormap存取物理内存通过虚拟地址,而vmalloc分
配空闲页.使用ioreamp映射的区是iounmap释放,而从vmalloc获得的页使用vfree来释放.
#include<linux/percpu.h>
DEFINE_PER_CPU(type,name);
DECLARE_PER_CPU(type,name);
定义和声明每-CPU变量的宏.
per_cpu(variable,intcpu_id)
get_cpu_var(variable)
put_cpu_var(variable)
提供对静态声明的每-CPU变量存取的宏.
void*alloc_percpu(type);
void*__alloc_percpu(size_tsize,size_talign);
voidfree_percpu(void*variable);
进行运行时分配和释放每-CPU变量的函数.
intget_cpu();
voidput_cpu();
per_cpu_ptr(void*variable,intcpu_id)
get_cpu获得对当前处理器的引用(因此,阻止抢占和移动到另一个处理器)并且返回处理器
的ID;put_cpu返回这个引用.为存取一个动态分配的每-CPU变量,用应当被存取版本所在
的CPU的ID来使用per_cpu_ptr.对一个动态的每-CPU变量当前CPU版本的操作,应当用
对get_cpu和put_cpu的调用来包围.
#include<linux/bootmem.h>
void*alloc_bootmem(unsignedlongsize);
void*alloc_bootmem_low(unsignedlongsize);
void*alloc_bootmem_pages(unsignedlongsize);
void*alloc_bootmem_low_pages(unsignedlongsize);
voidfree_bootmem(unsignedlongaddr,unsignedlongsize);
在系统启动时进行分配和释放内存的函数(只能被直接连接到内核中去的驱动使用)
相关推荐
LDD3学习笔记设备模型之底层实现(kobject,kset)[汇编].pdf
ldd code ldd3驱动源代码 ldd code ldd3驱动源代码
ldd3中文版、chmldd3中文版chm
LDD-LinuxDeviceDrivers#1书籍-一些书中的原始码和范例目录书籍#2 study--本人的linux学习以及驱动代码目录书籍学习Linux内核的设计与实现,包括文档和示例代码,文档与同步更新自己实现的一些linux内核的驱动代码...
本资源为ldd3详解,该书中详细介绍了ldd3的使用以及各种驱动的设置
LDD3配套源码,配合我的百度云分享的虚拟机可以直接编译运行(虚拟机另行在我上传的资源里下载,相关可以参考我的LDD3系列博客)
ldd3 中文
LDD2+LDD3 linux设备驱动
Linux 设备驱动 Edition 3 - LDD3中文版,学习linux必备之书,pdf格式
ldd3-examples-3.x, 在 linux 3.x 之后,端口LDD3源代码示例 ldd3-examples-3.xlinux 3 。x 之后LDD3源代码示例的端口背景LDD3是Linux设备驱动程序,第三版。 这是一本关于如何编写linux设备驱动程序的。 你可以从 ...
经典 LDD3,linux驱动开发 linux驱动开发
由于对Linux设备驱动程序设计的需求,所以前段时间在网上下载了LDD3的HTML格式文档,在看的时候感觉不太好看,同时为了打印方便,把它转化为PDF格式,所以在此与大家一起分享。 由于本资料不是本人自创,也是来自于...
这是ldd3的英文原版书以及相应例程的源码,希望对正在学习linux驱动的朋友们有所帮助
LDD3是linux驱动开发的基础入门级图书,适合刚接触linux驱动的新手学习。
主要是对LDD3中的实例进行测试,修改,调试。
linux device driver\ldd3英文版附源码.rar
LDD6410 S3C6410开发板原理图
linux LDD 3 LINUX设备驱动程序源码。。
由于ldd3 源码是基于linux-2.6.10编写的,最新内核接口以及数据结构都有变化,因此对于新手来说,书中源码无法编译正常通过,给学习增加了不少难度,本源码是结合网上修改以及个人整理的,能够在linux-2.6.32-21,...