linux内核模块基础

一、定义

Linux 内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢: 方法

  1:把所有的组件都编译进内核文件,即:zImage 或 bzImage,但这样会导致一个问题:占用内存过多.

  2.有一种机制能让内核文件本身并不包含某组件,而是在该组件需要被使用的时候,动态地添加到正在运行的内核中。

内核模块特点:
  1.模块本身并不被编译进内核文件(zImage 或者 bzImage)。
  2. 可以根据需求,在内核运行期间动态的安装或卸载。
  3.基本上是以.ko 结尾。

二、内核安装与卸载命令

1.安装 insmod
  例:insmod *.ko
2. 卸载 rmmod
  例:rmmod *
3. 查看 lsmod
  例:lsmod

三、内核模块设计

1.内核模块没有 main 函数

2.它的入口(加载函数):module_init()

3.出口(卸载函数):module_exit()

4. 必须包含头文件:

  #include <linux/init.h>

  #include <linux/module.h>

四、代码编写

4.1源码编写

 #include <linux/init.h>
#include <linux/module.h> MODULE_LICENSE("GPL"); static int hello_init(void)
{
printk(KERN_WARNING"hello wmx!\n");
return ;
} static void hello_exit(void)
{
printk(KERN_WARNING"Goodbye wmx!\n");
} module_init(hello_init);
module_exit(hello_exit);

4.2Makefile编写

 obj-m :=wmx.o
KDIR :=/home/kernel/kernel/linux-ok6410
all :
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
clean :
rm -rf *.o *.ko *.order *.symvers

其中:

    obj-m:指定内核模块最终产生的名字
如果是多个源文件组成的则要:
  obj-m:=wmx.o
  wmx-objs:=file1.o file2.o file3.o

  KDIR:=内核代码路径变量
  -C:(change Directory)表示进入后面路径
  M:内核模块代码路径
  M= $ (pwd):是指要编译的内核模块的源程序在那个目录下,$(PWD)指与Makefile 在同一目录下,也就是当前目录。(pwd 命令的作用是:print work directory).

  modules:指明要按照内核模块的方式编译。modules 实际上是$(KDIR)目录下
的 Makefile 的一个 Target 入口.

  CROSS_COMPILE:指定编译器

  ARCH:指定运行环境

五、运行安装和卸载

1.使用 make 进行编译

2.将生成的.ko复制到nfs挂载的目录下面

3.进入串口控制台操作

3.1安装:

  insmod wmx.ko

3.2卸载:(注意这里没有后缀.ko)

  rmmod wmx

3.2.1卸载过程如果出现错误:

3.2.2新建目录
  mkdir -p /lib/modules/$(uname -r)

六、内核模块选项学习

6.1模块申明

1、MODULE_LICENSE(”遵守的协议”) 申明该模块遵守的许可证协议,如:“GPL“、”GPL v2“等

2、MODULE_AUTHOR(“作者”) 申明模块的作者

