我尝试编译一个程序,作为存储分配如何工作的一个例子。
编译器给我一个错误,'cache'和'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");
提前致谢
彼得
答案 0 :(得分:1)
答案 1 :(得分:0)
通过一些更改进行编译。 SLAB ..已被删除,kmem_cache函数已被更改。 kmem_cache_t
已替换为struct kmem_cache
:
#include <linux/module.h>
#include <linux/completion.h>
#include <linux/slab.h>
#include <linux/sched.h> // daemonize
static int thread_id=0;
static DECLARE_COMPLETION( on_exit );
typedef struct kmem_cache kmem_cache_t; //
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) {
struct linobj *ptr = (struct linobj *)objp;
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);
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");