一个简单的内核模块

#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-07-28 19:10:22

一个简单的内核模块的相关文章

一个简单的内核模块实现和使用

一个简单的内核模块包括3个要素 1.MODULE_LICENSE("Dual BSD/GPL");  //模块许可声明 2.module_init(s5pv210_led_init);  //模块加载入口声明 3.module_exit(s5pv210_led_exit); //模块卸载入口声明 代码实现:hello_world.c #include <linux/kernel.h> #include <linux/module.h> MODULE_LICENS

0915-----Linux设备驱动 学习笔记----------一个简单的字符设备驱动程序

0.前言 研究生生活一切都在步入正轨,我也开始了新的学习,因为实在不想搞存储,所以就决定跟师兄学习设备驱动,看了两星期书,终于有点头绪了,开始记录吧! 1.准备工作 a)查看内核版本 uname -r b)安装内核源码树(http://www.cnblogs.com/Jezze/archive/2011/12/23/2299871.html) 在www.linux.org上下载源码编译,这里是.xz格式,需要安装解压工具,xz-utils: 解压方法示例:xz -d linux-3.1-rc4.

Linux内核分析——构造一个简单的Linux系统MenuOS

马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码简介 1.计算机三大法宝 存储程序计算机 函数调用堆栈 中断机制 2.操作系统两把宝剑 中断上下文的切换 进程上下文的切换 3.函数目录 Linux-3.18.6/arch/x86 内核启动相关的代码基本都存在init目录中. start_kernel函数相当于普通C程序的main函数. Linux内核的核心代

linux设备驱动第二篇:一个简单hello world驱动如何实现

上一篇介绍了linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试驱动程序.而这个驱动的唯一功能就是输出hello world. 在编写具体的实例之前,我们先来了解下linux内核下调试程序的一个重要函数printk以及几个重要概念. printk类似c语言的printf,是内核中输出打印信息的函数.以后驱动调试中的重要性不言而喻,下面先做一个简单介绍. printk的级别 日志级别一共有8个级别,pr

一个简单的主机管理模拟程序

最近写的一个小练习,主要是把前面学的东西整合一下.写了一个简单的主机管理界面,主要是练习以下知识点: Session和Cookie进行登录验证(装饰器) 数据库的基本操作 (单表,1对多,多对多) Form的简单使用实现验证 Bootstrap模板写个简单界面 自定义分页 信号,中间件,CSRF,模板语言,JavaScript,AJAX等等 界面比较low,毕竟不是专业的. 附件里面是Django的源代码,3个文件放在一起winrar解压就可以打开

Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)

[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Windows 操作系统中,利用微软 Visual Studio 2005 编译生成 Libevent 2.0.10 静态链接库,并利用 Libevent 静态链接库,实现一个简单的 HTTP Web服务器程序:httpd.exe. 假设 Visual Studio 2005 的安装路径为“D:\Program

完成一个简单的时间片轮转多道程序内核代码

王康 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 " 分别是1 存储程序计算机工作模型,cpu执行程序的基础流程: 2 函数调用堆栈:各种寄存器和存储主要是为了指令的传取值,通过eip,esp,eax,ebp和程序内存的分区,搭配push pop call return leave等一系列指令完成函数调用操作. 3 中断:多道批程序! 在复习一下上一讲的几个重要指令

一个简单的税利计算器(网页版)

嗯嗯,做一个简单的网页版的税率计算器,功能比较简单,但是相对比较实用.因为参考了一些其他作品,所以在计算汇率的时候习惯性的是以美元做单位.具体的功能有着较为详细的标注.仅供大家学习参考下. <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>JavaScript Loan Calculator</title>

利用JSP编程技术实现一个简单的购物车程序

实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP中数据库编程方法: 二.实验要求 : 利用JSP编程技术实现一个简单的购物车程序,具体要求如下. (1)用JSP编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息. (2)编写一个JSP程序来处理用户提交的登录信息,如果用户名为本小组成员的名字且密码为对应的学号时,采用J