1

我嘗試編譯一個程序,該程序充當存儲分配工作原理的示例。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"); 

在此先感謝

彼得

回答

1

SLAB_CTOR_VERIFY在2.6.22

+0

感謝您的回答,但任何療法替代呢? – Peter

+0

來自鏈接的更改日誌:有一個相關標誌SLAB_CTOR_VERIFY經常被檢查以在fs inode緩存中清除。從fs構造函數中刪除沒有意義的檢查(它們甚至沒有刪除SLAB_DEBUG_INITIAL也沒有意義)。 –

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"); 
+0

但我想我需要'如果(標誌和SLAB_CTOR_VERIFY)'來控制標誌?!這不是必需的嗎? – Peter