ストレージ割り当てがどのように機能するかの例として役立つプログラムをコンパイルしようとしています。
コンパイラは、「キャッシュ」と「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");
前もって感謝します
ピーター