易截截图软件、单文件、免安装、纯绿色、仅160KB

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


相关文档:

linux tasklet 2

http://hi.baidu.com/j_fo/blog/item/7412bb018deab109728da572.html
Linux内核 irq/soft irq/tasklet/同步
2009-10-08 21:22
1.中断处理程序结束之前,不允许产生相同的中断事件;(禁用PIC上该中断,但可以产生其他中断)
2.中断处理程序、软中断、tasklet既不可被抢占也不能被阻塞,最多发生中断嵌套;
3.执行中断 ......

LINUX下的iptables

原帖:http://www.cnscn.org/read.php?tid-44684.html
iptables有三种链
1:INPUT (进来的链)
2:OUTPUT(出去的链)
3:FORWARD(转发的链)
iptables -A INPUT -p icmp -j DROP
-A(添加一个链) -p 协议 -j(添加动作) 说明添加一个进来的链。协议是icmp动作拒绝。
iptables -L -n (用树形结构来看一下iptables的设置)
......

新手看招:xManager连接Linux的配置方法


第一步,我们在Linux系统下,修改/etc/X11/xdm/Xaccess文件,找到下面的语句:
# * #any host can get a login window
 
去掉最前面的#号,成为
* #any host can get a login window
 
第二步,我们修改/etc/X11/gdm/gdm.conf文件,找到下面的语句:
 
[xdmcp]
Enable=false
将其中的En ......

linux tasklet 4

引用 2 楼 cokeliu 的回复:
谢谢! 请问是否每调用一次tasklet_schedule(B task); B task任务被加到链表上只会被执行一次?
是的,只被加一次
第一次tasklet_schedule(B task)给他一个状态TASK_STATE_SCHED
作标记,以后的tasklet_schedule(B task)会检查这个标记
http://os.inf.tu-dresden.de/l4env/doc/html/dde_linux ......

linux 的 source命令

source命令(从 C Shell 而来)是bash shell的内置命令。点命令,就是一个点符号,(从Bourne Shell而来)是source的另一名称。这两个命令都以一个脚本为参数,该脚本将作为当前shell的环境执行,即不会启动一个新的子进程。所有在脚本中设置的变量将成为当前Shell的一部分。同样的,当前脚本中设置的变量也将作为脚本的环境,s ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号