zoukankan      html  css  js  c++  java
  • 启动过程中吐oops,问题查找过程

    完成前面一部分的大牛,在我来公司之前就已经走了。so。。。我做了一部分应用编程之后,出现大大小小的问题,都是自个琢磨怎么解决。老大还整天在那喊,下面的东西不用了解太多啊,啊,啊之类。。。还好,有兴趣往这方面发展。没人指导,没思路走得慢些而已。

    前两天终于要出样品了。。。做了两年半的产品。。。结果出货前一天的中午,发现启动过程中偶尔会吐ops。fuck,扔给我解决。老大不停在问,是不是你应用程序的问题啊,是不是你应用程序问题啊。。。我很想回答他是的。

    当然,出问题之前,不知道这个叫ops,症状如下:

    starting udev...Unable to handle kernel NULL pointer dereference at virtual addr
    ess 00000003
    pgd = c3ff4000
    [00000003] *pgd=23eff031, *pte=00000000, *ppte=00000000
    Internal error: Oops1 [#1]
    Modules linked in:
    CPU: 
    0
    PC is at find_get_page
    +0x44/0x64
    LR is at 
    0xfffffffa
    pc : [<c005ad20
    >]    lr : [<fffffffa>]    Not tainted
    sp : c3805db4  ip : c3f3fd88  fp : c3805dc0
    r10: 
    00000000  r9 : c3fe0684  r8 : 00000000
    r7 : 000098c0  r6 : 
    00000000  r5 : 00000000  r4 : 00001000
    r3 : 
    00000093  r2 : 00000093  r1 : ffffffff  r0 : c54c1027
    Flags: nzcv  IRQs off  FIQs on  Mode SVC_32  Segment user
    Control: 5317F
    Table: 23FF4000  DAC: 
    00000015
    Process udevd (pid: 272, stack limit = 0xc3804250)
    Stack: (
    0xc3805db4 to 0xc3806000)
    5da0:                                              c3805e40 c3805dc4 c005b350
    5dc0: c005acec 
    00000001 00001000 c3f4cd98 00000000 ffffffff 00000001 00000001
    5de0: 
    00000009 c3805eec c3fe0640 c3f4cdf4 00000000 00000004 00000000 00000004
    5e0000000000 00000000 00000000 00000020 00000000 00000000 00000001 00000000
    5e20: c3fe0640 c3805e9c 00000000 c3805ea4 00000200 c3805e90 c3805e44 c005d81c
    5e40: c005b1fc c3805e58 c005b6cc c3805eec 00000001 c3805e9c 00000000 00000200
    5e60: bec5cac4 00000000 c3805ea4 c3805eec c3fe0640 c3805f78 c3805e9c 00000000
    5e80: 40022fbc c3805f4c c3805e98 c007639c c005d658 00000000 00000000 bec5cac4
    5ea0: 
    00000200 c3805efc c3805eb4 00000000 00000001 ffffffff c3fe0640 00000000
    5ec0: 
    00000000 00000000 00000000 c0376d60 00000000 00000000 c3805efc c0376d60
    5ee0: c0049b00 c3805ee4 c3805ee4 
    00000000 00000000 c3805f00 c0075814 c007579c
    5f00: c3805f04 
    00000200 c02f4220 c006b29c c006a3a4 c3e6e530 00000101 00000001
    5f20: 
    00000000 c3804000 c3fe0640 bec5cac4 c3805f78 00000200 c3804000 c3804000
    5f40: c3805f74 c3805f50 c00764ac c00762ec 
    00000020 c3fe0660 c3fe0640 c3805f78
    5f60: 
    00000000 00000000 c3805fa4 c3805f78 c0076850 c00763fc 00000000 00000000
    5f80: 
    00000000 00000000 4001b03c 0000000f 00000003 c0020ee4 00000000 c3805fa8
    5fa0: c0020d40 c0076814 
    00000000 4001b03c 00000007 bec5cac4 00000200 bec5cac0
    5fc0: 
    00000000 4001b03c 0000000f bec5cac4 fffffdb4 00000007 40022fbc bec5c984
    5fe0: 40022d70 bec5c91c 400052b4 40015f94 
    00000010 00000007 2420722d 6c6c7566
    Backtrace:
    [<c005acdc
    >] (find_get_page+0x0/0x64) from [<c005b350>] (do_generic_mapping_read
    +0x164/0x4e0)
    [<c005b1ec
    >] (do_generic_mapping_read+0x0/0x4e0) from [<c005d81c>] (generic_file
    _aio_read
    +0x1d8/0x214)
    [<c005d648
    >] (generic_file_aio_read+0x4/0x214) from [<c007639c>] (do_sync_read+0
    xc0
    /0x110)
    [<c00762dc
    >] (do_sync_read+0x0/0x110) from [<c00764ac>] (vfs_read+0xc0/0x180)
     r9 
    = C3804000  r8 = C3804000  r7 = 00000200  r6 = C3805F78
     r5 
    = BEC5CAC4  r4 = C3FE0640
    [<c00763ec
    >] (vfs_read+0x0/0x180) from [<c0076850>] (sys_read+0x4c/0x74)
     r8 
    = 00000000  r7 = 00000000  r6 = C3805F78  r5 = C3FE0640
     r4 
    = C3FE0660
    [<c0076804
    >] (sys_read+0x0/0x74) from [<c0020d40>] (ret_fast_syscall+0x0/0x2c)
     r8 
    = C0020EE4  r7 = 00000003  r6 = 0000000F  r5 = 4001B03C
     r4 
    = 00000000
    Code: 1590100c e10f2000 e3823080 e121f003 (e5913004)
     Segmentation fault

    大致上,如果是软件错误,有两个可能,一个是对空指针的不规范使用,另一种就是访问了不该访问的地址;如果问题是在硬件上,可以尝试把主频降低了看看是否能解决。

    软件和硬件问题,可以通过看问题的可重复性来判别。如果是软件问题,不管你怎么烧程序,何时启动,跳出来的都是同样的错误提示。而如果是硬件问题,可能你重烧一遍程序,或者是重新启动一次跳出的错误提示就不一样,或者不是每次启动都出问题。

    搜索过程中,看到有人查找软件问题,是用printk一步步打印,来查找错误行的。看来print是万能啊~~~

    有了以上信息,可以基本判断为,问题是在硬件上。那怎样修改处理器主频呢?

    找到以下信息:

    修改at9260主频,修改PMC_PLLAR寄存器,199M是由 18.432M 进行97倍频后再9分频而来:
    18.432M *(96+1)/9 = 198656000, master的99M是将CPU主时钟2分频而来。
    所以只需要修改倍频或分频值就可以变主频了。你看PMC那一章,里面有详细说明。

    那么就是说,修改处理器主频,只是修改一些寄存器的值,具体修改哪个寄存器和怎样修改,可以看cpu的datasheet。

    然后又搜到:

    内核频率的修改应该是修改:linux-3.2/include/asm-arm/arch
    下面的这句就行了,看芯片手册改:
    #define PMCR 0X400B           //88MHZ
    SEP4020用户手册v1.8.0.pdf  176页 "7、时钟常用配置(PMCR 寄存器常用配置,外部晶振为4M Hz)"
    把上句改为:
    #define PMCR 0X4008            //64MHZ
    这样就可以了.

    那意思就是,修改的地方在,include/asm-xxx/arch/xxxx,找到你的板子,处理器所对应的头文件改动之~~~

    最后是改动了

    Q:还有哪些相似的东西可以在这里改?

    刚下了cpu的datasheet,还没找改哪里。。。改完再继续写~

     

    最后是改了arch目录下的clock.c,将频率改为100M,但是问题依旧。。。不知道是怎么回事。继续查找中

    ——————
    无论在哪里做什么,只要坚持服务、创新、创造价值,其他的东西自然都会来的。
  • 相关阅读:
    使用parted 对大容量盘进行分区
    CENTOS7 修改网卡名称为eth[012...],格式
    docker报错
    docker 存储定义成direct-lvm 模式
    Docker存储方式选型建议
    centos install docker setup centos7 安装docker
    docker centos yum 源
    zip 解压脚本
    IaaS,PaaS,Saas 云服务的介绍
    Codeforces Round #589 (Div. 2) D. Complete Tripartite(模拟)
  • 原文地址:https://www.cnblogs.com/pied/p/1767456.html
Copyright © 2011-2022 走看看