<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=ldd3%E5%AD%A6%E4%B9%A0%E9%81%87%E5%88%B0%E7%9A%84linux%E5%8D%87%E7%89%88%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB</id>
	<title>ldd3学习遇到的linux升版问题汇总 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=ldd3%E5%AD%A6%E4%B9%A0%E9%81%87%E5%88%B0%E7%9A%84linux%E5%8D%87%E7%89%88%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB"/>
	<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=ldd3%E5%AD%A6%E4%B9%A0%E9%81%87%E5%88%B0%E7%9A%84linux%E5%8D%87%E7%89%88%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB&amp;action=history"/>
	<updated>2026-09-01T05:44:36Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=ldd3%E5%AD%A6%E4%B9%A0%E9%81%87%E5%88%B0%E7%9A%84linux%E5%8D%87%E7%89%88%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB&amp;diff=781&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 08:11 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=ldd3%E5%AD%A6%E4%B9%A0%E9%81%87%E5%88%B0%E7%9A%84linux%E5%8D%87%E7%89%88%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB&amp;diff=781&amp;oldid=prev"/>
		<updated>2015-05-06T08:11:02Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;说明一下，我的环境为Ubuntu11.04 64bits.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ca6500;&amp;quot;&amp;gt;&lt;br /&gt;
1、提示scripts/Makefile.build:46:*** CFLAGS was changed in &amp;quot;/home/chenfang/scull/Makefile&amp;quot;,Fix it use EXTRA_CFLAGS.Stop.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
由于LDD3使用的是2.6.10内核，很多东西已经发生了变化，这里提示我们修改Makefile中的CFLAGS，用EXTRA_CFLAGS 代替，照它说的做就可以。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ca6500;&amp;quot;&amp;gt;&lt;br /&gt;
2、提示找不到文件linux/config.h&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在2.6.19开始的内核中删除了config.h文件，因此只要在mian.c中注释掉#include即可。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ca6500;&amp;quot;&amp;gt;&lt;br /&gt;
3、error: unknown field &amp;#039;ioctl&amp;#039; specified in initializer&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
file_operations结构发生了重大变化，取消了原有的ioctl成员，添加来新的成员：&lt;br /&gt;
&lt;br /&gt;
 long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);    原来的ioctl 但是返回值变为long&lt;br /&gt;
 long (*compat_ioctl) (struct file *, unsigned int, unsigned long); 内核空间64位，用户空间32位&lt;br /&gt;
