#include <linux/kernel.h> //内核 #include <linux/module.h> //内核模块 #include <linux/init.h> //模块初始化和注销 #include <linux/slab.h> //屋里内存分配管理 #include <linux/list.h> //内核链表 //结构体 struct person { char name[30]; //姓名 int age; //年龄 struct list_head listhead; //链表头 }; struct person *ptrperson; //结构体 struct person *tmpperson; //临时变量 struct list_head person_list; //链表 struct list_head *pos; //指向链表当前结点 //模块初始化 int person_init(void) { int i=0; INIT_LIST_HEAD(&person_list); //初始化链表表头指针 //申请10个struct person大小连续的物理内存 ,并指定头指针 //kmalloc(内存大小,内存的类型); ptrperson=kmalloc(sizeof(struct person)*10,GFP_KERNEL); memset(ptrperson,0,sizeof(struct person)*10); //初始化链表内容 //循环给链表赋值 for(;i<10;i++) { sprintf(ptrperson[i].name,"[%d]",i+1); //姓名教师 ptrperson[i].age=i+1; //年龄 //list_add(结构体的链表指针,链表); //list_add(&(ptrperson[i].listhead),&person_list); //将新链表加入到链表中 list_add_tail(&(ptrperson[i].listhead),&person_list); //将新链表插入到链表尾部 } //测试循环读取链表中的数据 list_for_each(pos,&person_list) { //list_entry(空指针,结构体类型,结构体中的链表头); tmpperson=list_entry(pos,struct person,listhead); printk("Name:%s,Age:%d\n",tmpperson->name,tmpperson->age); } return 0; } //模块注销 void person_exit(void) { int i=0; for(;i<10;i++) { list_del(&(ptrperson[i].listhead)); printk("list_del[%d]\n",i+1); } kfree(ptrperson); printk("person_exit\n"); } module_init(person_init); module_exit(person_exit); //内核模块声明 MODULE_LICENSE("GPL"); MODULE_AUTHOR("EDISON_REN"); MODULE_DESCRIPTION("LIST_MODULE_TEST"); MODULE_ALIAS("LIST_MODULE_TEST");
Makefile文件
obj-m := kperson.o #指定内核模块名称 KDIR := /usr/src/linux-headers-3.13.0-32-generic #指定编译的内核源文件路径 all: make -C $(KDIR) M=$(PWD) modules #ARCH=arm CROSS_COMPILE=arm-linux- clean: rm -f *.ko *.o *.mod *.symvers *.order
时间: 2024-09-26 22:45:02