内核N日游之内核链表
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jackhenry");
MODULE_DESCRIPTION("List module");
MODULE_ALIAS("a kernel list sample");
struct student
{
char name[100];
int num;
struct list_head list;
};
struct student *pstudent;
struct student *tmp_student;
struct list_head student_list;
struct list_head *pos;
int mylist_init(void)
{
int i = 0;
INIT_LIST_HEAD(&student_list);
pstudent = kmalloc(sizeof(struct student)*5,GFP_KERNEL);
memset(pstudent,0,sizeof(struct student)*5);
for(i=0;i<5;i++)
{
sprintf(pstudent[i].name,"Student%d",i+1);
pstudent[i].num = i+1;
list_add( &(pstudent[i].list), &student_list);
}
list_for_each(pos,&student_list)
{
tmp_student = list_entry(pos,struct student,list);
printk("<0>student %d name: %s/n",tmp_student->num,tmp_student->name);
}
return 0;
}
void mylist_exit(void)
{
int i ;
for(i=0;i<5;i++)
{
list_del(&(pstudent[i].list));
}
kfree(pstudent);
}
module_init(mylist_init);
module_exit(mylist_exit);
在内核中加载insmod&查看模块lsmod&卸载模块rmmod:
附加实验:在mylist_exit函数中,将for(i=0;i<5;i++)换成 list_for_each来遍历删除结点,观察要发生的现象,并考虑解决办法?
修改后的模块为kernel_list.ko
先加载insmod kernel_list.ko:
加载SUCCESS!
然后卸载rmmod kernel_list
如上图所示,出现段错误.加载失败!用lsmod查看,发现该内核模块未被卸载!
附上include/linux/list.h头文件中的部分定义:
list_head结构体的定义:
list_entry的定义:
container_of在内核中的定义:
思考:将内核链表在应用程序中实现?