1. Linux 内核的整体结构非常庞大,其包含的组件也非常多,使用这些组件的方法有两种:

① 直接编译进内核文件,即zImage或者bzImage(问题:占用内存过多)

② 动态添加

  * 模块本身并不被编译进内核文件

  * 根据需求,在内核运行期间动态安装或卸载

2. 内核模块动态安装与卸载

①安装 insmod

例:insmod /home/dnw_usb.ko

②卸载 rmmod

例:rmmod dnw_usb

③查看 lsmod

例: lsmod

3. 模块声明

① MODULE_LICENSE()

② MODULE_AUTHOR()

③ MODULE_DESCRIPTION()

④ MODULE_VERSION()

4. 模块参数

① 模块参数用于在加载模块时传递参数给模块

② 通过宏module_param指定保存模块参数的变量

  module_param(name, type, perm)

  * name:变量的名称

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

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

③ 简单示例

int a = ;
char* ptr = NULL;
module_param(a, int, SIRUGO);
module_param(ptr, charp, SIRUGO);

命令行:insmod xxx.ko a=10 ptr="HelloWorld"

5. 符号导出

① 如果内核模块中的函数或者全局变量想让其他模块使用,必须进行导出

② 内核符号导出使用宏

  EXPORT_SYMBOL(符号名)

  EXPORT_SYMBOL_GPL(符号名)

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

6. 内核模块简单示例

① 模块代码:

#include <linux/init.h>
#include <linux/module.h> MODULE_LICENSE("GPL");
MODULE_AUTHOR("Kevin Wu");
MODULE_DESCRIPTION("For study Linux module");
MODULE_VERSION("1.0"); int a = ;
char* ptr = NULL; module_param(a, int, S_IRUGO);
module_param(ptr, charp, S_IRUGO); static int hello_init()
{
printk(KERN_WARNING"Hello world initlizing\n");
printk(KERN_WARNING"a = %d\n", a);
printk(KERN_WARNING"ptr = %s\n", ptr); return ;
} static void hello_exit()
{
printk(KERN_WARNING"Hello world exiting\n");
} module_init(hello_init);
module_exit(hello_exit);

② Makefile:

obj-m := helloworld.o

KDIR := /home/Linux/Kernal/linux-2.6.

all:
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm clean:
rm -f *.o *.ko *.order *.symvers

Linux内核模块简单示例的更多相关文章

  1. Linux 编程简单示例代码

    Linux进程管理 编辑a.c 文件 #include <stdio.h> #include <unistd.h> int main() { printf( "Mes ...

  2. Linux内核模块编程与内核模块LICENSE -《具体解释(第3版)》预读

    Linux内核模块简单介绍 Linux内核的总体结构已经很庞大,而其包括的组件或许多.我们如何把须要的部分都包括在内核中呢?一种方法是把全部须要的功能都编译到Linux内核.这会导致两个问题.一是生成 ...

  3. Linux字符设备简单示例

    1. Linux字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open.close.read和write系统调用.例如:串口.Led.按键等. 2. 通过字符设备文件 ...

  4. Linux下的C Socket编程 -- server端的简单示例

    Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...

  5. Linux I2C驱动--用户态驱动简单示例

    1. Linux内核支持I2C通用设备驱动(用户态驱动:由应用层实现对硬件的控制可以称之为用户态驱动),实现文件位于drivers/i2c/i2c-dev.c,设备文件为/dev/i2c-0 2. I ...

  6. Linux内核模块简介

    一. 摘要 这篇文章主要介绍了Linux内核模块的相关概念,以及简单的模块开发过程.主要从模块开发中的常用指令.内核模块程序的结构.模块使用计数以及模块的编译等角度对内核模块进行介绍.在Linux系统 ...

  7. linux 内核模块开发相关的文章搜集和模块开发过程中的小技巧

    最近需要开发一些内核模块,进行探究linux内核的一些特征,现在把一些遇到的比较好的文章和知识点,进行简要记录和备忘: 内核模块开发相关链接: https://www.thegeekstuff.com ...

  8. Linux内核模块学习

    注:本文是<Linux设备驱动开发详解:基于最新的Linux 4.0内核 by 宋宝华 >一书学习的笔记,大部分内容为书籍中的内容. 书籍可直接在微信读书中查看:Linux设备驱动开发详解 ...

  9. 爹地,我找到了!,15个极好的Linux find命令示例

    爹地,我找到了!, 15个极好的Linux find命令示例 英文原文:Daddy, I found it!, 15 Awesome Linux Find Command Examples 标签: L ...

随机推荐

  1. SQl Server 表链接查询

    之前漏下了,这里补一偏 select * from student,score ——笛卡尔积 可以想想成c#里面的多维函数的样子,打印时每一张表的每一条数据都会连带着第二张表的所有数据 两个表的连接: ...

  2. iOS 地图(添加大头针)

    首先在工程中导入MapKit.framework库文件 #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <U ...

  3. 安装了多个php版本,如何编译扩展

    cd /data/php-5.5.35/ext/mysqli  找到安装包目录下面的ext目录 ./configure --with-php-config=/usr/local/php5/bin/ph ...

  4. QT中显示图像数据

    博客转载自:https://blog.csdn.net/lg1259156776/article/details/52325091 一般图像数据都是以RGBRGBRGB……字节流的方式(解码完成后的原 ...

  5. java全栈day10--接口 多态

    接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义与 ...

  6. ModelSim Simulation of RapidIO II IP Core Demonstration Testbench May Require ld_debug Command

    Solution ID: fb83262Last Modified: May 17, 2013Product Category: Intellectual PropertyProduct Area: ...

  7. [转]CentOS 7.3 安装MySQL

    1.下载mysql源 yum -y install wget wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarc ...

  8. Mac下的UI自动化测试 (四)

    在实际写testcase的时候会使用unittest框架,但是在sikuli中需要使用它提供的command来运行,位于/Applications/SikuliX.app/run,使用-r参数指定要运 ...

  9. Html5代码片段收集

    HTML5 启动模板 当启动一个新的项目的时候,你需要一个启动模板.这里是一个简洁干净的模板,可以作为 HTML5 项目的基础. <!DOCTYPE html> <html> ...

  10. framwork maven的配置及使用

    maven的配置及使用 一.什么是maven: 我们在开发项目的过程中,会使用一些开源框架.第三方的工具等等,这些都是以jar包的方式被项目所引用,并且有些jar包还会依赖其他的jar包,我们同样需要 ...