今天尝试编译一下ldd3的第二个例子SCULL(Ubuntu 10.04),结果遇到了一堆的问题:
1. LDD3书上的ftp位置没有LDD3的例子,只有LDD1和LDD2的例子,但是在examples目录下有个linuxdriver3目录,里面放了LDD3的例子...汗
2. 编译一上来就报错,说linux/config.h没有了,一查google,发现这个头文件在新的内核中已经删除不用了,分别在access.c和pipe.c中加入了linux/sched.h,然后把linux/config给删除了,ok,头文件问题解决,再继续编译.
3. 在access.c中,发现uid和euid这两个变量不属于current结构了,需要从current->uid改成current-cred->uid了。改完再编,终于过了...
Linux还真是与时俱进阿,这内核结构改的真快阿...
SCULL简单运行测试
把SCULL编译和链接都完成了,后来一直没有时间仔细看代码和使用一下,今天抽出时间来用了一把,有些小心得,自己记录一下:
1. 安装scull可以通过insmod或者自带的那个scull_load脚本,脚本默认没有执行权限,所以需要chmod +x一把
2. 安装完之后,在系统中可以用ls -l /dev/scull看到多了很多个scull设备,还可以用cat /proc/devices看到scull设备,用lsmod命令也一样
3. 我在使用ls -l > /dev/scull0的时候总是遇到 Permission denied的情况,加SUDO都没有用,scull0的属性应该也没有问题
网上有兄弟和我一样的情况,不过也没有解决,绕过去的办法是使用cp命令...汗
好,回头再来看看代码把,kscope比起source insight来说,还是差的很远的....
两种函数的区别:register_chrdev_region(alloc_chrdev_region)只是向系统注册一个设备号,接着还是需要使用cdev_add把这个设备号对应的内核结构向操作系统注册。
struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops; // 向系统注册时,给系统能够调用的操作指针
struct list_head list;
dev_t dev; // 设备号,通过这个值,操作系统就可以把某个特定的设备号和内核的某个数据结构联系在一起
unsigned int count;
};