![](https://img-blog.csdnimg.cn/direct/a8b846129cb24dc4a7f4c72b86e9260f.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
驱动基础 | 进阶篇
文章平均质量分 87
驱动基础进阶篇
北京迅为
让学习更简单,让开发更容易
展开
-
RK3568驱动指南|驱动基础进阶篇-进阶1 编译进内核的驱动系统是如何运行的?
所以,当使用module_init(helloworld)宏定义模块的入口函数后,会创建一个 __initcall_hello_world6函数指针变量,并将其初始化为hello_world函数,这个__initcall_hello_world6函数指针变量的目的是将模块的入口函数放置在内核的初始化调用链中,以便在系统引导期间自动执行。至此,关于编译进内核的驱动系统是如何运行的这一问题就讲解完成了,最后布置一个课程作业,利用本章节学习到的知识来让驱动可以更快的被加载,会在下一章中对该作业进行讲解。原创 2024-01-15 10:39:58 · 1138 阅读 · 0 评论 -
RK3568驱动指南|驱动基础进阶篇-进阶2 让驱动快一点被加载实验
arch_initcall的优先级为3,device_initcall的优先级为6,所以helloworld_a.c驱动会比helloworld_b.c驱动先加载,然后将两个驱动编译进内核,得到boot.img镜像之后,重新烧写到开发板即可(可以看到驱动A的加载时间为内核启动后的0.52秒左右,驱动B的加载时间为内核启动后的1.78秒左右,与我们预想的实验现象相同,至此让驱动快一点被加载实验就完成了。编译进内核的驱动才可以比较加载的速度,所以本章节不会将驱动编译成ko的形式,而是编译进内核中。原创 2024-01-15 10:56:44 · 706 阅读 · 0 评论 -
RK3568驱动指南|驱动基础进阶篇-进阶3 驱动代码使用Makefile的宏
通常,通过在makefile中使用KBUILD_CFLAGS_MODULE变量,可以将特定于模块的编译选项添加到模块的编译命令中。在Makefile中KBUILD_CFLAGS_MODULE和EXTRA_CFLAGS都是用于指定编译内核模块时的编译选项的变量,下面是两个变量的详细介绍。例如,KBUILD_CFLAGS_MODULE += -DDEBUG表示将-DDEBUG编译选项添加到模块的编译命令中,定义了一个名为DEBUG的宏。至此,驱动代码使用Makefile的宏实验就完成了。原创 2024-01-15 13:10:09 · 1153 阅读 · 0 评论 -
RK3568驱动指南|驱动基础进阶篇-进阶4 内核是如何运行ko文件的_insmod
在该函数中有着两种模块加载方式,19-31行为第一种使用finit_module系统调用的加载方式,33-57行为第二种使用init_module系统调用的加载方式,默认情况会先使用第一种方式进行模块的加载,如果加载失败了才会使用第二种方式进行加载。其中最重要的是第18行的bb_init_module函数,正是通过该函数加载的内核模块。在开发板的各种系统中,insmod命令都默认存在了,而命令在本质上也是一个可执行程序,也有着对应的源码,不管是何种系统,insmod命令的源码是相同的(原创 2024-01-15 13:45:00 · 1233 阅读 · 0 评论 -
RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验
该驱动程序就是最简单的helloworld驱动程序,只是在第6行添加了dump_stack()函数,用来在内核中输出当前调用堆栈信息,在这里使用该函数的目的是验证在app中的init_module系统调用是否生效。dump_stack函数会打印调用的一系列函数,这些函数的具体调用已经在进阶第一章讲解过了,这里的重点为红色框中的倒数第二行,调用了init_module函数加载了helloworld驱动。该应用程序的重点在30行,使用init_module系统调用加载模块到内核。原创 2024-01-15 14:07:16 · 996 阅读 · 0 评论 -
RK3568驱动指南|驱动基础进阶篇-进阶6 内核运行ko文件实验——系统调用
它是应用程序与操作系统之间的桥梁,允许应用程序请求操作系统执行特定的操作,例如文件操作,进程管理,网络通信等。在load_module函数中,完成模块的加载过程,返回do_init_module函数进行模块的初始化。在do_init_module函数中,如果模块的init函数不为空,调用do_one_initcall函数执行模块的初始化函数。在do_one_initcall函数中,执行一个初始化调用函数,这个函数通常在内核初始化过程中使用,用于执行各个模块的初始化函数。那么,什么是系统调用呢?原创 2024-01-15 14:19:18 · 1514 阅读 · 0 评论 -
RK3568驱动指南|驱动基础进阶篇-进阶7 向系统中添加一个系统调用
如上图所示,在运行应用程序之后,打印“This is helloworld syscall” 成功调用自定义的系统调用,至此,向系统中添加一个系统调用实验结束。iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\。iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程\。最后,重新编译内核源码,烧写内核镜像。原创 2024-01-15 14:25:04 · 452 阅读 · 0 评论 -
RK3568驱动指南|驱动基础进阶篇-进阶8 内核运行ko文件总结
_copy(initfn)表示复制用户定义的初始化函数,__attribute__((alias(#initfn)))表示将init_module函数与用户定义的初始化函数initfn关联起来。这些函数最终都会调用load_module函数,而在load_module函数中,会通过do_one_initcall(mod->init)来执行驱动程序的入口函数。这些宏定义了一些内联函数和与之关联的特殊命名的函数,以及一些属性和别名,用于在编译时进行检查并将用户定义的函数与特定的模块函数关联起来。原创 2024-01-15 14:40:16 · 1179 阅读 · 0 评论