码迷,mamicode.com
首页 > 其他好文 > 详细

一个简单的内核模块

时间:2016-05-23 21:09:58      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

#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

 

一个简单的内核模块

标签:

原文地址:http://www.cnblogs.com/foggia2004/p/5521330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!