字符设备scull 问题总结
1,
linux/config.h
环境 FC6 kernel 2.6
把下面这段代码复制,保存至/usr/src/kernels/`unme -r`/include/linux下即可
#ifndef _LINUX_CONFIG_H
#define _LINUX_CONFIG_H
/* This file is no longer in use and kept only for backward compatibility.
* autoconf.h is now included via -imacros on the commandline
*/
#include
#endif
为什么在fc6下面会提示找不到这个文件呢?我们看看上面这段话:
大意是这个文件已经没有用了 只是为了保持和以前的程序兼容--现在已经用autoconf.h代替了
看来fc6默认把这个文件删除了
No problem,把这个文件拷过去,这样以前的程序就能顺利通过编译了。
在以后您自己编写的文件中不要在包含config.h即可(转而包含autoconf.h)
2,
编译例子时提示在access中找不到current等的定义,在access.c中添加
3,
scull_load 修改使用权限为777后可以装载模块,同理,scull_unload可以卸载模块。
如果不使用脚本,而手动加载的话,则先insmod,然后
在/sys/modules/scull/parameters 中找到设备的major 与 minor,然后进入路径/dev,然后
mknod scull c major minor
可以使用 ls>/dev/scull,echo 'hello my scull'>/dev/scull, cat < /dev/scull这类命令查看结果。
也可以使用.c文件进行查看。
4,
使用网上下载的一个例子scull_dev,模块安装后运行正常,但是使用rmmod时却显示segment default,且无法删除和操作。
重启后scull_dev模块自动被卸载了,重新开始。
仔细查看源代码与ldd给的代码之间的差别,发现问题出退出的在kfree()中。
ldd中在打开和退出时都将设备的长度截为0。其中用到的释放是对量子集中每个量子的释放,量子集=1000,量子=4000,释放以量子为单位进行。
for (i=0; i kfree(dptr->data[i]);
}
把量子集中所有的量子释放完后释放该节点。
而在 scull_dev中却是
for (i=0; i
阅读(1204) | 评论(0) | 转发(0) |