Linux下编写和加载 .ko 文件(驱动模块文件)

1、.ko 文件介绍

.ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 须要的时候插入内核,不须要时卸载。linux

2、优势

(1)这样能够缩小内核体积;shell

(2)使用方便。bash

3、.ko文件通常的用处

(1)做为一个功能模块,须要使用时,直接插入运行就行。如在imx6上链接模拟摄像头,先运行模拟摄像头对应的驱动模块 camera.ko文件,而后对应的工程执行文件运行就行。oop

4、使用.ko 文件

一、加载驱动模块test.ko

(1)方法一 
进入test.ko驱动模块文件所在的目录,而后直接   insmod  test.ko spa

(2)方法二 
将test.ko文件拷贝到/lib/module/#uname-r#/目录下,这里,#uname -r#意思是,在终端中输入 命令行

uname -r后显示的内核版本及名称,例如mini2440中#uname-r#就是2.6.32.2-FriendlyARM。code

而后 depmod(会在/lib/modules/#uname -r#/目录下生成modules.dep和modules.dep.bb文件,代表模块的依赖关系) blog

最后 modprobe test(注意这里无需输入.ko后缀) 便可源码

注:两种方法的区别it

modprobe和insmod相似,都是用来动态加载驱动模块的,区别在于modprobe能够解决load module时的依赖关系,它是经过/lib/modules/#uname -

r/modules.dep(.bb)文件来查找依赖关系的;而insmod不能解决依赖问题。也就是说,若是你肯定你要加载的驱动模块不依赖其余驱动模块的话,既能够

insmod也能够modprobe,固然insmod能够在任何目录下执行,更方便一些。而若是你要加载的驱动模块还依赖其余ko驱动模块的话,就只能将模块拷贝到上

述的特定目录,depmod后再modprobe。

二、查看已加载的驱动模块列表

在任何目录下输入命令

 

三、卸载驱动模块

在任何目录下, 输入命令

注:“module_name”是lsmod显示的模块名称,而不是对应的ko文件名

5、编写生成.ko 文件

Linux下hello.ko内核模块制做的全过程

1. linux系统用的是Redflag 6.0 SP1 下载地址:ftp://ftp.redflag-linux.com/pub/redflag/dt6sp1/SP1/redflag-6-sp1.iso, 系统安装很容易,安提示作就好。

所用的内核源码目录树下载地址:ftp://ftp.redflag-linux.com/pub/redflag/dt6sp1/SP1/redflag-6-tool-sp1-src1.iso,将此iso文件挂载到/mnt下,安装其中的内核rpm

包。

挂载方法:mount -t iso9660 redflag-6-tool-sp1-src1.iso /mnt/ -o loop

内核目录树安装方法:cd /mnt/RedFlag/SRMPS/

 rpm -i kernel-2.6.23.1-4.src.rpm

3. 编写hello模块代码,源码以下:  

hello.c

#include <linux/init.h>  
#include <linux/module.h>  
  
MODULE_LICENSE("GPL");  
static int hello_init(void)  
{  
  printk(KERN_ALERT "Hello, world\n");  
  return 0;  
}  
static void hello_exit(void)  
{  
  printk(KERN_ALERT "Goodbye, cruel world\n");  
}  
  
module_init(hello_init);  
module_exit(hello_exit);  

4. 编写hello模块的Makefile文件,Makefile内容以下:  

obj-m :=hello.o  
KERNEL :=/usr/src/kernels/$(uname -r)/  
PWD :=$(shell pwd)  
modules :  
    $(MAKE) -C $(KERNEL) M=$(PWD) modules  
.PHONEY:clean  
clean :  
    rm -f *.o *.ko  

 

5. 编译模块
在命令行进入hello.c所在的文件夹下执行make命令便可完成hello模块的编译。用ls命令能够查看到hello.ko文件,此文件就是咱们自定义的内核模块。

 6. 安装hello模块

 命令行下执行命令

insmod hello.ko
cat /var/log/messages 

能够看到下面这样的信息:“Aug  6 13:37:59 localhost kernel: Hello, world”,说明模块加载成功了。  

相关文章
相关标签/搜索