在上面一篇中介绍到,监控模块要做成一个驱动模块(或者说是可加载模块,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!\n");
} static void hello_exit(void){
printk(KERN_ALERT "Goodbye!\n");
} module_init(hello_init);
module_exit(hello_exit);

Makefile

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

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

  1. 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ...

  2. 《Linux内核分析》 第三周 构造一个简单的Linux系统MenuOS

    Linux内核分析 第三周 构造一个简单的Linux系统MenuOS 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...

  3. Linux内核设计第二周学习总结 完成一个简单的时间片轮转多道程序内核代码

    陈巧然 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.使用实验楼的虚拟机 ...

  4. 《Linux内核分析》week1作业-分析一个简单c语言的汇编代码

    1.C语言源码 #include <stdio.h> int g(int x){ ; } int f(int x){ return g(x); } int main(){ )+; } 2. ...

  5. iOS开发UI篇—简单的浏览器查看程序

    iOS开发UI篇—简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件 ...

  6. iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

    iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: // // YYcar ...

  7. 开发部署一个简单的Servlet

    Servlet是一个执行在服务器端的Java Class文件,载入前必须先将Servlet程序代码编译成.class文件,然后将此class文件放在servlet Engline路径下.Servlet ...

  8. Linux内核监控模块-0-开篇简介

    最近做了一个关于Linux内核编程的项目,主要实现的功能是对文件系统的监控. 我采用的方式是将监控的功能做成一个可加载模块(LKM)的形式,动态加载到Linux内核中.在这个内核层的“监控模块”中,我 ...

  9. Linux内核监控模块-2-系统调用表地址的获取(Linux内核版本3.13)

    那么在Linux内核2.6之后,不能直接导出sys_call_table的地址后,我们要如何获得系统调用表的地址,从而实现系统调用的截获呢. 先贴上我实现好的代码,然后再来讲解吧. modu.c #i ...

随机推荐

  1. LTTng 简介&使用实战

    一.LTTng简介 LTTng: (Linux Trace Toolkit Next Generation),它是用于跟踪 Linux 内核.应用程序以及库的系统软件包.LTTng 主要由内核模块和动 ...

  2. linux内核分析系列--百度

    http://www.baidu.com/p/frsllzh http://www.baidu.com/p/%E9%98%BF%E4%BF%A1sxq

  3. mysql 插入语句

    mysql 插入语句 什么时候用单引号,什么时候不用? 1.先创建一个表 create table user(username varchar(255),age int,marry boolean,b ...

  4. iOS监听电话事件

    项目上有个需求,要求打完电话后加积分. 首先导入这两个头文件: #import <CoreTelephony/CTCallCenter.h> #import <CoreTelepho ...

  5. Linux强制踢出登录用户(断线账户剔除)

    首先,用w查看登录用户 :: up days, :, users, load average: 1.00, 1.01, 1.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU ...

  6. 安装SQL Server2005出现 IIS警告原因

    出现此问题的原因取决于 SQL Server 的不是所有 IIS 7.0 组件都安装在计算机上.下表列出了受影响的组件. 组件 文件夹 静态内容 常见的 HTTP 功能 默认文档 常见的 HTTP 功 ...

  7. 程序员带你学习安卓开发,十天快速入-对比C#学习java语法

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  8. Linux - 扩展

    每次输入命令行按下 Enter 键时,bash 都会在执行命令之前对文本进行多重处理.比如 "cd ~" 中的 "~" 的会被识别为当前用户的主目录.产生这个结 ...

  9. chrome跨域配置

    "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --use ...

  10. myeclipse10 中修改html,servlet,jsp等的生成模板

    1.进入myeclipse的安装目录 2.用减压软件,(如winrar)打开common\plugins\com.genuitec.eclipse.wizards_9.0.0.me2011080913 ...