配套代码可以在http://www.oreilly.com.cn/codeexample/ldd3sc/ 下载
我的内核版本是 4.13.0-32-generic
由于LDD3使用的版本比较老,在新版本上会有编译问题。下面对scull 的编译问题做个总结
- Makefile报错
scripts/Makefile.build:49: * CFLAGS was changed in “/linux_device/driver/scull/Makefile”. Fix it to use EXTRA_CFLAGS. Stop.
将makefile中的 CFLAGS 替换成 EXTRA_CFLAGS
- linux/config.h: No such file or directory
原因是2.6.19之后的内核没有了config.h文件,因此直接把对应的include注释掉即可。
asm/system.h 要替换成 linux/slab.h
asm/uaccess.h 要替换成 linux/uaccess.h
ioctrl 报错
取消了原先的
int (ioctl)(struct inode, struct file*, unsigned int, unsigned long);
添加来新的成员
long (unlocked_ioctl) (struct file , unsigned int, unsigned long);原来的ioctl 但是返回值变为longinit_MUTEX 没有了
改成 sema_init(&sema,1)SPIN_LOCK_UNLOCKED 找不到
//static spinlock_t scull_u_lock = SPIN_LOCK_UNLOCKED;
static DEFINE_SPINLOCK(scull_u_lock);uid 找不到
current->uid 修改为 current->cred->uid.val
current->euid 修改为 current->cred->euid.val/access.c:287:26: error: dereferencing pointer to incomplete type ‘struct signal_struct’
signal 结构定义在sched/signal.h里,在access.c中加入
#include <linux/sched/signal.h>
- 找不到 signal_pending
在pipe.c 中加入
#include <linux/sched/signal.h>