歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 解決Ubuntu安裝無線網卡驅動因”init_mutex”被廢除編譯不過的問題

解決Ubuntu安裝無線網卡驅動因”init_mutex”被廢除編譯不過的問題

日期:2017/2/28 16:09:16   编辑:Linux教程

解決Ubuntu安裝無線網卡驅動因”init_mutex”被廢除編譯不過的問題。

買無線網卡的時候我特意找了一個同時具備win,linux和mac三個平台的驅動的的網卡。但是Ubuntu11.04中安裝無線網卡的時候,發現驅動模塊的代碼編譯不過。原因定位到了init_mutex的地方。

error: implicit declaration of function ‘init_MUTEX’

後來一查,在新版本的linux內核中,init_mutex已經被廢除了。

查了一下早期版本的定義。

平台:X86 32位
內核:2.6.24
定義

static inline void init_MUTEX (struct semaphore *sem)
{
sema_init(sem, 1);
}

說明:Init_MUTEX()函數初始化信號量為互斥量。 互斥量為信號量的特例,它可以防止數據被兩個不同系統調用讀寫。

static inline void sema_init (struct semaphore *sem, int val)
{
/*
* *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val);
*
* i'd rather use the more flexible initialization above, but sadly
* GCC 2.7.2.3 emits a bogus warning. EGCS doesn't. Oh well.
*/

atomic_set(&sem->count, val);
sem->sleepers = 0;
init_waitqueue_head(&sem->wait);
}

sleepers : 指定了允許進入等待進入臨界區的進程數,這裡初始化為 0 。
init_waitqueue_head() : 初始化一個等待隊列頭。

根據代碼判斷,只要在init_mutex的地方直接使用sema_init來替換,試了一些,果然可以成功make。驅動成功安裝也可以正常使用。

代碼大概是這樣的init_MUTEX(&wl->sem); 手動修改為 sema_init(&wl->sem,1); 然後再進行編譯就可以。

Copyright © Linux教程網 All Rights Reserved