Linux kernel 2.6.32下编译LLD3源码错误解决(config.h,INIT_WORK参数和system_ustname变化等)
由于《Linux Device Driver》3rd 是针对kernel 2.6.10的,我的的平台是Debian kernel 2.6.32,导致了基本的模块(misc-modules下的那些)都编译不过。主要原因是内核升级带来的接口变化。就编译misc-modules目录而言
由于《Linux Device Driver》3rd 是针对kernel 2.6.10的,我的的平台是Debian kernel 2.6.32,导致了基本的模块(misc-modules下的那些)都编译不过。主要原因是内核升级带来的接口变化。就编译misc-modules目录而言,错误来源主要有三:
- Linux/config.h: No such file or directory
因为从kernel 2.6.19开始config.h变为autoconf.h,将出错文件中的#include <linux/config.h>改为#include <linux/autoconf.h>即可。
- 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为例,修改代码如下。
新加数据结构:
jiq_init中加:static struct my_work_struct_t { void * ptr; struct work_struct jiq_work; } my_work_struct;
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); }
- System_ustname undeclared
System_ustname的定义在较新的kernel中被删掉了(git commit id: 56b0a8c5ec7ee4f6cb48de587aa7d83d96d1f64d)。为了编译通过,我直接把这行在源文件中加回来了:
#define system_utsname init_uts_ns.name
更多推荐
所有评论(0)