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

posted @ 2010-06-29 12:16  Biiigfish  阅读(942)  评论(0编辑  收藏  举报