Linux内核代码分析 slab.c by 刘亢
Linux内核代码分析 slab.c by 刘亢 liukang@bjut.edu.cn
slab.c来自linux内核2.4.22版,本文件按照GNU协议发布。
一、准备知识:
slab的概念:
提出的原因:由于操作系统在运行中会不断产生、使用、释放大量重复的对象,
所以对这样的重复对象的生成进行改进可以大大提高效率
最早由sun的工程师提出(1994年)并首先在sunos5.4上应用。
slab算法的基本思路:
分配:
if(对相对应的缓存区有空闲位置)
使用这个位置,不必再初始化;
else{
分配内存;
初始化对象;
}
释放:
在缓存中标记空闲,不做析构;
资源不足:
寻找未使用的对象空间;
按照要求对部分对象做析构;
释放对象占用的空间;
缓存区:每一个对象放在一个缓存区
slab:每个slab块都是页面大小的整数倍(有上限)
着色:字节数按照硬件的要求对齐,可以大大提高硬件缓存的利用率和效率。
slab块的两种管理模式:
on-slab 适用于小对象(小于1/8页),slab管理结构存放在slab块中。
off-slab适用于大对象,(大于等于1/8页),对象和slab块的管理结构都由cache_slabp中分配。
根据slab提出者的论文,slab不适合用在大对象上。
slab涉及的重要操作:
缓存区创建kmem_cache_create与销毁kmem_cache_destory
缓存区收缩kmem_cache_shrink与扩张kmem_cache_grow
对象分配kmem_cache_alloc与释放kmem_cache_free
内核态内存的申请kmalloc与释放kfree
二、涉及的重要数据结构:
typedef unsigned int kmem_bufctl_t:slab块中的管理结构
cache_size表:保存了不同大小(2^n)页面指向cache_cache的两种指针(dma和非dma)。
链表:最重要的是在管理slab结构中出现的3个链表,分别为完全使用的,部分使用的和完全没用过的slab。
结构体:见下面的代码分析。
三、代码分析:
每个颜色代表的含义:
红色:代码注释;
藕荷色:编译预处理需要处理的内容;
蓝色:C语言关键字、函数定义;
绿色:宏定义;
黑色:代码;
灰色:输出信息;
深蓝色:我给出的注解。
/*
* linux/mm/slab.c
* Written by Mark Hemment, 1996/97.
* (markhe@nextd.demon.co.uk)
*
* kmem_cache_destroy() + some cleanup - 1999 Andrea Arcangeli
*
* Major cleanup, different bufctl logic, per-cpu arrays
* (c) 2000 Manfred Spraul
*以上为版权信息
* An implementation of the Slab Allocator as described in outline in;
* UNIX Internals: The N
相关文档:
http://hi.baidu.com/j_fo/blog/item/a43fa60fa6e2f4eaab6457d5.html
Linux2.6内核epoll介绍
2008-11-05 16:35
http://blog.csdn.net/rstevens/archive/2007/10/30/1858067.aspx
http://hi.baidu.com/jmlover/blog/item/24c28b131e6b48d7f7039ee6.html
http://hi.baidu.com/jmlover/blog/item/e64df724f12926348744f9 ......
http://hi.baidu.com/j_fo/blog/item/55f4014f1a226937aec3ab01.html
Linux Kernel Thread 的讨论
2007-05-14 11:45
kernel thread
Gearheads Written by Sreekrishnan Venkateswaran
Thursday, 15 September 2005
Threads are programming abstractions used in concurrent processing. A ke ......
查看系统中开放的端口,关闭不需要的端口和程序,如下例中操作流程:
1. 查看对外开启的端口:
[root@mail ~]# nmap 127.0.0.1 #注:此处应该换作公网ip
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2010-04-20 11:06 CST
Interesting ports on 127.0.0.1
Not shown: 1668 closed ports
PORT &nb ......
7.5. Tasklets 机制
上一页
第 7 章 时间, 延时, 和延后工作
下一页
http://lsec.cc.ac.cn/~tengfei/doc/ldd3/index.html
Linux 设备驱动 Edition 3
7.5. Tasklets 机制
另一个有关于定时问题的内核设施是 tasklet 机制. 它大部分用在中断管理(我们将在第 10 章再次见到). ......
键盘在所有的驱动之中最为简单的一种,但它却包含了驱动的基本框架,对以后继续深入学习其他复杂的驱动大有裨益,以下便为你逐步剖析驱动的开发。采用的是查询方式。转载请注明出处:qiangren.blog.edu.cn
一.内核模块的注册和撤销
在加载模块的时候,首先运行的是内核模块的注册函数。它的功能包括内核注册设备以 ......