以下内容仅以我编译驱动程序中出现的问题找到内核文件更新处
1。2.6.38内核中找不到init_MUTEX的声明(semaphore.h)
diff /usr/src/linux-source-2.6.38/linux-source-2.6.38/include/linux/semaphore.h /usr/src/linux-source-2.6.35/include/linux/semaphore.h >different
cat different
29c29
< #define DEFINE_SEMAPHORE(name) \
---
> #define DECLARE_MUTEX(name) \
37a38,40
>
> #define init_MUTEX(sem) sema_init(sem, 1)
> #define init_MUTEX_LOCKED(sem) sema_init(sem, 0)
若要继续用init_MUTEX 可把宏定义#denfine init_MUTEX(sem) sema_init(sem,1)加进semaphore.h中或者直接用底层sema_init(sem,1)。2.6.38已将MUTEX都删除了,不用这个概念了,那就直接用底层函数,这样更好
2。ioctl在2.6.36中已经从linux/fs.h中删除
可用unlocked_ioctl代替,参数也少了一个inode。
long (*unlocked_ioctl) (structfile *, unsigned int, unsigned long);//不使用BLK的文件系统,将使用此种函数指针代替ioctllong (*compat_ioctl) (structfile *, unsigned int, unsigned long);
//在64位系统上,32位的ioctl调用,将使用此函数指针代替
原因:ioctl的入口点在内核中是完全不可控制的,ioctl是BKL中的一部分,BKL(大内核锁)是一个全局自旋锁,BKL在被持有时同样会禁止内核抢占。多数情况下,BKL更像是保护代码而不是保护数据,而如今的代码是可以抢占的,删除BKL的时候也应该把ioctl删除
具体见:http://lwn.net/Articles/119652/
修改驱动程序只需修改struct file_operations fops中的ioctl改为unlocked_ioctl 相应的函数要把第一个参数inode去掉,测试程序就不要改了(上层),ioctl函数调用会自动转换为unlocked_ioctl函数去调用,自需要修改驱动测序