linux驱动之:驱动开发常见错误汇总

博客主要讲述两个Linux开发问题。一是insmod xxx.ko时提示版本符号不匹配,原因是板卡与开发环境内核版本不一致,解决办法是找匹配内核镜像编译生成ko文件;二是出现函数隐式声明错误,因Linux版本更新接口名改变,解决办法是在代码前增加头文件引用。


序言:刚开始学驱动,期间会遇到大大小小的坑,这里作为典型问题记录汇总,以便后续查询。


1、insmod xxx.ko提示:first_drv: disagrees about version of symbol module_layout

1.1 错误提示:

root@am437x-evm:~/first_drv# insmod first_drv.ko
first_drv: disagrees about version of symbol module_layout
Error: could not insert module first_drv.ko: Invalid module format

1.2 错误原因:

板卡内核版本与开发环境使用的内核版本不一致,导致编译成功的insmod时加载不成功。

备注(原因定位方法):
可以使用以下方法进行验证是否确实是该原因,如果下面两条内容回显的版本号不一致,则可以断定确实是改原因。

  • 1、在板卡中执行命令:uname -r,可以查看板卡内核的版本
  • 2、再在linux开发环境中,cd到自己用的内核的根目录,vim Makefile,查看最前面三行末尾的数字就是版本号,例如下面代码,版本号就是3.12.10:
  • VERSION = 3
    PATCHLEVEL = 12
    SUBLEVEL = 10

1.3 解决办法:

找到与板卡匹配的内核版本镜像,编译成功,之后使用该内核生成ko文件即可。
但是要注意:并不是随便在官网下载一套同版本的内核就可以编译成功,貌似需要配置好多东西,这个我暂时不太明白,后续懂了再来补充把。
按照韦老师给我的思路:一般开发板配套资料中肯定有板卡内核编译方法的资料,或者有配套的内核源代码以及源代码编译方法的文档,可以找一下,我一开始拿到的资料不配套,所以导致各种报错,最后抱着尝试的心态,果然在光驱中找到了开发板配套的内核,编译成功后问题得以解决。
(PS:说实话,这个问题怪我自己比较傻逼,其实开发板自带光盘中的资料肯定是配套的,我早应该想办法找有光驱的电脑读取光盘中的资料的。)

2、error: implicit declaration of function ‘class_create’

2.1 错误原因

因为linux版本更新,接口名字变成了class_create()和device_create()。
之前的版本接口名称为:class_device_create() class_device_unregister()。

2.2 解决办法

在代码前面增加头文件引用:

#include <linux/device.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值