【Atheros】内核调试及网卡加载等问题小结
2014-11-12 21:07
190 查看
我做的其他很多工作就比较有针对性了,不是什么大众性的问题,比如加统计代码、实现自己的速率调整算法或者加一些自己的控制什么的,就不再单独介绍了,最后呢再罗列一些小问题,供参考。
1. 加载模块(执行wifi命令)失败
2. 系统崩溃的几个常见原因
3. 用十六进制输出字符前面出现一串ffff
4. printk调试是网络发包速度变慢
5. 驱动代码在打开文件指定0600这样的模式
6. 加载模块时can't insert 'xxx.ko'
1. 加载模块(执行wifi命令)失败
执行wifi命令时报下面的错误:
这是更换网卡后,需要重新检测生成/etc/config/wireless文件,可以先把这个文件拷出去(加载好模块),然后删掉,执行
指令,然后在编辑这个文件(参考之前的文件)改到需要的配置。下面给出一个参考用的配置:
2. 系统崩溃的几个常见原因
1) Kmalloc的参数为0,在内核开发中,指定分配长度为0的空间会导致系统崩溃;
2) 使用sprintf可能会超出已分配的内存块而进入其它内存区域,会引起系统崩溃;
3) 指针指向不可访问的区域时报错:比如下面的语句:
这个语句可以正常执行,因为这个语句首先是在声明变量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,而查阅资料,得到文件读写的权限位如下:
所以0600就相当于S_IRUSR | S_IWUSR,真是好奇怪,驱动为啥不用宏要直接用十六进制数字呢。
6. 加载模块时can't insert 'xxx.ko'
编译没有报错,但是传到板子上加载模块却报:
仔细看编译时的输出,有这么几个警告:
经查阅资料,是因为内核不能很好的支持float,内核里尽量不要使用浮点数,可以的时候放大为整数进行操作。
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 |
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,内核里尽量不要使用浮点数,可以的时候放大为整数进行操作。
相关文章推荐
- arm linux 内核移植及驱动调试-网卡(1)
- 小结解决双网卡网关问题(route add -p) ---关于静态路由
- 交叉编译内核问题小结
- linux 内核加载问题
- 如何解决VS2003调试时,出现的未加载符号问题
- Asp.net 调试问题小结(不断补充)
- 《Linux0.11内核完全注释》读后小结 --- 调试环境的搭建
- 解决ubuntu 11.04下,Atheros无线网卡不能上网的问题
- QSC6010调试flash遇到问题的小结
- [转]iPhone 真机调试应用程序(具体步骤与问题小结)
- 内核级Rootkit的加载和调试(1)
- [转]龙芯上内核开发、调试和优化小结
- 最近遇到VS.Net的两个问题--无法调试,未加载符号和后台代码无法调用控件
- Hyper-V下Linux鼠标驱动调试和网卡跃点数问题
- IIS问题调试小结
- 内核驱动加载调试(1)
- 内核调试的问题
- Anthem.NET 的 "BAD RESPONSE" 问题的脚本调试技巧小结
- 如何使用MDB调试分析Solaris内核死锁的问题
- 《Linux0.11内核完全注释》读后小结 --- 调试环境的搭建