linux驱动开发详解 linux驱动开发入门与实战

今天给各位分享关于linux驱动开发详解(linux驱动开发入门与实战)的知识,希望对你有帮助,现在开始把!

linux驱动开发详解 linux驱动开发入门与实战


1、最近在搞一个linux项目,主要写一些应用模块,内核及其驱动模块涉及很少 。在遇到一些驱动模块的问题时,临时查了一些资料,大致了解了开发驱动模块的基本步骤和常规步骤,又从网上搜集了一些相关资料,所以做了一个简单的总结,记录在这里,以备日后参考,与同事们分享 。什么是linux内核驱动模块?Linux内核的整体结构已经非常庞大,包含了很多组件 。
2、我们如何在内核中包含所有需要的部分?一种 *** 是将所有需要的函数编译到Linux内核中 。这将导致两个问题 。首先,生成的内核会非常大 。
3、其次,如果我们想在现有内核中添加或删除函数,我们必须重新编译内核 。有没有什么机制使得编译后的内核本身不需要包含所有的函数,而是在需要使用这些函数的时候,将相应的代码动态加载到内核中?答案是肯定的,Linux提供了这样一种机制,叫做模块 。该模块具有以下特点:模块本身没有编译到内核映像中,内核映像控制着内核的大小 。
4、一旦模块被加载,它就和内核的其余部分完全一样了 。所以,问题来了 。内核驱动模块怎么写?别急,一步步介绍吧 。
5、[文章福利]边肖整理了一些我个人认为比较好的linux内核学习书籍和视频资料,分享在群文件里 。如有需要,可以私信[内核],免费添加!!!(包括视频教程、电子书、实践项目和代码)
6、首先,从最简单的例子开始 。我们先来看最简单的内核模块HelloWorld 。
7、#include#includeMODULE_LICENSE("DualBSD/GPL");staticinthello_init(void){printk(KERN_INFO"HelloWorldentern");return0;}staticvoidhello_exit(void){printk(KERN_INFO"HelloWorldexitn");}module_init(hello_init);module_exit(hello_exit);MODULE_AUTHOR("SongBaohua");MODULE_DESCRIPTION("AsimpleHelloWorldModule");MODULE_ALIAS("asimplestmodule");这个最简单的内核模块只包含内核模块加载函数、卸载函数、双BSD/GPL权限的声明和一些描述信息 。编译将产生hello.ko目标文件,该文件可以通过命令in *** od加载 。/hello.ko并通过命令rmmodhello卸载 。8、加载时会输出HelloWorldenter,卸载时会输出HelloWorldexit 。内核中的输出函数是kernel空之间的printk(),而不是users空之间的printf() 。作为最基本的内核调试 *** ,printk()类似于printf(),但是可以定义输出级别 。
9、检查系统中已加载的模块列表在Linux中,可以使用l *** od命令获取系统中加载的所有模块及其依赖关系,例如:root@imx6:~$l *** odModuleSizeUsedbyhello15680ohci1394327160ide_scsi167080ide_cd393920cdrom369601ide_cdl *** od命令实际读取并分析/proc/modules文件,上述l *** od命令结果对应的/proc/modules文件如下:root@imx6:~$cat/proc/moduleshello15680-Live0xc8859000ohci1394327160-Live0xc88c8000ieee1394944201ohci1394,Live0xc8840000ide_scsi167080-Live0xc883a000ide_cd393920-Live0xc882f000cdrom369601ide_cd,Live0xc8876000内核中已加载模块的信息也存在于/sys/module目录中 。加载hello.ko后,内核将包含/sys/module/hello目录,该目录又包含一个refcnt文件和一个sections目录 。运行/sys/module/hello目录中的Tree–A以获得以下目录树:root@imx6:~$tree-a.|--refcnt`--sections|--.bss|--.data|--.gnu.linkonce.this_module|--.rodata|--.rodata.str1|--.strtab|--.symtab|--.text`--__versions查看特定模块的详细信息使用modinfo命令可以获取模块的信息,包括模块作者、模块描述、模块支持的参数等 。
10、root@imx6:~$modinfohello.kofilename:hello.kolicense:DualBSD/GPLauthor:SongBaohuadescription:AsimpleHelloWorldModulealias:asimplestmodulevermagic:5686gcc-2depends:模块程序的基本结构Linux内核模块主要由以下部分组成:模块加载函数(一般需要)当通过in *** od或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作 。模块卸载函数(一般需要)当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块卸载函数相反的功能 。模块许可证声明(必须)许可证(LICENSE)声明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时,将收到内核被污染(kerneltainted)的警告 。

推荐阅读