• Linux内核监控模块-1-驱动模块(LKM)开发(以一个简单的hello world程序为例)


    在上面一篇中介绍到,监控模块要做成一个驱动模块(或者说是可加载模块,LKM),动态的加载到Linux内核中。那么这篇就简单的介绍一下怎样做一个这样的驱动模块。
     
    以简单的hello world程序为例,我们如何把它写成一个驱动模块,并加载到Linux内核里面呢?
     
    一开始,你要保证你的Linux系统有内核源码树。现在的Linux发行版安装时记得选择是Developer模式安装,基本上就行了。
     
    首先,你要写一个hello.c源代码文件,代码如下。
     
     
    然后你要写一个Makefile文件用来编译原文件,代码如下。
    注意:第二行的目录地址就是你的内核安装目录下的build目录,在你的系统中能找到这个目录的话,说明就有内核源码树。
     
    hello.c和Makefile在同一个目录下,在这个目录下,执行make命令。
    不出错的话,会显示以上信息,编译成功。
    然后你的目录下会生成很多文件,其中hello.ko最为关键,是我要加载到内核的模块。
     
    接下来就是要将生成的hello.ko加载到内核中。此时我们需要切换到root用户。
    执行su命令,并输入root用户的密码切换到root用户。
     
    执行insmod hello.ko命令,无任何错误提示信息的话,说明加载成功了。
     
    参看前面的源代码可知,我们打印了hello world信息和当前运行进程的信息,但是我们在控制台并没有看到打印出来的信息。
    那是因为,我是在Windows虚拟机里面的运行的Linux系统进行的试验,所以没有在控制台打印,而是输出到了系统日志文件中。
    进入系统日志文件/var/log/message查看,不同的发行版系统日志的保存目录可能不同。
    可以看到,系统日志中记录了要打印的信息。
     
    那么如何将加载到内核的模块从内核中卸载呢?
    在root用户下,执行rmmod hello命令(在任何目录下执行都行,不一定要在hello.ko的目录下),如何无任何错误提示信息,说明卸载成功。
    在日志中,可以找到卸载成功,打印的信息。
     
    以上就是以一个简单的hello world程序进行的驱动模块开发,是不是没有想象的那么难~
    开始进行更加复杂的开发吧~
     
    最后附上源码。
    hello.c
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/sched.h>
    
    MODULE_LICENSE("Dual BSD/GPL");
    
    static void hello_init(void){
        printk(KERN_ALERT "hello world!
    ");
    }
    
    static void hello_exit(void){
        printk(KERN_ALERT "Goodbye!
    ");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);

    Makefile

    obj-m := hello.o
    KERNELDIR := /lib/modules/3.13.0-32-generic/build
    PWD := $(shell pwd)
    modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
    modules_install:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

     

  • 相关阅读:
    vim 插件之NERD tree
    vim 插件之supertab
    离开页面时发送请求
    修改属性item1(1变化)
    node+express 中安装nodemon实时更新server.js
    vue封装element中table组件
    mysql常用语句
    mysql新建表
    node+express POST请求
    node+express 发送get请求
  • 原文地址:https://www.cnblogs.com/lxw315/p/4614343.html
Copyright © 2020-2023  润新知