1

我尝试编译一个程序,作为存储分配如何工作的示例。

编译器给了我一个错误,“缓存”和“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");

提前致谢

彼得

4

2 回答 2

1

SLAB_CTOR_VERIFY 在2.6.22中被移除

于 2012-08-28T12:08:21.740 回答
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");
于 2012-08-28T12:14:34.443 回答