我嘗試編譯一個程序,該程序充當存儲分配工作原理的示例。Linux SLAB_CTOR_VERIFY和未聲明的緩存
編譯器給我一個錯誤,'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");
在此先感謝
彼得
感謝您的回答,但任何療法替代呢? – Peter
來自鏈接的更改日誌:有一個相關標誌SLAB_CTOR_VERIFY經常被檢查以在fs inode緩存中清除。從fs構造函數中刪除沒有意義的檢查(它們甚至沒有刪除SLAB_DEBUG_INITIAL也沒有意義)。 –