linux open驱动失败,linux所遇到的问题记录
9:mini2440平台挂载NFS文件系统后,在开发板上没有权限进行创建文件等等一些事情,提示没有权限。mkdir xxxmkdir: cannot create directory `xxx: Read-only filesystem奇怪的问题,明明我查看系统上各个文件或文件夹的权限都是777,而且宿主机上的nfs服务器的说明如下【咋看是没有问题,其实是有问题的】【貌似没有问题的NFS配置说明,
9:mini2440平台挂载NFS文件系统后,在开发板上没有权限进行创建文件等等一些事情,提示没有权限。
mkdir xxx
mkdir: cannot create directory `xxx: Read-only file
system
奇怪的问题,明明我查看系统上各个文件或文件夹的权限都是777,而且宿主机上的nfs服务器的说明如下【咋看是没有问题,其实是有问题的】
【貌似没有问题的NFS配置说明,如下】
vi
/etc/exports--->/home/NfsRoot
192.168.1.*空格(rw,sync,no_root_squash)
上面的中文空格表示在该处加一个空格键
【改正】 其实就是上面的空格造成的错误:将上面的“空格”所在处的空格删除,就解决问题了。
8:mini2440平台,做GPIO触发中断,点亮相应的LED灯的实验,写成olatform平台机制
在每次下载模块时都提示中断方面的警告。后来改了地方就没有警告了,但是我自己还不清楚其中具体的原因,只是该好了而已。
过程:
【通过 cat
/proc/interrupts查看系统中的中断使用情况:中断号 等信息】
写成平台驱动:
mini2440_gpio_app
mini2440_gpio_platform_device.ko
mini2440_gpio_platform_driver.ko
1:GPIO的中断注册在
驱动的xxx_open函数中实现,中断注销在xxx_close函数中实现,每次加载模块后,必须通过系统调用open(xxx)打开设备文件来注册中断,然后后面必须调用close函数注销中断。
但是这样很容易提示警告,
WARNING: at kernel/irq/manage.c:858
__free_irq+0xa0/0x1b0() Trying to free
already-free IRQ 52
Modules linked in: mini2440_gpio_platform_device
mini2440_gpio_platform_driver(-) [last unloaded:
mini2440_gpio_platform_driver]
在这种写法下,其实cat
/proc/interrupts查看中断的使用信息,发现中断注册与注销有问题,有个别按键的中断其实都没有注册进去,后面在调用释放自然有警告;或者是有时个别中断注销不成功,这样再次注册就会有问题,这个具体的原因我不是很清楚,估计是经常打开关闭有些操作不当造成的。
2:
将中断注册放到mini2440_gpio_probe函数中,将注销函数放到mini2440_gpio_remove函数中,问题就解决了,而且查看中断的注册信息或注销后的信息都是没有异常,没有问题的。
我想以后再没有完全搞清楚其中的原因前,某个模块需要用中断时,中断的注册于注销还是放到xxx_probe与xxx_remove函数中,xxx_probe实现platform驱动机制中完成字符设备的注册等过程。而xxx_remove
实现platform驱动机制中完成字符设备的注销
7:mini2440平台,linux内核用的是友善官网下载的源代码编译的,内核启动挂载文件系统后,
板载的LED自动点亮,影响LED实验,怎么让系统启动时不自动加载LED程序??让LED不自动流水点亮?
分析:查看在串口终端上打印的启动信息,发现下面的句子:
Try to bring eth0 interface
up......NFS root
.../etc/init.d/ifconfig-eth0:
然后去文件系统的/etc/init.d/目录下发现两个文件:ifconfig-eth0
rcS
其中一个就是刚才启动的/etc/init.d/ifconfig-eth0,估计另一个rcS没有打印信息;
用vi 查看之:
里面很多的内容
syslogd
/etc/rc.d/init.d/netd start
echo " " >
/dev/tty1
echo "Starting networking..."
> /dev/tty1
sleep 1
/etc/rc.d/init.d/httpd start
echo " " > /dev/tty1
echo "Starting web server..."
> /dev/tty1
sleep 1
/etc/rc.d/init.d/leds start
echo " " > /dev/tty1
echo "Starting leds service..."
> /dev/tty1
echo "
通过网络查资料: /etc/init.d 目录包含许多系统各种服务的启动和停止脚本,比如这里的ifconfig-eth0
rcS,其中rcS里面启动/etc/rc.d/init.d/leds,去/etc/rc.d/init.d/可查看到对应文件。
etc/init.d/rcS
【系统随机启动项可在里面设置,设置好之后随系统启动,如上面vi查看到的代码所示】完成各个文件系统的
mount,再执行/usr/etc/rc.local;通过rcS 可以调用 dhcp 程序配置网络。rcS 执行完了以后,init 就会在一个 console 上,按照 inittab 的指示开一个 shell,或者是开
getty + login,这样用户就会看到提示输入用户名的提示符。
rc.local
/usr/etc/
#!/bin/sh
. /usr/etc/profile
echo "HELLO! Embest"
echo "ifconfig eth0 192.168.0.10"
ifconfig eth0 192.168.0.10 #可自行配置开发板IP
/usr/etc/rc.local 这是被init.d/rcS 文件调用执行的特殊文件,与Linux 系统硬件平台相关,如安装核心模块、进行网络配置、运行应用程序、启动图形界面等。
rcS
/mnt/etc/init.
d/
#!/bin/sh
/bin/mount -a
exec /usr/etc/rc.local
/usr/etc/profile 执行该文件配置需要的环境变量等。
Profile
/usr/etc/
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin ?? 设置命令工具所在位置
解决:将/etc/init.d/rcS中的/etc/rc.d/init.d/leds
start屏蔽即可
6:mini2440平台,在编写platform机制的led驱动时,通过模块的方式加载设备mini2440_led_platform_device.ko,但是卸载时却有问题。
错误提示:
WARNING:
at drivers/base/core.c:143 device_release+0x70/0x84()
Device 'at91_adc' does not have a release() function, it is broken
and must be fixed.
分析: 从错误提示看,应该是没实现release函数造成的,那么就去代码里面去实习之。
解决:
在设备模块中国,实现release函数。
static
void mini2440_led_platform_device_release(struct
device * dev)
{
return ;
}
static struct platform_device mini2440_platform_device_led =
{
.name =
"mini2440_led_platform_device_driver",
.id = -1,
.num_resources =
ARRAY_SIZE(mini2440_led_resource),
.resource = mini2440_led_resource,
.dev = {
.release = mini2440_led_platform_device_release,
},
};
5:mini2440平台,通过cat
/var/log/messages查看内核打印函数printk的打印记录时,发现没有记录。
原因与解决方法:要在/var/log/messages看到输出,需要klogd
和 syslogd都启动,通过ps命令查看系统的进程信息,发现只有syslogd(启动方法:/etc/rc.d/init.d/netd
start)启动了,那么接下来试着去启动klogd(启动方法:直接在命令行中敲入klogd命令来启动),再通过ps查看系统进程发现klogd启动了,再查看日志,信息出现了。
4:mini2440平台,环境变量PATH的修改
env查看所有的环境变量,修改PATH变量;
在宿主机或者平台上 vi /etc/profile
PATH=$PATH:路径1:路径2:...:路径n
平台重启后,即可看到新设的变量
3:编写mini2440需要的Makefile文件时。报错makefile:5:
*** 遗漏分隔符停止
原因是在编写makefile文件时:
3 : 3.c
gcc -o 3 3.c
gcc前的是tab分隔符,不能用空格,否则会出现“makefile:2: *** 遗漏分隔符 。
停止。”提示。。。
make中规定每一Shell命令之前的开头必须使用字符。
也就是每个 “gcc
-”前一定要加字符。
2:mini2440平台,LED驱动模块,成功加载,rmmod可以卸载,但是总是报错
rmmod: module 'mini2440 led' not
found
错误提示:
insmod mini2440_led.ko;-->加载成功
rmmod
mini2440_led;--->卸载成功,但立即会提示下面信息
rmmod: module 'mini2440 led' not found
分析:
暂可以通过下面的方法解决,可能在 busybox方面出现一些问题,具体的还不是很清楚;
解决:
(mini2440平台上用uname -r :获取运行的内核版本信息是 2.6.32.2-FriendlyARM ,
同时在lib/modules目录下同时存在名字与之对应的文件夹)
1:将 mini2440_led.ko模块放在lib/modules/2.6.32.2-FriendlyARM目录下,卸载时就不会出现问题;
放在其他的目录下,卸载时就会出现错误提示的现象
2:参考网络的一个办法(不过我没有试过),也就是通过一段代码重新生成rmmod命令;
查看 libstdc++.so.6,他是链接到 /usr/lib/libstdc++.so.6.0.8;
1:安装了mini2440网站提供的交叉工具链后,在红帽企业版5里编译内核和其他程序时,出错:
错误提示:
/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not
found(required by
/opt/FriendlyARM/toolschain/4.4.3/lib/libppl.so.7)
分析:
通过 strings /usr/lib/libstdc++.so.6 | grep GLIB
查看他内部所有的可打印的信息,发现他的版本过旧,没有 GLIBCXX_3.4.9;版本过旧造成的,需安装新版本
解决:
查看 libstdc++.so.6,他是链接到 /usr/lib/libstdc++.so.6.0.8;
我们可以下载/usr/lib/libstdc++.so.6.0.10,因为他已经包含了
GLIBCXX_3.4.9,网上下载;
步骤:
1.下载后请先验证strings /tmp/libstdc++.so.6|grep GLIBCXX是否有
GLIBCXX_3.4.9
GLIBCXX_3.4.10
如果结果不对, 请不要继续以下的步骤, 因为可能导致无法进入图形界面.
2.之后删除 符号链接:rm /usr/lib/libstdc++.so.6
3.复制文件cp /tmp/libstdc++.so.6.0.10 /usr/lib/
4.再建立符号链接ln -s /usr/lib/libstdc++.so.6.0.10
/usr/lib/libstdc++.so.6
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)