&lt;br /&gt;
关于这一点，[http://blogt.chinaunix.net/space.php?uid=20543672&amp;amp;do=blog&amp;amp;id=3015637 这里]有一篇不错的文章.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ca6500;&amp;quot;&amp;gt;&lt;br /&gt;
4、error: implicit declaration of function ‘init_MUTEX’&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2.6.25以后找不到这个函数，但在2.6.16以前可以找到源码(http://lxr.oss.org.cn/source/include/asm-i386/semaphore.h#L89)：&lt;br /&gt;
&lt;br /&gt;
 static inline void init_MUTEX (struct semaphore *sem)&lt;br /&gt;
 {&lt;br /&gt;
     sema_init(sem, 1);&lt;br /&gt;
 }&lt;br /&gt;
 static inline void init_MUTEX_LOCKED (sturct semaphore *sem)&lt;br /&gt;
 {&lt;br /&gt;
     sema_init(sem, 0);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
故，改为用sema_init替代。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ca6500;&amp;quot;&amp;gt;&lt;br /&gt;
5、error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
到/usr/src/linux-headers-2.6.32-22-generic下grep一下,终于找到头文件：#include &amp;lt;linux/sched.h&amp;gt; ,加上&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ca6500;&amp;quot;&amp;gt;6、error: ‘struct task_struct’ has no member named ‘uid’; error: ‘struct task_struct’ has no member named ‘euid’&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
原因：&lt;br /&gt;
&lt;br /&gt;
struct task_struct定义在include/linux/sched.h中，原来task_struct结构体定义有所改动，将uid和euid等挪到 cred中，见include/linux/sched.h和include/linux/cred.h。&lt;br /&gt;
&lt;br /&gt;
解决方法：&lt;br /&gt;
&lt;br /&gt;
只需要将报error的代码做如下修改&lt;br /&gt;
&lt;br /&gt;
current-&amp;gt;uid 修改为 current-&amp;gt;cred-&amp;gt;uid&lt;br /&gt;
&lt;br /&gt;
current-&amp;gt;euid 修改为 current-&amp;gt;cred-&amp;gt;euid&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ca6500;&amp;quot;&amp;gt;&lt;br /&gt;
7、error: macro &amp;quot;INIT_WORK&amp;quot; passed 3 arguments, but takes just 2&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从kernel 2.6.20开始，workqueue中INIT_WORK的原型的参数由三个变为两个了。据说改动的原因是在64位平台上，work_queue这个常用的数据结构的占用内存过大（ http://lwn.net/Articles/211279/ ）。当然，你可以选择很生猛地将第三个参数直接删掉，据说这样也是可以编译通过的。但这样程序行为多半就会变得很诡异了。&lt;br /&gt;
&lt;br /&gt;
目前较为流行的做法，是定义一个自己的数据结构包含work_struct和参数，然后在注册函数中用container_of来得到自己的数据结构地址，从而得到参数的地址。&lt;br /&gt;
&lt;br /&gt;
以编译出错的jiq.c为例，修改代码如下。&lt;br /&gt;
&lt;br /&gt;
新加数据结构：&lt;br /&gt;
&lt;br /&gt;
    static struct my_work_struct_t {  &lt;br /&gt;
        void *              ptr;  &lt;br /&gt;
        struct work_struct  jiq_work;  &lt;br /&gt;
    } my_work_struct;  &lt;br /&gt;
&lt;br /&gt;
jiq_init中加：&lt;br /&gt;
&lt;br /&gt;
    my_work_struct.ptr = (void *)(&amp;amp;jiq_data);&lt;br /&gt;
&lt;br /&gt;
然后INIT_WORK改为：&lt;br /&gt;
&lt;br /&gt;
    INIT_WORK(&amp;amp;(my_work_struct.jiq_work), jiq_print_wq);&lt;br /&gt;
&lt;br /&gt;
Jiq_print_wq的函数体变为：&lt;br /&gt;
&lt;br /&gt;
    static void jiq_print_wq(struct work_struct *pwork)  &lt;br /&gt;
    {  &lt;br /&gt;
        struct my_work_struct_t * my_work_struct =   &lt;br /&gt;
            container_of(pwork, struct my_work_struct_t, jiq_work);  &lt;br /&gt;
        struct clientdata *pdata = (struct clientdata *)(my_work_struct-&amp;gt;ptr);   &lt;br /&gt;
          &lt;br /&gt;
        if (! jiq_print (my_work_struct-&amp;gt;ptr))  &lt;br /&gt;
            return;  &lt;br /&gt;
          &lt;br /&gt;
        if (pdata-&amp;gt;delay)  &lt;br /&gt;
            schedule_delayed_work(pwork, pdata-&amp;gt;delay);  &lt;br /&gt;
        else  &lt;br /&gt;
            schedule_work(pwork);  &lt;br /&gt;
    }  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ca6500;&amp;quot;&amp;gt;&lt;br /&gt;
8、error: ‘system_utsname’ undeclared&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
System_ustname的定义在较新的kernel中被删掉了（git commit id: 56b0a8c5ec7ee4f6cb48de587aa7d83d96d1f64d）。为了编译通过，可直接把这行在源文件中加回来了：&lt;br /&gt;
&lt;br /&gt;
 #define system_utsname init_uts_ns.name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
参考：&lt;br /&gt;
&lt;br /&gt;
http://www.cnblogs.com/fly-fish/archive/2011/08/18/2145134.html&lt;br /&gt;
&lt;br /&gt;
http://blog.csdn.net/zhou1232006/article/details/6867584&lt;br /&gt;
&lt;br /&gt;
http://archive.cnblogs.com/a/2152434/&lt;br /&gt;
&lt;br /&gt;
http://www.linuxidc.com/Linux/2011-04/33962.htm&lt;br /&gt;
&lt;br /&gt;
http://blog.csdn.net/ariesjzj/article/details/6780051&lt;/div&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
</feed>