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】Longest Valid Parentheses

    Longest Valid Parentheses Given a string containing just the characters '(' and ')', find the length ...

  2. 多线程同步_Monitor

    多线程一直在学习和理解中...... Monitor类是多线程中用以实现同步的一种技术,主要是同一进程内多线程间的同步技术. Monitor类中有以下几个方法需要注意: Monitor.Enter(o ...

  3. MongoDB 副本集管理(不定时更新)

    简介: 前面介绍完了副本集的搭建.用户的管理.参数和日常操作的说明,那副本集搭建好该如何管理呢?现在来说明下副本集的日常查看和管理. 说明: 1)查看命令行参数:db.serverCmdLineOpt ...

  4. monitor system

    #!/bin/bash # #Snapshot_Stats - produces a report for system stats # This report will mail to root. ...

  5. ant使用指南详细入门教程

    这篇文章主要介绍了ant使用指南详细入门教程,本文详细的讲解了安装.验证安装.使用方法.使用实例.ant命令等内容,需要的朋友可以参考下 一.概述 ant 是一个将软件编译.测试.部署等步骤联系在一起 ...

  6. 最牛逼android上的图表库MpChart(三) 条形图

    最牛逼android上的图表库MpChart三 条形图 BarChart条形图介绍 BarChart条形图实例 BarChart效果 最牛逼android上的图表库MpChart(三) 条形图 最近工 ...

  7. 最牛逼android上的图表库MpChart(一) 介绍篇

    最牛逼android上的图表库MpChart一 介绍篇 MpChart优点 MpChart是什么 MpChart支持哪些图表 MpChart效果如何 最牛逼android上的图表库MpChart(一) ...

  8. php数据访问(批量删除)

    批量删除: 首先给每一行加上复选框,也就是在自增长列内加入checkbox.因为这里可以多选,也可以单选,所以在传值的时候需要传一个数组来进行处理,所以复选框name的值设定一个数组.传值都是传的va ...

  9. Jquery选中行实现行中的Checkbox的选中与取消选中

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...

  10. wc(Word Count)

    .查看文件的字节数.字数.行数 wc test.txt --> 行数 单词数 字节数 文件名 .用来统计当前目录下的文件数(数量中包含当前目录) ls -l | wc -l -c 统计字节数. ...