我有一个类似于的结构
struct test
{
int a;
struct* page p;
struct list_head l;
};
我已经检查了include/linux/list.h
,但我不确定该如何添加到我的列表中。我做的是:
test* node_1 = (struct test*)malloc(sizeof(test));
node_1->a = 10;
node_1->p = alloc_page();
LIST_HEAD(node_1->l);
// for the rest nodes
test* node_2 = (struct test*)malloc(sizeof(test));
node_2->a = 20;
node_2->p = alloc_page();
//can I use list_add or should I write a custom add?
list_add(node_2,node_1); //???
对于添加每个节点,list_add
的第二个参数应该是node_1
?
@Sweet,我使用下面的内核公开列表开发了一个小型内核模块,如果您有任何疑问或反馈,请联系我。
void todo_add_entry(struct todo_struct *new)
{
#ifdef QUEUE
list_add_tail(&new->list, &first.list);
#else
list_add(&new->list, &first.list);
#endif
}
void todo_del_entry(struct todo_struct *new)
{
struct todo_struct *str, *temp;
list_for_each_entry_safe(str, temp, &first.list, list)
{
if((str->priority == new->priority) && (str->name == new->name))
{
list_del(&str->list);
#ifdef DEBUG
dmsg("Same:%d t %dn", str->priority, new->priority);
#endif
kfree(str);
}
}
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
static long
list_minor_ioctl(struct file *filp, U32 cmd, unsigned long arg)
#else
static int
list_minor_ioctl(struct inode *inode, struct file *filp, U32 cmd,
unsigned long arg)
#endif
{
S32 res = 0;
S32 err = 0;
struct todo_struct *new;
struct test *a;
if(_IOC_TYPE(cmd) != IOCTL_LIST_MAGIC)
return -ENOTTY;
if(_IOC_NR(cmd) > IOCTL_MAX_CMDS)
return -ENOTTY;
if(_IOC_DIR(cmd) & _IOC_READ)
err = !access_ok(VERIFY_WRITE, (void __user*) arg, _IOC_SIZE(cmd));
if(_IOC_DIR(cmd) & _IOC_WRITE)
err = !access_ok(VERIFY_READ, (void __user*) arg, _IOC_SIZE(cmd));
if(err)
return -EFAULT;
new = kmalloc(sizeof(*new), GFP_KERNEL);
a = (struct test *) arg;
switch(cmd)
{
case IOCTL_LIST_ADD:
new->priority = a->priority;
new->name = a->name;
INIT_LIST_HEAD(&new->list);
todo_add_entry(new);
break;
case IOCTL_LIST_DEL:
new->priority = a->priority;
new->name = a->name;
#ifdef DEBUG
dmsg("prio:%d t name:%s n", new->priority, new->name);
#endif
todo_del_entry(new);
break;
default: /* Default case --> Ignore, will never get executed */
break;
}
return res;
}