下面是一个内核模块,可以很好地编译和运行我已经编写了一个方法show来获取指向哈希表的指针并打印它但是如果我使用methods参数b,我会得到一个编译错误我只能使用全局变量a。

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/hashtable.h>

MODULE_LICENSE("GPL");

typedef struct {
    int age;
    struct hlist_node my_next;
} my_type;

DEFINE_HASHTABLE(a, 3);
my_type *node1, *node2, *node3;

void show(struct hlist_head b[]){
    int i;
    my_type *temp;

    printk(KERN_INFO "a: %p \tb: %p \n", a, b);    // Always the same address.

    hash_for_each(a, i, temp, my_next){           // Change the a to b
        printk(KERN_INFO "%d\n", temp->age);
    }
}


int init_module(void){
    printk(KERN_INFO "Hi.\n");

    node1 = kmalloc(sizeof(my_type), GFP_KERNEL);
    node1->age = 28;
    node2 = kmalloc(sizeof(my_type), GFP_KERNEL);
    node2->age = 27;
    node3 = kmalloc(sizeof(my_type), GFP_KERNEL);
    node3->age = 20;

    show(a);
    hash_add(a, &node1->my_next, 0);
    hash_add(a, &node2->my_next, 1);
    hash_add(a, &node3->my_next, 1);
    show(a);

    return 0;
}


void cleanup_module(void){
    kfree(node1);
    kfree(node2);
    kfree(node);
    printk(KERN_INFO "Bye.\n");
}

我得到的错误是:
In file included from include/linux/thread_info.h:11:0,
             from /usr/src/kernels/3.15.8-200.fc20.x86_64/arch/x86/include/asm/preempt.h:6,
             from include/linux/preempt.h:18,
             from include/linux/spinlock.h:50,
             from include/linux/seqlock.h:35,
             from include/linux/time.h:5,
             from include/linux/stat.h:18,
             from include/linux/module.h:10,
             from /home/k/development/hash2/main.c:1:
/home/k/development/hash2/main.c: In function ‘show’:
include/linux/bug.h:33:45: error: negative width in bit-field ‘<anonymous>’
 #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
                                         ^

我试过使用struct hlist_head * b[]这样的定义,并在hash_for_each宏中使用*b但没有工作。
我还试图在方法内部定义DEFINE_HASHTABLE(c, 3);,如下所示,但这是非常无用的。
void show(struct hlist_head b[]){
    int i;
    my_type *temp;

    DEFINE_HASHTABLE(c, 3);
    printk(KERN_INFO "a: %p \tb: %p \n", a, b);

    hash_for_each(c, i, temp, my_next){
        printk(KERN_INFO "%d\n", temp->age);
    }
}

那么,为什么我会犯这个错误我该怎么解决?

最佳答案

hash_for_each是一个宏,它依次使用另一个宏(ARRAY_SIZE)来确定作为第一个参数传递给hash_for_each的数组的大小。
将指针传递到hash_for_each作为第一个参数,这会使ARRAY_SIZE窒息,as"pointers are not arrays"
为了实现这一点,您可能希望采用Paul R在对您的问题的评论中提出的方法,也就是将show()实现为宏。
您观察到的编译错误是有意的,目的是防止您使用的代码没有执行它本来打算执行的操作错误消息本身

error: negative width in bit-field ...

然而,这是严重的误导。

关于c - 发送指向哈希表的指针会导致编译错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25348038/

10-11 23:03
查看更多