Linux设备驱动01

准备: linux

一、英语-是工具 shell

二、电路原理图-补充“数电”的知识 windows

三、阅读内核代码的能力 函数

linux:vi+ctags+cscope 工具

windows:source insight 测试

驱动开发的步骤 ui

I、编辑 .net

模块的组成: 日志

一、许可证的声明,许可证一般使用GPL协议,若是不声明许可证内核会产生“抱怨”信息,同时内核中的一些遵循GPL协议的功能函数将会没法使用,形成驱动功能受限。 ip

二、加载函数,初始化模块,在使用insmod加载驱动模块时自动调用,该函数必须声明为int init_module(void),insmod调用时会自动加载这个函数。

三、卸载函数,恢复函数,在使用rmmod卸载驱动模块时会自动调用,函数必须声明为void cleanup_module(void),rmmod会自动调用这个函数。

完整示例代码:

hello.c

/**

* 驱动示例程序

* 实现驱动的加载和卸载

*/

//引入相应的头文件,内核和模块的头文件

#include <linux/kernel.h>

#include <linux/module.h>

//声明许可证信息,也能够使用这个来声明许可证

//MODULE_LICENSE("Dual BSD/GPL")

//这表示支持BSD和GPL两种协议

MOUDLE_LICENSE("GPL");

//insmod自动加载的函数,必须如此声明

int init_module(void)

{

//内核中打印信息,须要使用printk函数

printk("Hello world!!!");

return 0;

}

//rmmod自动调用的函数,必须如此声明

void cleanup_module(void)

{

printk("goodbey!!!");

}

保存

II、编译

使用内核的编译文件

一、拷贝代码到内核文件中;

二、修改对应的Kconfig/Makefile文件

三、使用make menuconfig命令选中对应的菜单项,<*>表示编译进内核,<M>表示编译成模块。

四、编译

make zImage

make modules

前者编译内核,后者编译模块,编译完成后生成相应的xxx.ko文件。

clip_image002

外部模块的编译,上面的方法必需要到内核的源文件中修改Kconfig和Makefile,实际操做中比较复杂,一般咱们会采用这种编译方法。

使用内核文档查看编译的方法,进入Linux内核目录下的Documentation

使用命令make –C <path-to-kernel> M=`pwd`命令进行编译,该命令的使用依赖于内核源码树,必须针对特定的硬件平台,而且有编译过的内核。

clip_image004

其中make -C /lib/modules/3.2.0-29-generic-pae/build M=`pwd`,使用该命令提示错误,是由于在当前目录中缺乏Makefile文件,如今创建Makefile文件输入如下代码:

obj-m += hello.o

保存再次编译

clip_image006

编译经过。

咱们还能够经过一个通用的Makefile文件来完成这个步骤

代码以下:

ifeq ($(KERNELRELEASE),)

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

modules:

$(MAKE) -C $(KERNELDIR) M=$(PWD)

clean:

rm -rvf *.o *.ko *.mod.c module* Module*

.PHONY:modules clean

else

#修改hello.o文件为本身须要的文件便可

obj-m += hello.o

endif

编译生成hello.ko模块

III、测试

一、插入模块

sudo insmod hello.ko

当前的终端并无显示输出的信息,这是由于终端默认会屏蔽掉全部的内核信息,解决方法有:

一、切入物理终端

二、使用dmesg显示当前的日志信息

三、vi /var/log/messages显示日志信息

clip_image008

二、lsmod列出当前系统动态加载的模块

三、rmmod hello 卸载模块,成功卸载的前提是存在/lib/modules/$(shell uname -r)/build目录

四、modinfo显示模块的信息

modinfo hello.ko显示以下信息:

clip_image010

五、modprobe 模块名-按依赖关系加载全部的模块,使用很少。

相关文章
相关标签/搜索