首页 > 编程知识 正文

linux网卡驱动框架,底层驱动开发

时间:2023-05-05 16:05:59 阅读:41220 作者:2535

要创建linux驱动程序,首先让我们看看驱动器框架是什么样的。

驱动程序创建和APP应用层创建有什么区别?

http://www.Sina.com/APP应用层写我们的入口是main函数,但在创建驱动程序时不是。 有两种情况

1、默认情况下

加载int__initinit_module(void )模块时的初始化函数,即用于驱动模块的条目函数

卸载void__exitcleanup_module(void )模块时执行的函数,即卸载驱动程序时执行的函数

2,

加载saticint_initxxx_init(void )模块时的初始化函数,即用于驱动模块的入口函数

卸载staticvoid__exitxxx_exit(void )模块时执行的函数,即卸载驱动程序时执行的函数

和上述两种情况相比,我们一般使用第二种。 第一个名称是固定的,不能更改。 第二,可以将xxxx改写为他们模块的名称。 可以看到文知义。

在第二种模式中,首先以固定格式声明。

module_init(xxxx_init;

模块_ exit (xxxx _ exit;

指示要加载初始化函数和卸载函数。

(一)首先 入口函数的问题。

驱动程序是内核的一部分,此时不能使用类似printf的c库,但内核提供自己的c库,内核使用printk而不是printf函数。

(三)增加许可证声明

因为linux是开源系统,所以必须遵守一定的规格。 一般使用GPL规格,请在创建驱动程序时声明

module_license(「GPL”;

基本的区别就是这些。 看看一个简单的驱动框架

# include Linux/init.h # include Linux/module.h # include Linux/kernel.hmodule _ license (GPL ); saticint_initdemo_init(void ) ) printk('%s,%dn ),__func__,__LINE__ ); printk(val:%d(n ),obj.val ); obj.func (; 返回0; }staticvoid_exitdemo_exit(void ) printk('%s,%dn ',__func__,__LINE__ ); }module_init(demo_init ); 模块_ exit (demo _ exit; 驱动程序创建完成后,如何将其加载到内核中? 必须从Makefile生成. ko文件。 简单的Makefile如下: 这是ubutnu下的Makefile,如果更改为ARM平台下的linux,则必须更换源文件目录。 具体说明可以看到内核模块的编译makefile入门。 make将生成模块. ko文件$ (warningkernelrelease=KernelRelease ) ) ifeq ) $ (kernel release,) #内核的源路径=条件赋值,uname -r是否获取内核的版本号KERNELDIR?=/lib/modules/$(shell uname -r )/build # :=立即赋值,获取当前绝对路径PWD :=$(shell pwd ) # -C并切换工作路径。 make-cmodules3360$(make(-c$ ) kerneldir ) m=$ (pwd ) modulesclean3360RM-RF*.o () core.depend.*.cmd ) . PHONY: modules cleanelse #生成模块obj-m :=used.o endif

(二)c语言的标准函数库不能使用

下面我们来看几个驱动中常用的命令

加载生成的驱动器模块. ko文件,

insmod xxx.ko

加载后,将执行xxxx_init函数

1、加载驱动模块insmod

2、卸载驱动模块rmmod对应的卸载驱动命令

rmmod xxxx注意.请不要带ko

3、查看内核中的模块信息

lsmod

4、查看模块的描述信息

可以在 modinfo xxxx.ko驱动程序中添加作者、驱动程序说明等补充信息。

5、查看模块打印信息

dmesg printk是内核打印函数,在缺省模式下不能通过中断显示。 当然,可以设定在终端上打印。 可以通过dmesg确认内核上打印的信息。

这几个比较常用,但还有其他可以以后看。

我们很清楚上述的几个

加载模块并执行初始化函数,打印函数名称和行号

卸载模块后运行卸载函数,并打印函数名称和行号

insmod /rmmod/dmesg

打印模块信息 modinfo

查看内核中模块信息lsmod

module为模块名称size创建了模块的usedby,表示正在使用其他几个文件

实际上,lsmod会读取并分析“/proc/modules”文件。 让我们看看这个文件

内核已经加载的模块的信息也存在于/sys/module目录下,加载demo.ko时内核包含/sys/moudle/demo目录,demo的目录树结构如下

除了insmod加载模块外,还可以使用modprobe命令加载模块。 此外,使用modprobe加载模块还会同时加载模块依赖的其他模块。 insmod必须按顺序逐一加载模块。 同样,卸载modprobe -r filename也会同时卸载模块所依赖的模块。

模块之间的依赖关系位于/lib/modules/kernel-version/modules.dep文件中。 实际上,在编译整个内核时由depmod工具生成,该文件的格式很简单。 依赖项直接添加在“:”之后。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。