我尝试编译一个程序,作为存储分配如何工作的示例。
编译器给了我一个错误,“缓存”和“SLAB_CTOR_VERIFY”未声明。
我在整个内核项目(Linux Kernel 2.6.32)中找不到声明。
也许有一些替代品或类似的东西。
我在网上一无所获,但也许你们中的一些人可以给我一个线索。
这是源代码:
#include <linux/module.h>
#include <linux/completion.h>
#include <linux/slab.h>
static int thread_id=0;
static DECLARE_COMPLETION( on_exit );
static kmem_cache_t *cache;
struct linobj {
int dummy_i, dummy_j, dummy_k;
char dummy_feld[250];
wait_queue_head_t wq;
};
static void linobj_destructor(void *objp, kmem_cache_t *cache,
unsigned long flags)
{
printk("linobj_destructor( %p )\n", objp);
return;
}
static void linobj_constructor(void *objp, kmem_cache_t *cache,
unsigned long flags)
{
struct linobj *ptr = (struct linobj *)objp;
if( flags & SLAB_CTOR_VERIFY )
return;
printk("linobj_constructor( %p )\n", objp);
init_waitqueue_head(&ptr->wq);
return;
}
static int thread_code( void *data )
{
unsigned long timeout, retvalue;
int i;
struct linobj *obj;
daemonize("linobj-test");
allow_signal( SIGTERM );
for( i=0; i<5; i++ ) {
obj = (struct linobj *)kmem_cache_alloc( cache, GFP_KERNEL );
printk("objadr=%p\n", obj );
timeout=HZ;
retvalue=schedule_timeout_interruptible(timeout);
kmem_cache_free( cache, obj );
if( retvalue )
break;
}
complete_and_exit( &on_exit, 0 );
}
static int __init slab_init(void)
{
cache = kmem_cache_create( "linobj", sizeof(struct linobj),
0, 0, linobj_constructor, linobj_destructor );
if( !cache )
return -EFAULT;
thread_id=kernel_thread( thread_code, NULL, CLONE_KERNEL );
if( thread_id==0 ) {
kmem_cache_destroy( cache );
return -EIO;
}
return 0;
}
static void __exit slab_exit(void)
{
kill_pid( find_vpid(thread_id), SIGTERM, 1 );
wait_for_completion( &on_exit );
if( cache )
kmem_cache_destroy( cache );
}
module_init( slab_init );
module_exit( slab_exit );
MODULE_LICENSE("GPL");
提前致谢
彼得