添加简单的linux内核模块,linux内核添加模块

参考:

http://blog.csdn.net/gaoguoxin2/article/details/50220665

动态添加模块不需要编译内核。

LINUX的模块主要由6部分组成:

1、模块的加载函数(必须)

当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。

2、模块的卸载函数(必须)

当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。

3、模块许可证声明

模块许可证(LICENSE)声明描述内核模块的的许可权限,如果不声明LICENSE,模块被加载时,将接到内核被污染的警告。

4、模块参数(可选)

模块参数是模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量。

5、模块导出符号(可选)

内核模块可以导出符号(symbol,对应于函数或者是变量),这样其他模块就可以使用本模块中的变量或者是函数。

6、模块作者等信息声明(可选)

知道了LINUX模块的组成后,我们来编写一个简单的LINUX内核模块hello.c

在内核源代码树形目录的drivers目录下新建一个文件夹,名字为testmod,然后进入此文件夹中,创建我们的.c源文件,hello.c:

#include

#include

#include

static int hello_init(void)

{

printk(KERN_ALERT "Hello world enter!\n");

return 0;

}

static void hello_exit(void)

{

printk(KERN_ALERT "Hello world exit...\n");

}

module_init(hello_init);

module_exit(hello_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("rao");

源代码编写完之后,接下来我们添加MAKFILE编译文件,首先修改drvier目录下的MAKEFILE文件,添加testmod目录到此MAKEFILE

修改drvier目录下的MAKEFILE文件,在最后一行添加:

obj-y += testmod/

然后在testmode目录下,添加一个MAKEFILE 文件,文件的内容为:

obj-m := hello.o

做好上面的准备工作之后,我们开始编译模块文件,使用如下的编译命令:

make -C /usr/src/kernels/`uname -r` M=/usr/src/kernels/`uname -r`/drivers/testmod  modules

输入以上命令之后,我们将会成功得到模块文件,hello.ko

当模块文件生成之后,使用命令insmod hello.ko加载模块,用命令dmesg  | tail -1, 我们将看到屏幕上打印Hello world enter!

使用命令rmmod hello.ko卸载模块,用命令dmesg  | tail -1,我们将在屏幕看到打印Hello world exit...

(实例)Linux 内核添加exfat驱动

背景: 由于exfat是常用的文件系统格式,而Linux由于版权的问题,没有在官方中添加有关的驱动. 但是 微软也同意开源了,所以比较新的 Linux 会支持这一块. 为了支持exfat的驱动,我们需 ...

Linux 内核 编译模块

背景: 由于调试内核或者由于分区大小限制,有时候内核组件不一定完全需要编进内核中. 所以,在开发中经常将内核组件编译成为模块,等到在恰当的时机加载. 概览: Linux内核模块的编译方法有两种: 1. ...

Linux内核-模块编译和安装

我安装Ubuntu的时候是没有安装源码的,在没有安装源码前 /usr/src/ 目录下是只有两个包含内核的头文件的文件夹的: 我的内核版本是: 所以接下来就是先安装内核源码: 执行后,/usr/src ...

linux内核netfilter模块分析之:HOOKs点的注册及调用

转自;http://blog.csdn.net/suiyuan19840208/article/details/19684883 -1: 为什么要写这个东西?最近在找工作,之前netfilter 这一 ...

Linux内核(6) - 模块机制与“Hello World!

有一种感动,叫内牛满面,有一种机制,叫模块机制.显然,这种模块机制给那些Linux的发烧友们带来了方便,因为模块机制意味着人们可以把庞大的Linux内核划分为许许多多个小的模块.对于编写设备驱动程序的 ...

linux内核及其模块的查询,加载,卸载 lsusb等

http://blog.sina.com.cn/s/blog_53e81e2a0100zkxi.html 1,/sbin/update-modules文件,他是一个linux通用的模块管理脚本程序. ...

操作系统项目:向Linux内核添加一个系统调用

内容: 向Linux增加一个系统调用 撰写一个应用测试程序调用该系统调用 使用ptrace或类似的工具对该测试程序进行跟踪调 环境: 1.vmware workstation 15.0.0 2.ubu ...

【request_firmware】 linux内核下载模块固件接口【转】

转自:http://blog.csdn.net/magod/article/details/6049558 [-] 8 处理固件 1481 内核固件接口 1482 它如何工作 14.8. 处理固件 作 ...

Linux 内核与模块调试

一.简介 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核的关键在于你的对内核的深刻理解.   二.方法总结 1)内核模块相关指令 ht ...

随机推荐

main函数的argc和argv

int main(int argc, char const *argv[]) { printf("argc : %c\n",argc); printf(] ); printf( ...

iOS开发那些事-iOS6苹果地图实用开发

在iOS 6之后,不再使用谷歌地图了,而是使用苹果自己的地图,但是API编程接口没有太大的变化.开发人员不需要再学习很多新东西就能开发地图应用,这是负责任的做法.因此本节介绍的内容也同样适用于iOS5 ...

cxlibw-5-0.dll was not found

However every once in a while we are getting the following error message: "This application has ...

My Calendar III

class MyCalendarThree(object): """ Implement a MyCalendarThree class to store your ev ...

『zkw线段树及其简单运用』

阅读本文前,请确保已经阅读并理解了如下两篇文章: 『线段树 Segment Tree』 『线段树简单运用』 引入 这是一种由\(THU-zkw\)大佬发明的数据结构,本质上是经典的线段树区间划分思想, ...

MongoDB自学(3)

MongoDB关系:MongoDB的关系表示多个文档之间在逻辑上的相互联系.文档之间可以通过嵌入和引用来建立联系.关系:1:11:NM:1M:N 嵌入式:{ id:11;name:嘻嘻嘻;addres ...

15 - reduce-pratial偏函数-lsu_cache

目录 介绍 1 reduce方法 2 partial方法(偏函数) 2.1 partial方法基本使用 2.2 partial原码分析 2.3 functools.warps实现分析 3 lsu_ca ...

Thunder团队第五周 - Scrum会议3

Scrum会议3 小组名称:Thunder 项目名称:i阅app Scrum Master:王航 工作照片: 苗威同学在拍照,所以不在照片内. 参会成员: 王航(Master):http://www. ...

[干货,阅后进BAT不是梦]面试心得与总结---BAT、网易、蘑菇街

本文转载自:公众号:JANiubility 前言 之前实习的时候就想着写一篇面经,后来忙就给忘了,现在找完工作了,也是该静下心总结一下走过的路程了,我全盘托出,奉上这篇诚意之作,希望能给未来找工作的人 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值