驱动模块 .ko
模块:
模块机制,作用搞高LINUX操作系统的扩充性.
1. 模块概念:
1.动态可加载内核模块LKM
2.内核空间运行
3.是不是一执行文件,是一个没有经过链接,不能独立运行的一个目标文件(.c->.o-->.ko)
4.通insmod命令,把内核模块载入内核空间,rmmod命令 .koc从内核空间移除
5.一个设备的驱动代码对应一个module
6.模块的驱动源代码里面,使用那些头文件是在内核源代码,是不能使用C语言的库存函数
------------------------
2、模块的编写规则:如
#include <linux/module.h>//内核头文件
#include <linux/kernel.h> static int __init test1_init(void) //入口函数 (一般放驱动初始化代码,比如申请资源,注册中断,注册字符设备。。。。)
{
printk("hello world!\n"); //相当于printf()
return ;
} static void __exit test1_exit(void) //出口函数 (释放初始化那资源)
{
printk("goodbye!\n");
} module_init(test1_init); //驱动的入口 #insmod *.ko
module_exit(test1_exit); //驱动的出口 #rmmod *.ko //#modinfo *.ko 可以查看module的信息,不是必需的,
MODULE_AUTHOR("fbx@GEC");
MODULE_DESCRIPTION("the first module of drivers");
MODULE_LICENSE("GPL");
MODULE_VERSION("V1.0");
注意:1、由module_init()指定模块入口函数test_init,像应用程序main(),入口函数返回值 int 0-->代表成功,非0-->失败.
2. 由module_exit()宏 指定出口函数test_exit , 退出函数返回值 void
3、 3.MODULE_GLICENSE等宏描述的是当前模块对应的信息
3、模块的编译makefile的编写
2.2.1Makefile文件
obj-m += module.o
KERN_DIR=/home/gec/syscro/kernel/android-kernel-samsung-dev
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERN_DIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERN_DIR) M=$(PWD) modules clean ---------------
.obj-m += module.o (module.c)
//将驱动源码编译成一个独立的module --> .ko .KERN_DIR=/home/gec/syscro/kernel/android-kernel-samsung-dev
驱动源代码在编译时候,所用使用内核源码包的目录路径(跟安装当前模块的内核应一至). .PWD := $(shell pwd)
当前目录: .$(MAKE) -C $(KERN_DIR) M=$(PWD) modules
$(MAKE) -->make
-C $(KERN_DIR) -->转到内核源码包的目录下执行 make -->调用内核源码包根目录下的Makefile --> .o
M=$(PWD) modules --> 转回到当前目录下, ---》.ko
4、模块的常用操作命令:
insmod:安装LKM
rmmod:删除LKM
modinfo:查看模块的相关信息(也就是模块中最后面的几个宏值得信息)
lsmod:显示当前已加载的模块列表
file:查看文件的属性
size:查看文件的大小
---------------------------------------------
5、__init __exit这两个宏值
1.__init所修饰代码----> .init.text段
2.如果模块直接参给编译进内核,并不是变成.ko文件再加载,那么__init修饰的函数,在完成初始化后,自动释放_init修饰的函数的资源
3.__exit所修饰代码----> .exit.text段
4.__exit用于驱动变成模块时候,在模块移除时,通知系统实现资源释放
-----------------------------------------
6、printk函数
在内核中,通知console输出的时候,使用printk()
printk和printf的区别
1.在不同空间运行的。
2.printk输出有优先级的,printf没有的
kernel:printk("hello\n");
user :printf("hello\n");
进入内核目录中,cat include/linux/kernel.h :可查看printk打印的优先级:
printk的优先级
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */ printk("hello\n")-->printk(KERN_WARNING "hello\n"); -->printk("<4>" "hello\n")
查看默认优先级:
[@GEC2103 /]# cat /proc/sys/kernel/printk
7 4 1 7
7-->控制台输出的最低优级,优先级的数字小于当前值,才可以输出.
4-->控制台输出的默认优先级
1-->控制台可能最小的优先级
echo 7 5 1 7 >/proc/sys/kernel/printk //这行命令可以修改内核printk函数的默认优先级
-----------------------------------------------------------
6、内核符号的使用:
4.内核符号
4.1.内核的每个函数与变量都有一个内核符号
add_x()
{
} -----> kstrtab_add_x
4.2内核符号表:
内核符号导出公用后,所公用的内核符号集合
add_x()
{
}
EXPORT_SYMBOL(add_x) //导出为公用,导出之后该函数可以在多个内核模块中使用。
驱动模块 .ko的更多相关文章
- 安装驱动模块ko
1. make install 2. 3.手动加载驱动程序 [root@localhost template]# modprobe usbnet [root@localhost template]# ...
- linux驱动开发第一步hello
先查看Ubuntu的版本 cat /etc/issue lin@lin-virtual-machine:~$ cat /etc/issue Ubuntu 12.04 LTS \n \l 或者使用 li ...
- Linux下编写和加载 .ko 文件(驱动模块文件)
一..ko 文件介绍 .ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载. 二.优点 (1)这样可以缩小内核体积 ...
- [ARM-Linux开发]Linux下加载.ko驱动模块的两种方法:insmod与modprobe
假设要加载的驱动程序模块名为SHT21.ko 加载驱动模块 方法一: 进入SHT21.ko驱动模块文件所在的目录,然后直接 insmod SHT21.ko 即可 方法二: 将SHT21.ko文 ...
- 加载驱动模块时Device or resource busy的解决方法
加载驱动模块时Device or resource busy的解决方法 加载驱动模块时Device or resource busy的解决方法 insmod或modprobe驱动模块时Device o ...
- insmod: error inserting 'simp-blkdev.ko': -1 Invalid module format
(一) 今天写了个块设备驱动例子,在虚拟机上加载模块insmod simp_blkdev.ko的时候,出现以下错误. insmod: error inserting 'simple-blk.ko': ...
- 【转】Linux驱动模块编译进内核中
原文网址:http://blog.chinaunix.net/uid-29287950-id-4573481.html BQ27501驱动编译进内核 一. 驱动程序编译进内核的步骤 在 l ...
- Linux下驱动模块学习
1.modutils中提供了相关的insmod,rmmod,modinfo工具2.modprobe在识别出目标模块所依赖模块后也是调用insmod.3.从外部看模块只是普通可重定位的目标文件.可重定位 ...
- linux驱动模块编译(初学者)
inux 模块编译步骤(转) 本文将直接了当的带你进入linux的模块编译.当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者能够看懂.之所以要写这篇文章,主要是因为从书本上学的话,可能要花更 ...
随机推荐
- jQuery学习笔记(三)
jQuery中的事件 页面加载 原生DOM中的事件具有页面加载的内容onload事件,在jQuery中同样提供了对应的内容ready()函数. ready与onload之间的区别: onload re ...
- js之BOM和DOM
今天我们来学习js中的一些基础的操作. 一.BOM对象 BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执行其他与页面内容不直接相 ...
- agc016C - +/- Rectangle(构造 智商题)
题意 题目链接 Sol 我的思路:直接按样例一的方法构造,若$h \times w$完全被$N \times M$包含显然无解 emm,wa了一发之后发现有反例:1 4 1 3 我的会输出[1 1 - ...
- C#执行异步操作的几种方式比较和总结(转发:https://www.cnblogs.com/durow/p/4826653.html)
0x00 引言 之前写程序的时候在遇到一些比较花时间的操作例如HTTP请求时,总是会new一个Thread处理.对XxxxxAsync()之类的方法也没去了解过,倒也没遇到什么大问题.最近因为需求要求 ...
- N 叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明: 树的深度不会超过 100 ...
- tomcat jvm参数优化
根据gc(垃圾回收器)的选择,进行参数优化 JVM给了三种选择:串行收集器.并行收集器.并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器. -XX:+Us ...
- office密匙
office 2010 VYBBJ-TRJPB-QFQRF-QFT4D-H3GVB 6QFDX-PYH2G-PPYFD-C7RJM-BBKQ8 BDD3G-XM7FB-BD2HM-YK63V-VQFD ...
- HDU 3351 Seinfeld 宋飞正传(水)
题意: 给出一个串,串内只有大括号,问经过几次改变可使全部括号合法?改变指的是可以将某一方向的括号变成另一方向. 思路: 利用栈的特点,若出现成对的合法括号,直接删掉,留下那些不合法的成为一串.既然不 ...
- Python自学之路——自定义简单装饰器
看了微信公众号推送的一道面试题,发现了闭包的问题,学习时间短,从来没有遇到过这种问题,研究一下. Python函数作用域 global:全局作用域 local:函数内部作用域 enclosing:函数 ...
- Android(java)学习笔记93:为什么局部内部类只能访问外部类中的 final型的常量
为什么匿名内部类参数必须为final类型: 1) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变 ...