3、MODULE_DESCRIPTION(“模块的功能描述") 申明模块的功能

4、MODULE_VERSION("V1.0") 申明模块的版本

6.2模块参数

  通过宏 module_param 指定保存模块参数的变量。模块参数用于在加载模块时传递参数给模块。

module_param(name,type,perm)

  name:变量的名称

  type:变量类型,bool:布尔型 int:整型 charp:字符串型

  perm 是访问权限。S_IRUGO:读权限 S_IWUSR:写权限

例:int a = 3; char *st;
module_param(a,int, S_IRUGO);
module_param(st,charp, S_IRUGO);

 int a=;
module_param(a,int, S_IRUGO|S_IWUSR);
static int hello_init(void)
{
printk(KERN_WARNING"hello wmx!\n");
printk(KERN_WARNING"a is:%d\n",a);
return ;
}

编译安装内核模块时传递变量值:

# insmod  wmx.ko  a=10
输出:

  hello wmx!
  a is:10

6.3符号导出

  在一个内核模块中实现一个变量或者参数,如果要在其他内核模块中要使用变量或者参数则要将其声明为外部可使用。就要使用内核符号导出:

1.使用宏 EXPORT_SYMBOL(符号名)
2.EXPORT_SYMBOL_GPL(符号名)

其中 EXPORT_SYMBOL_GPL 只能用于包含 GPL 许可证的模块。

使用实例:

  外部文件使用该标示符时必须先申明为外部标示符:extern …

在wmx.c文件中:

 void jj()
{
printk(KERN_WARNING"love jj!\n");
}
EXPORT_SYMBOL(jj);

在jj.c文件中:

 extern jj();
static int init(void)
{
jj();
return ;
}

  然后先运行insmod wmx.ko

  接着在运行:insmod jj.ko

结果如下:

  

5.linux内核模块基础,内核模块学习的更多相关文章

  1. 【linux】基础知识学习

    [版本] 两种:内核版本 . 发行版本 内核版本从 www.kernel.org 查看 发行版本: 1.retHat, centOS 更稳定,更安全,适宜做企业服务器 2.ubuntu, Debian ...

  2. Linux网络编程&内核学习

    c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...

  3. (转)Linux基础知识学习

    Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过 ...

  4. 20135231 —— Linux 基础入门学习

    20135231 何佳 学习计时:共12小时 读书:5 代码:2 作业:2 博客:3 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Li ...

  5. Linux驱动设计—— 内核模块(一)

    Linux内核理论基础 组成Linux内核的5个子系统:进程调度(SCHED)/内存管理(MM)/虚拟文件系统(VFS)/网络接口(NET)/进程间通信(IPC). 进程调度(SCHED) 在设备驱动 ...

  6. linux基础命令学习笔记(二)

    linux基础命令学习笔记(二) 1.kill :终止进程  kill pid (唯一标示一个进程) kill -9  强制终止  kill -15 命令未结束不能终止 # ps aux 查看所有进程 ...

  7. 安装Linux系统,学习Linux操作基础

    20189230杨静怡 2018-2019-2 <移动平台开发实践>第1周学习总结 安装Linux系统内容总结 一.学习"基于VirtualBox虚拟机安装Ubuntu图文教程& ...

  8. [转帖] Linux运维基础知识学习内容

    原作者地址:https://www.cnblogs.com/chenshoubiao/p/4793487.html 最近在学习 linux  对简单的命令有所掌握 但是 复杂的脚本 shell pyt ...

  9. VBox&vmware虚拟机安装Linux及Linux基础入门学习

    VBox&vmware虚拟机安装Linux及Linux基础入门学习 通过VMware workstation安装Linux 在安装虚拟机之前,我特意上网搜索了一下目前常使用的虚拟机软件,了解了 ...

随机推荐

  1. 【leetcode】Validate Binary Search Tree

    Validate Binary Search Tree Given a binary tree, determine if it is a valid binary search tree (BST) ...

  2. Linux下如何移除同时在线的用户

    Linux下移除同时在线的用户太多时,shell操作会变得比较卡,很多时候经常是直接关闭终端导致不正常退出,一般要等上一段时间才会退出,这个时候主动结束用户进程使用户下线是比较好的方式,方法如下: 使 ...

  3. ffmpeg-20160508-git-bin-v2

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...

  4. HTML~From

    表单用于向服务器传输数据. http://www.w3school.com.cn/tags/tag_form.asp 文本域(Text fields) 本例演示如何在HTML页面创建文本域.用户可以在 ...

  5. Effective C++ -----条款40:明智而审慎地使用多重继承

    多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. virtual继承会增加大小.速度.初始化(及赋值)复杂度等等成本.如果virtual base classes不带任何 ...

  6. nyoj221_Tree_subsequent_traversal

    Tree 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 Little Valentine liked playing with binary trees very ...

  7. LeetCode 263 Ugly Number

    Problem: Write a program to check whether a given number is an ugly number. Ugly numbers are positiv ...

  8. URAL 2019 Pair: normal and paranormal (贪心) -GDUT联合第七场

    比赛题目链接 题意:有n个人每人拿着一把枪想要杀死n个怪兽,大写字母代表人,小写字母代表怪兽.A只能杀死a,B只能杀死b,如题目中的图所示,枪的弹道不能交叉.人和怪兽的编号分别是1到n,问是否存在能全 ...

  9. IOS-JSON & XML解析

    XML & JSON 简介 •JSON –作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 –基于JavaScript的一个子集 –易读性略差,编码手写难度大,数据量小 ...

  10. VS2013调试时,IIS Express Worker Process 已停止工作

    之前调试都没有报错的,今天突然报错了,然后网上找了下资料,很快解决了问题 这是我报错的提示 解决办法: 用管理员身份运行CMD,输入netsh winsock reset并回车(注意,必须是已管理员身 ...