天天看點

LDD3示例代碼Scull編譯問題

在運作《Linux裝置驅動程式》第三版書中的示例代碼時出現了很多編譯錯誤 ,主要原因是我的系統核心版本為 2.6.39,而示例代碼運作的核心版本為 2.6.10。以下是我遇到的問題以及解決方案:

  • make時出現錯誤:

    CFLAGS was changed ....Fix it to use EXTRA_FLAGS

    LDD3示例代碼Scull編譯問題
    解決方法:将Makefile中的
    CFLAGS += $(DEBFLAGS) 
    CFLAGS += -I$(LDDINC)
               
    改為
    EXTRA_CFLAGS += $(DEBFLAGS) 
    EXTRA_CFLAGS += -I$(LDDINC)
               
  • error: linux/config.h: No such file or directory

    原因:config.h這個頭檔案在2.6.19的核心版本以後就沒有了

    解決方法:将該行代碼注釋掉

  • 如圖錯誤:
    LDD3示例代碼Scull編譯問題
    解決方法:引用頭檔案

    #include<linux/sched.h>

  • error: 'struct task_struct' has no member named 'uid'

    原因:task_struct結構體定義有所改動,将

    uid

    euid

    等挪到了

    cred

    中,參見

    include/linux/sched.h

    include/linux/cred.h

    兩個頭檔案

    解決方案 :将報錯的代碼做如下修改(參考網址):

    current->uid

    修改為

    current->cred->uid

    current->euid

    修改為

    current->cred->euid

  • SPIN_LOCK_UNLOCKED’未聲明(不在函數内)

    原因:

    SPIN_LOCK_UNLOCKED

    自2.6.19被棄用,将在2.6.39中删除。

    解決方法:将

    static spinlock_t scull_u_lock = SPIN_LOCK_UNLOCKED;

    改為

    static DEFINE_SPINLOCK(scull_u_lock);

    。别的用到

    SPIN_LOCK_UNLOCKED

    的地方也作相應修改。參考網址
  • unknown field 'ioctl' specified in initializer

    原因:2.6.36核心之後,

    file_operations

    結構體去掉了原來的

    ioctl

    ,添加了兩個新的成員:
    long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);           
    long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
               
    解決方法: 将代碼中

    file_operations

    結構體中的

    .ioctl

    改為

    .compat_ioctl

    即可。參考網址
  • error: implicit declaration of function ‘init_MUTEX’)

    原因:

    init_MUTEX

    在 Linux2.6.37 之後的核心中已經被廢除了, 新版本使用

    sema_init

    函數:

    static inline void sema_init(struct semaphore *sem, int val);

    init_MUTEX(&sem)

    等同于

    sema_init(&sem, 1)

    解決方法:将代碼中用到

    init_MUTEX

    的地方都替換為

    sema_init

    。也可使用參考網址的另一種方法。
  • error: macro "INIT_WORK" passed 3 arguments, but takes just 2

    原因:從2.6.20的核心開始,

    INIT_WORK

    宏做了改變,原來是三個參數,後來改成了兩個參數。

    解決方法:将代碼按如下方式改變(參考網址):

    static void ppsc_tq_int (void *data)   
    --> 
    static void ppsc_tq_int (struct work_struct *data)
    
    INIT_WORK (&pha->wq, ppsc_tq_int, pha); 
    --> 
    INIT_WORK (&pha->wq, ppsc_tq_int);
               
  • error: ‘SA_INTERRUPT’ undeclared (first use in this function)

    原因:2.6.24以後删除了

    SA_INTERRUPT

    ,使用

    IRQF_DISABLED

    代替。

    SA_SHIRQ

    IRQF_SHARED

    代替(參考網址)

    解決方法:将

    SA_INTERRUPT

    修改為

    IRQF_DISABLED

    即可 。參考網址
  • error: ‘struct device’ has no member named ‘driver_data’

    原因:

    driver_data

    已經被移入

    struct device_private

    中,該結構在

    /drivers/base/base.h

    中定義。
  • error: ‘NOPAGE_SIGBUS’ undeclared (first use in this function)

    error: unknown field ‘nopage’ specified in initializer

    原因:新版本

    vm_operations_struct

    去掉了

    nopage

    成員,參見

    /include/linux/mm.h

    解決方法:注釋掉相關内容參考網址

  • error: ‘struct device’ has no member named ‘bus_id’

    原因:新版本的核心中

    struct device

    已經沒有

    bus_id

    成員,而是通過

    static inline const char *dev_name(const struct device *dev)

    extern int dev_set_name(struct device *dev, const char *name, ...)

    對裝置的名字進行操作。參考網址

    解決方法:針對我的代碼:将

    strncpy(ldddev->dev.bus_id, ldddev->name, BUS_ID_SIZE);

    改為

    dev_set_name(&ldddev->dev, ldddev->name);

  • ‘struct attribute’ has no member named ‘owner’

    原因:新版本核心

    struct attribute

    結構中已經沒有

    owner

    成員

    解決方法:我的解決方法是先注釋掉相關語句。

  • error: unknown field ‘hotplug’ specified in initializer

    原因:新版本核心

    struct bus_type

    結構中已經沒有

    hotplug

    成員

    解決方法:我的解決方法是先注釋掉相關語句。

  • no symbol version for ...

    原因:這是linux kernel 2.6.26 之後版本的bug。參考網址

    解決方法:隻要将子產品中的Makefile中加上

    KBUILD_EXTRA_SYMBOLS

    ,重新編譯子產品即可。
    LDD3示例代碼Scull編譯問題

繼續閱讀