• 【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,内核里尽量不要使用浮点数,可以的时候放大为整数进行操作。

  • 相关阅读:
    Andio Studio
    Git常用操作汇总(转)
    1.主动学习很重要,主动学习很重要,主动学习很重要 2.官方文档 3.实践(转)
    Android应用程序的组成部分和Manifest文件(转)
    BackTrack5 (BT5)无线password破解教程之WPA/WPA2-PSK型无线password破解
    JS window.open()属性
    js产生随机数
    Node.js新手教程——怎样实现文件上传功能
    EJB究竟是什么,真的那么神奇吗??
    排序(4)---------希尔(shell)排序(C语言实现)
  • 原文地址:https://www.cnblogs.com/smarterplanet/p/4083384.html
Copyright © 2020-2023  润新知