项目场景:
开发板:Tiny4412
Linux内核版本:linux-3.0
工具链版本:arm-linux-gcc 4.5.1
问题描述:
在编写驱动程序,加载到模块(insmod key.ko后出现oops错误和段错误)。
错误现象为:其实驱动设备已经加载了并且能用,但是rmmod之后出现卡死现象。
以下为错误的界面截图
原因分析:
查阅资料分析Opps错误一般有以下几种可能
1:空指针的使用
2:内存的越界访问
3:系统版本不一致(我理解为PC版本与板子上Linux的版本不一致)
贴上大神的原因分析:
https://www.jarvisw.com/?p=1316
解决方案:
看到大神的解决办法是反汇编之后查看汇编代码,找到错误的代码行,进行改正,如下:
https://blog.youkuaiyun.com/yuyin86/article/details/8249057
我的解决办法是:考虑到有可能是板子上的linux的zImage和PC的linux版本不一致,所以在PC上重新编译了内核,生成zImage,然后将zImage拷贝到了SD卡,板子通过SD卡启动,然后成功。
编译内核的具体步骤
cp tiny4412_deconfig .config
make menuconfig
make
然后在arch/arm下即可看到zImage,将其从虚拟机拷贝出来放在SD卡中。
重新开机插入模块后correct!