在上面一篇中介绍到,监控模块要做成一个驱动模块(或者说是可加载模块,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. raft 分布式协议 -- mongodb

    http://www.mongoing.com/presentations/webinar-raft-consensus-in-mongodb#rd

  2. linux解压缩命令

    1.tar -cvf /data/sc2.tar /data (只打包,不压缩) 把/data下的文件打包成 sc.tar  上面两个都是绝对路径噢 tar -zcvf /data/sc2.tar.g ...

  3. 如何让MFC程序关闭按钮失效,也无法右击任务栏关闭窗口来关闭?

    如何让MFC程序关闭按钮失效,也无法右击任务栏关闭窗口来关闭,即右键任务栏的关闭窗口失效呢?很简单,有一个小窍门就是:响应IDCANCEL消息,具体实现如下: 首先定义消息映射:ON_BN_CLICK ...

  4. android应用一(调用WebServices)

    搞了一个月的android,现学现卖,终于还是搞完了,停下来,整理思路,写写记录吧. 我们知道android访问远程数据库主要有两种协议,一种是SOAP,另外一种就是HTTP.而我们再看看WebSer ...

  5. jQuery模拟页面加载进度条

    因为我们无法通过任何方法获取整个页面的大小和当前加载了多少,所以想制作一个加载进度条的唯一办法就是模拟.那要怎么模拟呢? 我们知道,页面是从上往下执行的,也就是说我们可以大致估算出在页面的某个位置加载 ...

  6. JDK1.8聚合操作

    在java8 JDK包含许多聚合操作(如平均值,总和,最小,最大,和计数),返回一个计算流stream的聚合结果.这些聚合操作被称为聚合操作.JDK除返回单个值的聚合操作外,还有很多聚合操作返回一个c ...

  7. (转) linux虚拟机中和主机三种网络连接方式的区别

    在介绍网络模式之前,关于网络的几个简单命令的使用 ifup eth0   //启动网卡eth0 ifdown eth0 //关闭网卡eth0 /etc/network/interfaces  //网络 ...

  8. C#中堆和栈的区别分析(有待更新总结2)

    转载:http://blog.csdn.net/Zevin/article/details/5731965 线程堆栈:简称栈 Stack 托管堆: 简称堆 Heap 使用.Net框架开发程序的时候,我 ...

  9. (经典)tcp粘包分析

    转载自csdn:http://blog.csdn.net/zhangxinrun/article/details/6721495 这两天看csdn有一些关于socket粘包,socket缓冲区设置的问 ...

  10. hibernate中一对多Set的排序问题

    因为set是无序的,一旦涉及set排序,就需要配置hibernate的配置文件,参考如下博文 http://ykyfendou.iteye.com/blog/2094325