1. 由于《Linux Device Driver》3rd 是针对kernel 2.6.10的,我的的平台是Debian kernel 2.6.32,导致了基本的模块(misc-modules下的那些)都编译不过。主要原因是内核升级带来的接口变化。就编译misc-modules目录而言,错误来源主要有三:

     

  2. Linux/config.h: No such file or directory

    因为从kernel 2.6.19开始config.h变为autoconf.h,将出错文件中的#include <linux/config.h>改为#include <linux/autoconf.h>即可。

  3. Macro "INIT_WORK" passed 3 arguments, but takes just  2

    从kernel 2.6.20开始,workqueue中INIT_WORK的原型的参数由三个变为两个了。据说改动的原因是在64位平台上,work_queue这个常用的数据结构的占用内存过大(http://lwn.net/Articles/211279/)。当然,你可以选择很生猛地将第三个参数直接删掉,据说这样也是可以编译通过的。但这样程序行为多半就会变得很诡异了。

    目前较为流行的做法,是定义一个自己的数据结构包含work_struct和参数,然后在注册函数中用container_of来得到自己的数据结构地址,从而得到参数的地址。

    以编译出错的jiq.c为例,修改代码如下。

    新加数据结构:

    static struct my_work_struct_t {
    	void *				ptr;
    	struct work_struct 	jiq_work;
    } my_work_struct;
    jiq_init中加:

    my_work_struct.ptr = (void *)(&jiq_data);

    然后INIT_WORK改为:

    INIT_WORK(&(my_work_struct.jiq_work), jiq_print_wq);

    Jiq_print_wq的函数体变为:

    static void jiq_print_wq(struct work_struct *pwork)
    {
    	struct my_work_struct_t * my_work_struct = 
    		container_of(pwork, struct my_work_struct_t, jiq_work);
    	struct clientdata *pdata = (struct clientdata *)(my_work_struct->ptr); 
        
    	if (! jiq_print (my_work_struct->ptr))
    		return;
        
    	if (pdata->delay)
    		schedule_delayed_work(pwork, pdata->delay);
    	else
    		schedule_work(pwork);
    }
    

  4. System_ustname undeclared

    System_ustname的定义在较新的kernel中被删掉了(git commit id: 56b0a8c5ec7ee4f6cb48de587aa7d83d96d1f64d)。为了编译通过,我直接把这行在源文件中加回来了:

    #define system_utsname init_uts_ns.name

     

     

     

     

     

Logo

更多推荐