Linux内存管理之slab分配器分析(续五)
九:几点补充:
1: Slab中使用的页面都会加上“PG_slab”标志,以跟一般的页面区别。另外,在释放内存的时候,经常需要用到从页面到slab的对应转换关系。那是怎样标识的呢?
关于标志:
注意有以下代码:
static void *kmem_getpages(kmem_cache_t *cachep, int flags, int nodeid)
{
……
while (i--) {
//为分得的每一个页面设置PG_slab标志
SetPageSlab(page);
page++;
}
……
}
关于从页面到slab的转换:
向伙伴系统请求内存
static int cache_grow (kmem_cache_t * cachep, int flags)
{
……
//请求内存过后,设置内存属性
set_slab_attr(cachep, slabp, objp);
……
}
static void set_slab_attr(kmem_cache_t *cachep, struct slab *slabp, void *objp)
{
int i;
struct page *page;
//计算页面总数
i = 1 << cachep->gfporder;
//虚拟地址转换成相应页面
page = virt_to_page(objp);
do {
// #define SET_PAGE_CACHE(pg,x) ((pg)->lru.next = (struct list_head *)(x))
SET_PAGE_CACHE(page, cachep);
#define SET_PAGE_SLAB(pg,x) ((pg)->lru.prev = (struct list_head *)(x))
SET_PAGE_SLAB(page, slabp);
page++;
} while (--i);
}
从上面的函
相关文档:
一、安装系统环境
1、系统:centos5
2、测试在vm5.5
准备软件
lighttpd-1.4.18
下载地址
mysql-5.0.41
part1下载地址
part2下载地址
part3下载地址
php-5.2.3
下载地址
SupeSite/X-Space
part1下载地址
part2下载地址
part3下载地址
discuz
下载地址
二、搭建web服务器安装过程
1、mysql5安装
$ tar zx ......
1、简单测试实例
for i in `find . -type f -name "*.c"`
do
echo $i
basename $i 获取*.c文件名
dirname $i 获取*.c对应的目录名
done
2、实际应用
diff Linux源码,并将有不一样的源码整理在一起,要求:文件 ......
你想成知道如何成为一个Linux内核开发者么?或者你的老板告诉你,“去为这个设备写一个Linux驱动。“这篇文档的目的,就是通过描述你需要经历的过程和提示你如何和社区一起工作,来教给你为达到这些目的所需要知道的所有知识。本文也尝试解释社区为什么这样工作的一些原因。
内核几乎全是用C写成的,有 ......
这是出席在2009年10月20日在东京举行的Linux内核大会合影照。全分辨率照片。一个女性都没有。你认识其中的几位呢?
以下是出席会议的名单,有兴趣的朋友可以对一对:
Al Viro
Alan Cox
Andi Kleen
Andrew Morton
Andy Whitcroft
Arjan van de Ven
Arnd Bergmann
Avi Kivity
Benjamin Herrenschmidt
Brian ......
五:kmem_cache_create()分析
我们以一个例子来跟踪分析一下slab的机制:
下面是一个测试模块的代码:
#include <linux/config.h>
#include <linux/module.h>
#include <linux/slab.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ericxiao <xgr178@163.com>");
MODULE_DESCRI ......