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 に答える