scull字符设备驱动编译在新内核编译问题解决措施
发布时间:2021-11-24 21:29:30 所属栏目:教程 来源:互联网
导读:最近在看《LINUX设备驱动程序》,给出的字符设备驱动程序scull,在linux 2.6.32-22内核上make编译时出现了下面的问题: make -C /lib/modules/2.6.32-22-generic/build M=/home/elite/Desktop/linux设备驱动开发/examples/scull LDDINC=/home/elite/Desktop/l
最近在看《LINUX设备驱动程序》,给出的字符设备驱动程序scull,在linux 2.6.32-22内核上make编译时出现了下面的问题: make -C /lib/modules/2.6.32-22-generic/build M=/home/elite/Desktop/linux设备驱动开发/examples/scull LDDINC=/home/elite/Desktop/linux设备驱动开发/examples/scull/../include modules make[1]: Entering directory `/usr/src/linux-headers-2.6.32-22-generic' scripts/Makefile.build:49: *** CFLAGS was changed in "/home/elite/Desktop/linux设备驱动开发/examples/scull/Makefile". Fix itto use EXTRA_CFLAGS. Stop. make[1]: *** [_module_/home/elite/Desktop/linux设备驱动开发/examples/scull] Error 2 make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-22-generic' make: *** [modules] Error 2 打开Makefile,将CFLAGS屏蔽掉: # CFLAGS += $(DEBFLAGS) # CFLAGS += -I$(LDDINC) 继续make,又出现了下面的问题: make -C /lib/modules/2.6.32-22-generic/build M=/home/elite/Desktop/linux设备驱动开发/examples/scull LDDINC=/home/elite/Desktop/linux设备驱动开发/examples/scull/../include modules make[1]: Entering directory `/usr/src/linux-headers-2.6.32-22-generic' CC [M] /home/elite/Desktop/linux设备驱动开发/examples/scull/main.o /home/elite/Desktop/linux设备驱动开发/examples/scull/main.c:17:26: error:linux/config.h: No such file or directory make[2]: *** [/home/elite/Desktop/linux设备驱动开发/examples/scull/main.o] Error 1 make[1]: *** [_module_/home/elite/Desktop/linux设备驱动开发/examples/scull] Error 2 make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-22-generic' make: *** [modules] Error 2 linux/config.h文件找不到,可能时新版内核结构改变了,这个文件被删除了吧。 打开main.c,把#include <linux/config.h>删除掉。 继续make,还有问题: make -C /lib/modules/2.6.32-22-generic/build M=/home/elite/Desktop/linux设备驱动开发/examples/scull LDDINC=/home/elite/Desktop/linux设备驱动开发/examples/scull/../include modules make[1]: Entering directory `/usr/src/linux-headers-2.6.32-22-generic' CC [M] /home/elite/Desktop/linux设备驱动开发/examples/scull/main.o CC [M] /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.o /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c: In function‘scull_p_read’: /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:131: error:‘TASK_INTERRUPTIBLE’ undeclared (first use in this function) /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:131: error: (Eachundeclared identifier is reported only once /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:131: error: foreach function it appears in.) /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:131: error:implicit declaration of function ‘signal_pending’ /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:131: error:implicit declaration of function ‘schedule’ /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c: In function‘scull_getwritespace’: /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:168: error:‘TASK_INTERRUPTIBLE’ undeclared (first use in this function) /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c: In function‘scull_p_write’: /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:219: error:‘TASK_INTERRUPTIBLE’ undeclared (first use in this function) /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:223: error:‘SIGIO’ undeclared (first use in this function) /home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.c:223: error:‘POLL_IN’ undeclared (first use in this function) make[2]: *** [/home/elite/Desktop/linux设备驱动开发/examples/scull/pipe.o] Error 1 make[1]: *** [_module_/home/elite/Desktop/linux设备驱动开发/examples/scull] Error 2 make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-22-generic' make: *** [modules] Error 2 TASK_INTERRUPTIBLE找不到,既然前面删除掉了了一个头文件,必然有很多变量找不到, 那就到/usr/src/linux-headers-2.6.32-22-generic下grep一下呗: 最终找到头文件,添加上: #include <linux/sched.h> access.c也需要添加上面的头文件。 然后,还得make,痛苦阿。。。。 make -C /lib/modules/2.6.32-22-generic/build M=/home/elite/Desktop/linux设备驱动开发/examples/scull LDDINC=/home/elite/Desktop/linux设备驱动开发/examples/scull/../include modules make[1]: Entering directory `/usr/src/linux-headers-2.6.32-22-generic' CC [M] /home/elite/Desktop/linux设备驱动开发/examples/scull/access.o /home/elite/Desktop/linux设备驱动开发/examples/scull/access.c: In function‘scull_u_open’: /home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:107: error:‘struct task_struct’ has no member named ‘uid’ /home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:108: error:‘struct task_struct’ has no member named ‘euid’ /home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:115: error:‘struct task_struct’ has no member named ‘uid’ /home/elite/Desktop/linux设备驱动开发/examples/scull/access.c: In function‘scull_w_available’: /home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:166: error:‘struct task_struct’ has no member named ‘uid’ /home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:167: error:‘struct task_struct’ has no member named ‘euid’ /home/elite/Desktop/linux设备驱动开发/examples/scull/access.c: In function‘scull_w_open’: /home/elite/Desktop/linux设备驱动开发/examples/scull/access.c:185: error:‘struct task_struct’ has no member named ‘uid’ make[2]: *** [/home/elite/Desktop/linux设备驱动开发/examples/scull/access.o] Error 1 make[1]: *** [_module_/home/elite/Desktop/linux设备驱动开发/examples/scull] Error 2 make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-22-generic' make: *** [modules] Error 2 说task_struct结构体没有uid,euid成员变量,struct task_struct定义在include/linux/sched.h中,这主要是由于原来task_struct结构体定义有所改动,将uid和euid等挪到 cred中,见include/linux/sched.h和include/linux/cred.h。 因此只需要将报error的代码做如下修改 current->uid 修改为 current->cred->uid current->euid 修改为 current->cred->euid (编辑:宁德站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |