在上面一篇中介绍到,监控模块要做成一个驱动模块(或者说是可加载模块,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. EasyUI-增删改操作

    最近公司要用easyui,这里自己看了官网几篇文章,遇到些问题,大多数的问题都是敲代码的时候笔误,其他有些地方确实需要注意一下,这里做些笔记. 1.在mysql中建好表之后修改id字段为递增字段,发现 ...

  2. Win8.1 与 pl2303驱动

    在8.1上最新的pl2303驱动都不支持Win8.1了.要使用老的驱动 http://www.drv5.cn/sfinfo/9385.html 这里这个驱动里面有五个文件,通过在设备管理器里面查看串口 ...

  3. iOS监听电话事件

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

  4. 构建工具Gradle安装和简单使用

    1. 安装 到gradle官网下载页 https://gradle.org/gradle-download/ 下载gradle,其中“完全版(Complete distribution)”包含除了运行 ...

  5. css3中允许单词内断句word-wrap和怎么处理断句word-break

    首先说一下:浏览器的默认行为,在一行中几个单词 排列着,如果最后一个长单词 太长时 首先是移到下一行,如果该单词的长度大于父元素的宽度,会溢出. <!doctype html> <h ...

  6. ACCESS表与CSV文件相互导入、导出的SQL语句

    一.将ACCESS表导出为CSV文件:Select * INTO [TEXT;FMT=CSV;DELIMITED;HDR=YES;DATABASE=E:\temp\].test.csv FROM Sh ...

  7. 第三部分 关于HHibernate中关键字ID的配置

    实体类映射中,必须配置一个关键字,对应着数据表的关键字,大多数的实体类也都有一个属性表示类的唯一性,在实体类配置文件(.hbm.xml)中,<id>元素的就是这个作用. 一个完整的ID配置 ...

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

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

  9. AsyncTask理解- Day36or37

    AsyncTask理解- Day36or37 mobile 5.0 1.手机归属地查询 AtoolsActivity Assets目录特点 该文件是原生文件,不会对里面的文件进行编码 该文件只支持读取 ...

  10. Windows10 安装配置IIS,并将程序发布到服务器上

    1.确保计算机链接网络(也可在不联网的时候使用安装包进行IIS的安装): 2.打开“控制面板”(“菜单”按钮+x 快捷键)——“程序”——“打开或关闭Windows功能”——展开“Internet信息 ...