分类: LINUX
2017-08-31 13:58:08
原文地址:linux内核API每天来一发(3) 作者:fuchao2012
函数名 | 内核调用本函数,在内存中创建一个虚拟缓冲区 |
用例 |
struct kmem_cache * kmem_cache_create( const char *name, size_t size, size_t align, unsigned long flags; void (*ctor)(void*, struct kmem_cache *, unsigned long), void (*dtor)(void*, struct kmem_cache *, unsigned long)); |
参数说明 |
name-------参数定义了缓存名称,proc 文件系统(在 /proc/slabinfo 中)使用它标识这个缓存。 size----- 参数指定了为这个缓存创建的对象的大小 align------参数定义了每个对象必需的对齐 flags -----参数指定了为缓存启用的选项 |
函数简介 |
kmem_cache_create 的部分选项(在 flags 参数中指定) SLAB_RED_ZONE 在对象头、尾插入标志,用来支持对缓冲区溢出的检查。 SLAB_POISON 使用一种己知模式填充 slab,允许对缓存中的对象进行监视(对象属对象所有, 不过可以在外部进行修改)。 SLAB_HWCACHE_ALIGN 指定缓存对象必须与硬件缓存行对齐。 ctor 和 dtor 参数定义了一个可选的对象构造器和析构器。构造器和析构器是用户提供的回调函数。 当从缓存中分配新对象时,可以通过构造器进行初始化。 |
函数名 | 收缩一个指定的缓冲区 |
用例 | int kmem_cache_shrink( struct kmem_cache* cachep) |
参数说明 | cachep----指向需要收缩的缓冲区的指针 |
函数简介 | 这个操作(称为回收)是由内核定期自动执行的(通过 kswapd) |
函数名 | 删除一个指定的缓冲区 |
用例 | int kmem_cache_destory(struct kmem_cache* cachep) |
参数说明 |
cachep----指向需要删除的缓冲区的指针 |
函数简介 |
这个调用是由内核模块在被卸载时执行的。在调用这个函数时,缓存必须为空。 删除成功则返回 0 |
函数名 | 从一个命名的缓存中分配一个对象 |
用例 | void* kmem_cache_alloc(struct kmem_cache* cachep, gft_t flags) |
参数说明 |
cachep----指向需要被分配的缓冲区的指针 flag-----flags参数: GFP_USER 为用户分配内存(这个调用可能会睡眠)。 GFP_KERNEL 从内核 RAM 中分配内存(这个调用可能会睡眠)。 GFP_ATOMIC 使该调用强制处于非睡眠状态(对中断处理程序非常有用)。 GFP_HIGHUSER 从高端内存中分配内存。 |
函数简介 | 注意如果缓存目前为空,那么这个函数就会调用 cache_alloc_refill 向缓存中增加内存。 |
函数名 | 实现内存分配最常用的函数,与kfree成对使用 |
用例 | void* kmalloc(size_t size, gft_t flag) |
参数说明 |
size----将要分配的内存缓冲区的大小 flag---要分配的内存的类型,与kmem_cache_alloc的分配类型相似 |
函数简介 |
常见的内存分配函数,具体使用方法可以参见参考资料中的源码。与kmem_cache_alloc的区别在于 kmalloc 没有为要从中分配对象的某个 slab 缓存命名,而是循环遍历可用缓存来查找可以满足大小限制的缓存 |
函数名 | 释放内存缓冲区对象 |
用例 | void kmem_cache_free(struct kmem_cache* cachep, void* objp) |
参数说明 |
cachep----分配内存缓冲区时抛出的指针 objp--------被分配到内存的缓冲区对象指针 |
函数简介 | 只能释放由kmem_cache_aloc分配的内存缓冲区 |
函数名 | 释放由kmalloc分配的内存区 |
用例 | void kfree(const void* objp) |
参数说明 | objp----由kmalloc分配结束时抛出的指向分配区的指针 |
函数简介 | 只能释放由kmalloc分配的内存区,否则识别不出内存地址,从而导致错误。 |
函数名 | 向系统注册一个sysctl的层级结构 |
用例 | struct ctl_table_header* register_sysctl_table(ctl_table* table, int insert_at_head) |
参数说明 |
table----顶层表结构,用于记录映射关系 insert_at_head----标志位,确定新的元素是否能够使用头插法或尾插法加入列表 |
函数简介 |
函数名 | 从系统的sysctl结构中注销 |
用例 | void unregister_sysctl_table(struct ctl_table_header* header) |
参数说明 | header-----指向系统注册的层级结构中列表的头指针 |
函数简介 | 从sysctl表中删除注册的选项,同时返回系统资源。但系统注册的子进程的注册项会在其运行结束后才删除 |
函数名 | 读取一个sysctl字符串 |
用例 | int proc_dostring(ctl_table* table, int write, struct file* filp, void* buffer, size_t* lenp) |
参数说明 |
table----sysctl层级控制表 write---如果此处为写控制表,则为TRUE filp------指向文件的指针 buffer--指向用户缓冲区的指针 lenp---用户缓冲区大小的指针 |
函数简介 |
对用户缓冲区进行读写操作,如果内核缓冲区提供的字符串太长,在映射过程中会被截断。被操作的字符串 一定是以NUL结尾的合法字符串。多个用户同时访问本缓冲区时,各个进程之间维护缓冲区的副本,读写结束 后返回TRUE |
函数名 | 读取一个整型数的向量 |
用例 | int proc_dointvec(ctl_table* table, int write, strut file* filp, void* buffer, size_t* lenp) |
参数说明 |
table----sysctl层级控制表 write---如果此处为写控制表,则为TRUE filp------指向文件的指针 buffer--指向用户缓冲区的指针 lenp---用户缓冲区大小的指针 |
函数简介 | 内核缓冲区之间最多交换maxlen/sizeof(unsigned int)个整数值 |
函数名 | 读取一个整型数的向量,同时这个整型数的大小有限定 |
用例 |
int proc_dointvec_minmax(ctl_table* table, int write, strut file* filp, void* buffer, size_t* lenp) |
参数说明 |
table----sysctl层级控制表 write---如果此处为写控制表,则为TRUE filp------指向文件的指针 buffer--指向用户缓冲区的指针 lenp---用户缓冲区大小的指针 |
函数简介 | 内核缓冲区之间最多交换maxlen/sizeof(unsigned int)个整数值,同时缓冲区内部数据的大小要在MAX/MIN之间 |
函数名 |
读取一个无符号长整型的向量,同时这个整型数的大小有限定 |
用例 | int proc_doulongvec_minmax(ctl_table* table, int write, strut file* filp, void* buffer, size_t* lenp) |
参数说明 |
table----sysctl层级控制表 write---如果此处为写控制表,则为TRUE filp------指向文件的指针 buffer--指向用户缓冲区的指针 lenp---用户缓冲区大小的指针 |
函数简介 | 内核缓冲区之间最多交换maxlen/sizeof(unsigned int)个无符号长整数值,同时缓冲区内部数据的大小要在MAX/MIN之间 |
函数名 | 读取一个无符号长整型的向量,同时这个整型数 |
用例 |
int proc_doulongvec_ms_jiffies_minmax(ctl_table* table, int write, strut file* filp, void* buffer, size_t* lenp) |
参数说明 |
table----sysctl层级控制表 write---如果此处为写控制表,则为TRUE filp------指向文件的指针 buffer--指向用户缓冲区的指针 lenp---用户缓冲区大小的指针 |
函数简介 |
内核缓冲区之间最多交换maxlen/sizeof(unsigned int)个无符号长整数值, 这些整数值代表的是毫秒级的时间变量,同时缓冲区内部数据的大小要在MAX/MIN之间 |
函数名 |
|
用例 | nt proc_dointvec_jiffies(ctl_table* table, int write, strut file* filp, void* buffer, size_t* lenp) |
参数说明 |
table----sysctl层级控制表 write---如果此处为写控制表,则为TRUE filp------指向文件的指针 buffer--指向用户缓冲区的指针 lenp---用户缓冲区大小的指针 |
函数简介 |
内核缓冲区之间最多交换maxlen/sizeof(unsigned int)个无符号长整数值, 整数值代表秒级变量,同时缓冲区内部数据的大小要在MAX/MIN之间 |
参考文献:用户空间与内核空间数据交换的方式(7)------sysctl
http://www.cnblogs.com/hoys/archive/2011/04/10/2011675.html