启动过程中吐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:  Oops 1  [ # 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
5e00 00000000   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,但是问题依旧。。。不知道是怎么回事。继续查找中

你可能感兴趣的:(oop)