Chinaunix首页 | 论坛 | 博客
  • 博客访问: 316161
  • 博文数量: 146
  • 博客积分: 198
  • 博客等级: 入伍新兵
  • 技术积分: 689
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-24 08:35
文章分类

全部博文(146)

文章存档

2013年(46)

2012年(98)

2011年(1)

2010年(1)

我的朋友

分类: LINUX

2013-04-28 10:42:34

第四章 内存管理

第一节 Slab缓存


kmem_cache_create

函数名 内核调用本函数,在内存中创建一个虚拟缓冲区
用例 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 参数定义了一个可选的对象构造器和析构器。构造器和析构器是用户提供的回调函数。
当从缓存中分配新对象时,可以通过构造器进行初始化。

kmem_cache_shrink

函数名 收缩一个指定的缓冲区
用例 int kmem_cache_shrink( struct kmem_cache* cachep)
参数说明 cachep----指向需要收缩的缓冲区的指针
函数简介 这个操作(称为回收)是由内核定期自动执行的(通过 kswapd)

kmem_cache_destory

函数名 删除一个指定的缓冲区
用例 int kmem_cache_destory(struct kmem_cache* cachep)
参数说明 cachep----指向需要删除的缓冲区的指针
函数简介 这个调用是由内核模块在被卸载时执行的。在调用这个函数时,缓存必须为空。
删除成功则返回 0

kmem_cache_alloc

函数名 从一个命名的缓存中分配一个对象
用例 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 向缓存中增加内存。

kmalloc

函数名 实现内存分配最常用的函数,与kfree成对使用
用例 void* kmalloc(size_t size, gft_t flag)
参数说明 size----将要分配的内存缓冲区的大小
flag---要分配的内存的类型,与kmem_cache_alloc的分配类型相似
函数简介 常见的内存分配函数,具体使用方法可以参见参考资料中的源码。与kmem_cache_alloc的区别在于
kmalloc 没有为要从中分配对象的某个 slab 缓存命名,而是循环遍历可用缓存来查找可以满足大小限制的缓存

kmem_cache_free

函数名 释放内存缓冲区对象
用例 void kmem_cache_free(struct kmem_cache* cachep, void* objp)
参数说明 cachep----分配内存缓冲区时抛出的指针
objp--------被分配到内存的缓冲区对象指针
函数简介 只能释放由kmem_cache_aloc分配的内存缓冲区

kfree

函数名 释放由kmalloc分配的内存区
用例 void kfree(const void* objp)
参数说明 objp----由kmalloc分配结束时抛出的指向分配区的指针
函数简介 只能释放由kmalloc分配的内存区,否则识别不出内存地址,从而导致错误。
可参考的资料:
https://www.ibm.com/developerworks/cn/linux/l-linux-slab-allocator/
http://www.cnblogs.com/bastard/archive/2012/09/21/2697407.html

第五章 PROC文件系统

第一节 sysctl函数接口

sysctl是一种用户应用来设置和获得运行时内核的配置参数的一种有效方式,通过这种方式,用户应用可以在内核运行的任何时刻来改变内核的配置参数,也可以在任何时候获得内核的配置参数,通常,内核的这些配置参数也出现在proc文件系统的/proc/sys目录下,用户应用可以直接通过这个目录下的文件来实现内核配置的读写操作


register_sysctl_table

函数名 向系统注册一个sysctl的层级结构
用例 struct ctl_table_header* register_sysctl_table(ctl_table* table, int insert_at_head)
参数说明 table----顶层表结构,用于记录映射关系
insert_at_head----标志位,确定新的元素是否能够使用头插法或尾插法加入列表
函数简介

unregister_sysctl_table

函数名 从系统的sysctl结构中注销
用例 void unregister_sysctl_table(struct ctl_table_header* header)
参数说明 header-----指向系统注册的层级结构中列表的头指针
函数简介 从sysctl表中删除注册的选项,同时返回系统资源。但系统注册的子进程的注册项会在其运行结束后才删除

proc_dostring

函数名 读取一个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

proc_dointvec

函数名 读取一个整型数的向量
用例 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)个整数值

proc_dointvec_minmax

函数名 读取一个整型数的向量,同时这个整型数的大小有限定
用例 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之间

proc_doulongvec_minmax

函数名 读取一个无符号长整型的向量,同时这个整型数的大小有限定
用例 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之间

proc_doulongvec_ms_jiffies_minmax

函数名 读取一个无符号长整型的向量,同时这个整型数
用例 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之间

proc_dointvec_jiffies

函数名
用例 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

小结


由于昨晚时间有些紧,所以没能更出来,希望大家见谅。
本节主要涉及的内容有两个内存管理和proc文件管理。
两块内容对于内核分析来讲都是非常繁重的工作,内容也非常多。我们组内至今尚未有可以参考的资料。
如果大家对这两块比较感兴趣,推荐了解一下。随后,我会单独发些文章来跟大家讨论这些内容。
slab/slub/slob机制
sysctl机制
而后再回来看这些函数,也就会理解一些了。
今日序更虚拟文件系统API,请大家关注
阅读(1771) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~