【Atheros】內核調試及網卡加載等問題小結


我做的其他很多工作就比較有針對性了,不是什么大眾性的問題,比如加統計代碼、實現自己的速率調整算法或者加一些自己的控制什么的,就不再單獨介紹了,最后呢再羅列一些小問題,供參考。

1. 加載模塊(執行wifi命令)失敗

2. 系統崩潰的幾個常見原因

3. 用十六進制輸出字符前面出現一串ffff

4. printk調試是網絡發包速度變慢

5. 驅動代碼在打開文件指定0600這樣的模式

6. 加載模塊時can't insert 'xxx.ko'

1. 加載模塊(執行wifi命令)失敗

執行wifi命令時報下面的錯誤:

root@OpenWrt:~# wifi
PHY for wifi device radio0 not found
PHY for wifi device radio0 not found

這是更換網卡后,需要重新檢測生成/etc/config/wireless文件,可以先把這個文件拷出去(加載好模塊),然后刪掉,執行

wifi detect > /etc/config/wireless

指令,然后在編輯這個文件(參考之前的文件)改到需要的配置。下面給出一個參考用的配置:

config wifi-device  radio0
        option type     mac80211
        option channel  36
        option macaddr  00:15:6d:89:ef:9a
        option hwmode   11na
        option htmode   HT40+
        list ht_capab   SHORT-GI-40
        list ht_capab   TX-STBC    
        list ht_capab   RX-STBC1          
        list ht_capab   DSSS_CCK-40       
        # REMOVE THIS LINE TO ENABLE WIFI:
        #option disabled 1
                              
config wifi-iface             
        option device   radio0
        option network  eth1   
        option mode     adhoc  
        option ssid     testna   
        option bssid    00:00:00:00:00:01
        option encryption none

2. 系統崩潰的幾個常見原因

1) Kmalloc的參數為0,在內核開發中,指定分配長度為0的空間會導致系統崩潰;

2) 使用sprintf可能會超出已分配的內存塊而進入其它內存區域,會引起系統崩潰;

3) 指針指向不可訪問的區域時報錯:比如下面的語句:

char *a = "abcd";

這個語句可以正常執行,因為這個語句首先是在聲明變量a,並分配空間,進而存放值“abcd”。但是下面的語句:

char *a;
a = "abcd";

這個語句就有可能引發系統崩潰了,因為首先聲明變量a,卻未申請空間(既沒有像第一種情況那樣指明要存什么值,也沒有用kmalloc申請空間),這時候指針指向什么位置是不可控的,然后第二條語句進行賦值,此時,要賦的值“abcd”是不在內存里的,所以a此時指向的不可控位置如果正好是合法位置,那么平安無事,如果是內存中不可訪問的空間,就會導致崩潰。

3. 用十六進制輸出字符前面出現一串ffff

以十六進制逐個輸出單字符,怎么會出現很長的序列如:ffffff88 0 0 0 0 15 6d ffffff84 ffffffb7 ffffff80 0 15 6d ffffff84 ffffffee ffffff9f 0 0 0 0 0 1 50 39 20 0 50 ffffffaa ffffffaa ffffffaa?

因為如果字符定義為有符號的char,那么對於88這樣的十六進制數,會被認為是負值,對於32位編譯器,前面就會補上6個f。

4. printk調試是網絡發包速度變慢

printk非常影響效率,少用printk就好了~

5. 驅動代碼在打開文件指定0600這樣的模式

0600是用的八進制表示,換算成二進制是0001 1000 0000,而查閱資料,得到文件讀寫的權限位如下:

S_IRWXU

00700

mask for file owner permissions

S_IRUSR

00400

owner has read permission

S_IWUSR

00200

owner has write permission

S_IXUSR

00100

owner has execute permission

S_IRWXG

00070

mask for group permissions

S_IRGRP

00040

group has read permission

S_IWGRP

00020

group has write permission

S_IXGRP

00010

group has execute permission

S_IRWXO

00007

mask for permissions for others (not in group)

S_IROTH

00004

others have read permission

S_IWOTH

00002

others have write permission

S_IXOTH

00001

others have execute permission

所以0600就相當於S_IRUSR | S_IWUSR,真是好奇怪,驅動為啥不用宏要直接用十六進制數字呢。

6. 加載模塊時can't insert 'xxx.ko'

編譯沒有報錯,但是傳到板子上加載模塊卻報:

insmod: can't insert 'ath9k.ko': unknown symbol in module, or unknown parameter

仔細看編譯時的輸出,有這么幾個警告:

WARNING: "__truncdfsf2" [/home/x/openwrt/backfire/build_dir/linux-ar71xx/compat-wireless-2011-12-01/drivers/net/wireless/ath/ath9k/ath9k.ko] undefined!
WARNING: "__muldf3" [/home/x/openwrt/backfire/build_dir/linux-ar71xx/compat-wireless-2011-12-01/drivers/net/wireless/ath/ath9k/ath9k.ko] undefined!
WARNING: "__divdf3" [/home/x/openwrt/backfire/build_dir/linux-ar71xx/compat-wireless-2011-12-01/drivers/net/wireless/ath/ath9k/ath9k.ko] undefined!
WARNING: "__extendsfdf2" [/home/x/openwrt/backfire/build_dir/linux-ar71xx/compat-wireless-2011-12-01/drivers/net/wireless/ath/ath9k/ath9k.ko] undefined!
WARNING: "__floatsidf" [/home/x/openwrt/backfire/build_dir/linux-ar71xx/compat-wireless-2011-12-01/drivers/net/wireless/ath/ath9k/ath9k.ko] undefined!

經查閱資料,是因為內核不能很好的支持float,內核里盡量不要使用浮點數,可以的時候放大為整數進行操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM