LDD3 /scull 驱动实例在linux3.2.0编译实现

由于LDD3的驱动实例都是在linux2.6.10中实现,在后期linux内核版本中有些改动,导致有些实例编译不通过。

环境:ubuntu12.04   内核版本:linux3.2.0  实例:LDD3中驱动实例 SCULL

排除错误

1、scripts/Makefile.build:49: *** CFLAGS was changed in "/usr/src/linux-source-3.2.0/drivers/scull/Makefile". Fix it to use ccflags-y。 停止。

这里提示我们修改Makefile中的CFLAGS,用EXTRA_CFLAGS 代替

2、/usr/src/linux-source-3.2.0/drivers/scull/main.c:17:26: 致命错误: linux/config.h:没有那个文件或目录编译中断。

在2.6.19开始的内核中删除了config.h文件,因此只要在mian.c中注释掉#include即可。

3、/usr/src/linux-source-3.2.0/drivers/scull/main.c:556:2: 错误: 初始值设定项里有未知的字段‘ioctl’

这个错误网上搜索发现2.6.38版本内核 file_operation结构体已经删除了ioctl函数,取代的是:

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

file_operation结构体在 /usr/src/linux-2.6.28.8/include/linux/fs.h定义

解决方案:

globalmem.c中将globalmem_ioctl函数定义做如下修改即可:

static long globalmem_ioctl( struct file *filp,unsigned int cmd, unsigned long arg)

在file_operation 赋值处修改:

.unlocked_ioctl = globalmem_ioctl

4、/usr/src/linux-source-3.2.0/drivers/scull/main.c:655:3: 错误: 隐式声明函数‘init_MUTEX’ [-Werror=implicit-function-declaration]
cc1: some warnings being treated as errors

2.6.25及以后的linux内核版本废除了init_MUTEX函数

新版本使用sema_init函数

平台:X86 32位

内核:2.6.24

定义

    static inline void init_MUTEX (struct semaphore *sem)
    {
            sema_init(sem, 1);
    }

说明 :Init_MUTEX()函数初始化信号量为互斥量。 互斥量为信号量的特例,它可以防止数据被两个不同系统调用读写。

sema_init (sem, 1) 定义为:

    static inline void sema_init (struct semaphore *sem, int val)
    {
    /*
    * *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val);
    *
    * i'd rather use the more flexible initialization above, but sadly
    * GCC 2.7.2.3 emits a bogus warning. EGCS doesn't. Oh well.
    */
        atomic_set(&sem->count, val);
        sem->sleepers = 0;
        init_waitqueue_head(&sem->wait);
    }

sleepers : 指定了允许进入等待进入临界区的进程数,这里初始化为 0 。
init_waitqueue_head() : 初始化一个等待队列头。

这样不难得出,废除init_MUTEX 后,将原来使用init_MUTEX(sem)的地方统统替换为sema_init(sem,1);即可

5、/usr/src/linux-source-3.2.0/drivers/scull/pipe.c:131:7: 错误: ‘TASK_INTERRUPTIBLE’未声明(在此函数内第一次使用)
出现TASK_INTERRUPTIBLE未定义,这个定义现在在linux/sched.h中,将用到该预定义的文件中加入#inlcude 文件;

6、/usr/src/linux-source-3.2.0/drivers/scull/access.c:98:34: 错误: ‘SPIN_LOCK_UNLOCKED’未声明(不在函数内)
将static spinlock_t scull_u_lock = SPIN_LOCK_UNLOCKED;

改为static DEFINE_SPINLOCK(scull_u_lock);

7、/usr/src/linux-source-3.2.0/drivers/scull/access.c:107:29: 错误: 提领指向不完全类型的指针

解决办法是在access.c中就加入两个头文件 #include

8、/usr/src/linux-source-3.2.0/drivers/scull/access.c:109:29: 错误: ‘struct task_struct’没有名为‘uid’的成员

/usr/src/linux-source-3.2.0/drivers/scull/access.c:110:29: 错误: ‘struct task_struct’没有名为‘euid’的成员

current->uid 修改为 current->cred->uid                     current->euid 修改为 current->cred->euid






你可能感兴趣的:(LINUX)