+ -
当前位置:首页 → 问答吧 → 内核程序错误,求解

内核程序错误,求解

时间:2010-09-16

来源:互联网

我想在内核中把读入内核内存的数据直接写入用户空间的文件中,r于是写了个程序,但是出现了如下错误:
我是在内核中循环得到数,然后写到用户空间,要写640*480这么多个,
错误信息如下:
Unable to handle kernel paging request at virtual address bf05f000
pgd = c0dcc000
[bf05f000] *pgd=20d9e011, *pte=00000000, *ppte=00000000
Internal error: Oops: 807 [#1]
Modules linked in: zhangjigpio3(+)
CPU: 0 Tainted: G W (2.6.27 #21)
PC is at gpio_init+0x26c/0x390 [zhangjigpio3]
LR is at v1h1_clk.20419+0x54/0x58 [zhangjigpio3]
pc : [<bf06026c>] lr : [<bf000054>] psr: 40000013
sp : c0dc3ed8 ip : fefff400 fp : c0dc3f04
r10: bf05ee84 r9 : feffffff r8 : bf027204
r7 : 00000000 r6 : 000000f6 r5 : bf027484 r4 : 00000028
r3 : 000000fe r2 : 0000017c r1 : 00000001 r0 : 00000000
Flags: nZcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 0005317f Table: 20dcc000 DAC: 00000015
Process insmod (pid: 1684, stack limit = 0xc0dc226
Stack: (0xc0dc3ed8 to 0xc0dc4000)
3ec0: c48663d8 000015ac
3ee0: bf0009c0 00012018 bf060000 c0390f84 c0dc2000 00000000 c0dc3f7c c0dc3f08
3f00: c002a2c4 bf060010 00000000 00000033 00000033 bf0004b8 c00342fc c0dc2000
3f20: 00000013 c4865de8 c4865de8 c4865dc0 00000000 00000000 00000000 00000000
3f40: 00000000 000015ac bf0009c0 00012018 00000000 c002ad88 000015ac bf0009c0
3f60: 00012018 00000000 c002ad88 00000000 c0dc3fa4 c0dc3f80 c0060778 c002a288
3f80: c0dc3fa4 c0dc3f90 00000160 00000003 00012018 00000080 00000000 c0dc3fa8
3fa0: c002abe0 c00606f0 00000160 00000003 00012018 000015ac 00012008 0000007a
3fc0: 00000160 00000003 00012018 00000080 bed19ef7 00000000 00012008 00000000
3fe0: 00004000 bed19ca4 00008e0c 400cadc4 60000010 00012018 00000000 00000000
Backtrace:
[<bf060000>] (gpio_init+0x0/0x390 [zhangjigpio3]) from [<c002a2c4>] (__exception
_text_end+0x4c/0x16
[<c002a278>] (__exception_text_end+0x0/0x16 from [<c0060778>] (sys_init_module
+0x98/0x18
[<c00606e0>] (sys_init_module+0x0/0x18 from [<c002abe0>] (ret_fast_syscall+0x0
/0x2c)
r7:00000080 r6:00012018 r5:00000003 r4:00000160
Code: 1afffffb e3a02064 e3120001 07d23008 (07c2300a)
---[ end trace 62e4e2e4471267e8 ]---
Segmentation fault

问下这是怎么引起的

作者: jizhang1976   发布时间: 2010-09-16

#define MY_FILE "/home/root/kankanfj"
   
char valk[480][640],pimage[240][320];
struct file *file = NULL;
static int __init gpio_init(void)
{
int i,j;
for(i=0;i<480 ;i++)
{
if(i%2 ==0)
{
for(j=0 ;j<640 ;j++)
{
v1h1_clk();
k = at91_sys_read(AT91_PIOE_PDSR);
valk[i][j] = (char)k;
}
printk("OK\n");//跑了一会OK 就出错了

for(j=0 ;j<40 ;j++)
{
v1h1_clk();
}
for(j=100 ;j<320*2+100 ;j++)
{
if(j%2==0)
{
pimage[i][j] = valk[i][j];
}
}
}
}
else
{
for(j=0 ;j<90 ;j++)
v1h0_clk();
for(j=0 ;j<710 ;j++)
v1h1_clk();
}
}
}
for(i=0 ;i<385 ;i++)
hsyn_clk();
}
printk("the end\n");//没跑到这里
old_fs = get_fs();
set_fs(KERNEL_DS);
file->f_op->write(file,(char *)valk,sizeof(valk),&file->f_pos);
set_fs(old_fs);
  return 0;
}

作者: jizhang1976   发布时间: 2010-09-16

for(i=0 ;i<480 ;i++)
{
  for(j=0 ;j<640;j++)
{
}
printf("ok");
}
要是把把i,j定义在初始化函数static int __init gpio_init(void)
中的时候,就出现段错误
要是把定义放在外面就不会出现,但会出现死循环,一直也停不下来
这个循环应该是出现在i<480这里

作者: jizhang1976   发布时间: 2010-09-16