一个简单的内核模块

Posted foggia2004

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单的内核模块相关的知识,希望对你有一定的参考价值。

#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

 

以上是关于一个简单的内核模块的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地将 C 代码片段编译到我的 Perl 模块?

在ubuntu下,编译内核模块遇到内核模块不匹配的问题,目标代码是简单的hello.c模块,能够正确编译。我下载

linux内核可加载模块编程简单入门

5Linux内核模块开发

什么是在 C++ 中获取总内核数量的跨平台代码片段? [复制]

旧文章搬运ZwQuerySystemInformation枚举内核模块及简单应用