驱动模块 .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的模块编译.当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者能够看懂.之所以要写这篇文章,主要是因为从书本上学的话,可能要花更 ...
随机推荐
- npm warn weex @1.0.0 no repository field
玩weex出现nmp安装问题总是包这个错,但是其实是安装成功的 npm warn weex@1.0.0 no repository field. 看字面意思大概是package.json里缺少repo ...
- vue列表到详情页的实现
路由里边的 router/index.js path:'/detail/:id' 动态id 列表页渲染时: :to="'/detail/'+item.id" ===>id是指 ...
- Piwik-2.16.1 (OpenLogic CentOS7.2)
平台: CentOS 类型: 虚拟机镜像 软件包: centos7.2 piwik devops log analysis monitoring open-source 服务优惠价: 按服务商许可协议 ...
- HDU 4745 Two Rabbits (区间DP)
题意: 两只兔子,在一个由n块石头围成的环上跳跃,每块石头有一个权值ai.开始时两兔站在同一石头上(也算跳1次),一只从左往右跳,一只从右往左跳,两只同时跳,而每跳一次,两只兔子所站的石头的权值都要相 ...
- 转 zigbee学习笔记---Channel、PANID、发射功率及其它参数
现对z-stack里几个网络参数的设置以及如何获取总结一下.信道配置:Zigbee在3个频段定义了27个物理信道:868MHz频段中定义了1个20Kb/s信道,915MHz频段中定义了10个40Kb/ ...
- js中arr.sort的用法
sort(sortfunction)为JS的数组对象(Array)的一个方法,提供排序功能 参数 sortFunction 为可选项,是用来确定排序原则的js函数, 这个函数有两个参数,分别代表每次排 ...
- 【洛谷2522】[HAOI2011] Problem b(莫比乌斯反演)
点此看题面 大致题意: 求\(\sum_{x=a}^b\sum_{y=c}^d[gcd(x,y)==k]\). 关于另一道题目 在看这篇博客之前,如果你做过一道叫做[BZOJ1101][POI2007 ...
- empty、isset、is
直接上代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php $a=0; $b='0'; $c=0.0; ...
- 3218: 字符串字符统计—C语言
3218: 字符串字符统计—C语言 时间限制: 1 Sec 内存限制: 128 MB提交: 270 解决: 129[提交][状态][讨论版][命题人:smallgyy] 题目描述 编写一函数,由实 ...
- 2017.12.1 如何用java写出一个菱形图案
上机课自己写的代码 两个图形原理都是一样的 1.一共有仨个循环 注意搞清楚每一层循环需要做的事情 2.第一层循环:是用来控制行数 3.第二层循环控制打印空格数 4.第三层循环是用来循环输出星星 imp ...