Linux kernel 2.6.32下编译LLD3源码错误解决(config.h,INIT_WORK参数和system_ustname变化等)

时间:2022-07-03 23:28:46

由于《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为例,修改代码如下。

新加数据结构:

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);
}
System_ustname undeclared

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

#define system_utsname init_uts_ns.name