我做的其他很多工作就比較有針對性了,不是什么大眾性的問題,比如加統計代碼、實現自己的速率調整算法或者加一些自己的控制什么的,就不再單獨介紹了,最后呢再羅列一些小問題,供參考。
執行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
1) Kmalloc的參數為0,在內核開發中,指定分配長度為0的空間會導致系統崩潰;
2) 使用sprintf可能會超出已分配的內存塊而進入其它內存區域,會引起系統崩潰;
3) 指針指向不可訪問的區域時報錯:比如下面的語句:
char *a = "abcd";
這個語句可以正常執行,因為這個語句首先是在聲明變量a,並分配空間,進而存放值“abcd”。但是下面的語句:
char *a; a = "abcd";
這個語句就有可能引發系統崩潰了,因為首先聲明變量a,卻未申請空間(既沒有像第一種情況那樣指明要存什么值,也沒有用kmalloc申請空間),這時候指針指向什么位置是不可控的,然后第二條語句進行賦值,此時,要賦的值“abcd”是不在內存里的,所以a此時指向的不可控位置如果正好是合法位置,那么平安無事,如果是內存中不可訪問的空間,就會導致崩潰。
以十六進制逐個輸出單字符,怎么會出現很長的序列如: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。
printk非常影響效率,少用printk就好了~
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,真是好奇怪,驅動為啥不用宏要直接用十六進制數字呢。
編譯沒有報錯,但是傳到板子上加載模塊卻報:
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,內核里盡量不要使用浮點數,可以的時候放大為整數進行操作。