驱动学学之驱动学习的准备工作

author author     2022-08-13     729

关键词:

1:驱动开发的准备工作

(1)正常运行linux系统的开发板。要求开发板中的linux的zImage必须是自己编译的,不能是别人编译的。

(2)内核源码树,其实就是一个经过了配置编译之后的内核源码。这里使用的是九鼎官方提供的kener,因为这个内核已经是移植好的,所以只需要直接编译即可。首先make distclean进行清理,然后make x210ii_qt_defconfig进行配置,最后make 编译得到Zimage(在/arch/arm/boot)目录下。

(3)nfs挂载的rootfs,主机ubuntu中必须搭建一个nfs服务器。

2:常用的模块操作命令

(1)lsmod(list module 将模块列表显示):功能是打印出当前内核中已经安装的模块列表

(2)insmod(install module 安装模块):功能是向当前内核中去安装一个模块,用法是insmod xxx.ko

(3)modinfo(module information 模块信息):功能是打印出一个内核模块的自带信息。用法是modinfo xxx.ko

(4)rmmod(remove module 删除模块):功能是从当前内核中卸载一个已经安装了的模块,用法是rmmod xxx(注意卸载模块时只需要输入模块名即可,有些低版本的内核中如果加了后缀.ko会报错)

3:模块的安装(模块的卸载类似 module _exit与rmmod对应)

(1)先lsmod再insmod看安装前后系统内模块记录。实践测试标明内核会将最新安装的模块放在lsmod显示的最前面。

(2)insmod与module_init宏。模块源代码中用module_init宏声明了一个函数(在我们这个例子里是chrdev_init函数),作用就是指定chrdev_init这个函数和insmod命令绑定起来,也就是说当我们insmod module_test.ko时,insmod命令内部实际执行的操作就是帮我们调用执行chrdev_init函数。因为我们当前的驱动是安装在ubuntu中的,由于ubuntu拦截了我们安装时的打印信息,所以我们不能直接看到chrdev_init函数中的printk打印的信息,需要使用dmesg命令来查看。

(3)模块安装时insmod内部除了帮我们调用module_init宏所声明的函数外,实际还做了一些别的事

4:模块的版本信息

(1)使用modinfo查看模块的版本信息

(2)内核zImage中也有一个确定的版本信息

(3)insmod时模块的vermagic必须和内核的相同,否则不能安装,报错信息为:insmod: ERROR: could not insert module module_test.ko: Invalid module format

(4)模块的版本信息是为了保证模块和内核的兼容性,是一种安全措施

(5)如何保证模块的vermagic和内核的vermagic一致?编译模块的内核源码树就是我们编译正在运行的这个内核的那个内核源码树即可。说白了就是模块和内核要同出一门。


5:模块中常用的宏

(1)MODULE_LICENSE,模块的许可证。一般声明为GPL许可证,而且最好不要少,否则可能会出现莫名其妙的错误(譬如一些明显存在的函数提升找不到)。

(2)MODULE_AUTHOR:描述模块的作者

(3)MODULE_DESCRIPTION:描述模块的介绍信息

(4)MODULE_ALIAS:描述模块的别名

这些来自于内核驱动部分的代码,其余的也可以在内核驱动部分去寻找


6:函数修饰符

(1)__init:本质上是个宏定义,在内核源代码中就有#define __init xxxx。这个__init的作用就是将被他修饰的函数放入.init.text段中去(本来默认情况下函数是被放入.text段中)。整个内核中的所有的这类函数都会被链接器链接放入.init.text段中,所以所有的内核模块的__init修饰的函数其实是被统一放在一起的。内核启动时统一会加载.init.text段中的这些模块安装函数,加载完后就会把这个段给释放掉以节省内存。

(2)__exit:和__init类似


注:前面加一个_表示这是给内核使用的,加两个__表示是给内核内部使用的,加三个_表示很靠近内核的核心,基本不用自己去修改的



本文出自 “11664570” 博客,请务必保留此出处http://11674570.blog.51cto.com/11664570/1872404

前期的准备工作,电机驱动以及电源驱动

...板子的时候选择资料较好的,不然容易短路  电机驱动,这一套方案还是较便宜的,而且的确可以使用,老方案成本太高,怕了怕了电源管理的驱动板下午焊,也不知道可不可以,早知道应该选择以前的老方案,最起码不... 查看详情

linux——linux驱动之gpio中断的应用实战(下)(中断下文之工作队列的使用,处理非常复杂且耗时的操作)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!《QT开发实战》《嵌入式通用开发实战》《从0到1学习嵌入式Linux开发》 查看详情

linuxspi总线和设备驱动架构之三:spi控制器驱动

通过第一篇文章,我们已经知道,整个SPI驱动架构可以分为协议驱动、通用接口层和控制器驱动三大部分。其中,控制器驱动负责最底层的数据收发工作,为了完成数据的收发工作,控制器驱动需要完成以下这些功能:1. &nbs... 查看详情

usb设备驱动之设备初始化(设备枚举)

USB设备从接入HUB到正常工作之前。都属于设备枚举阶段。所谓设备枚举。就是让host控制器认识USB设备,并为其准备资源。建立好主机与设备间的数据传递机制。该阶段的工作,是USB通信协议规定的,所以属于ISO标准流程。设备... 查看详情

问题驱动学习(工作)(代码片段)

...erlang,web前端,经济学。生活。3.怎么学?不知道。问题驱动。4.每天提多少个问题?暂定1个。5.问题的难易程度有限制吗?没有。6.问题的解答有要求吗?只要能够完整解答问题就可以。7.解答不出来怎么办?拆分成几个小问题... 查看详情

如何开始学习linux设备驱动开发?(仅在windows上工作)

】如何开始学习linux设备驱动开发?(仅在windows上工作)【英文标题】:Howtostartlearnlinuxdevicedriverdevelopment?(workedonwindowsonly)【发布时间】:2012-01-0917:35:05【问题描述】:我想学习Linux设备驱动开发。正面:我在WinCE上开发了小型驱... 查看详情

linux学习资料整理

...阱Linux文件传输之ftp服务器linux系统信号(Linux系统上驱动移植)(Linux字符设备驱动框架)Linux(驱动)Linux设备驱动模型-KobjectLinux驱动之input输入子系统linux设备驱动之I2C驱动框架linux内核之leds子系统linux... 查看详情

bsp开发学习2平台设备驱动(代码片段)

文章目录Linux设备驱动模型Linux中的设备驱动模型组成为什么要使用设备驱动模型设备驱动模型的底层架构sysfs目录kobjectkobj_typekset设备驱动模型三大组件总线设备驱动平台设备驱动概述平台设备驱动工作原理核心变量与函数工作... 查看详情

linux内核工作队列之work_struct学习总结(代码片段)

前言编写Linux驱动的时候对于work_struct的使用还是很普遍的,很早之前就在阅读驱动源码的时候就看到了它的踪影,根据其命名大概知道了它的具体作用,但是仍然不知所以,同时,伴随出现的还有delayed_work以... 查看详情

linux——linux驱动之玩转spi(上)linux下spi驱动框架简析及spi设备驱动代码框架实现步骤

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》《嵌入式通用开发实战》《从0到1学习嵌入式Linux开发》 查看详情

linux——linux驱动之玩转spi(上)linux下spi驱动框架简析及spi设备驱动代码框架实现步骤

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》《嵌入式通用开发实战》《从0到1学习嵌入式Linux开发》 查看详情

今天在群里面讨论了驱动机制的学习

今天在群里面讨论了驱动机制的学习,收获挺大的,在此总结一下与大家分享。错误之处请批评指正。在驱动接触过程中,是以内存字符设备驱动作为敲门砖的,学习了驱动程序的基本框架,各种设备方法,可是内存设备毕竟只... 查看详情

学习linux底层驱动开发有啥经典的参考书?

...解计算机系统》比较好内核开发阅读内核源码阶段,从写驱动入手逐渐深入linux内核开发参考书如下《linuxdevicedrivers》,黑话叫ldd《linuxkerneldevelopment》,黑话叫lkd《understadingthelinuxkernel》,黑话叫utlk《linux源码情景分析》这四本... 查看详情

linux——linux驱动之imx6ull平台下多点触摸屏驱动开发实战(mt协议多点触摸api基于框架的触摸驱动编写触摸芯片驱动)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》《嵌入式通用开发实战》《从0到1学习嵌入式Linux开发》 查看详情

linux——linux驱动之imx6ull平台下多点触摸屏驱动开发实战(mt协议多点触摸api基于框架的触摸驱动编写触摸芯片驱动)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》《嵌入式通用开发实战》《从0到1学习嵌入式Linux开发》 查看详情

驱动开发感悟

设备(device),驱动(device_driver)以及总线(bus_type)是Linux设备驱动模型的三要素。总线将设备和驱动进行绑定。在系统注册一个设备的时候,会寻找与之匹配的驱动,同样,在系统注册一个驱动的时候,会寻找与之匹配的设备,而匹... 查看详情

linux——linux驱动之杂项设备(基本概念注册流程杂项设备的驱动编写)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!《QT开发实战》《嵌入式通用开发实战》《嵌入式Linux开发实战 查看详情

linux——linux驱动之杂项设备(基本概念注册流程杂项设备的驱动编写)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!《QT开发实战》《嵌入式通用开发实战》《嵌入式Linux开发实战 查看详情