免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7490 | 回复: 26
打印 上一主题 下一主题

Unable to handle kernel paging request at virtual address 565f4453(已解决) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-20 17:12 |只看该作者 |倒序浏览
问题解决了,把uch8*comresp或者uch8 comresp[20]改成  uch8*comresp=kmalloc(20,GFP_KERNEL)OOPs就没有了


把Psam_Command_Send函数里uch8 *back;back=resp;改成uch8*back=resp;




我在编写驱动的时候,在模块加载函数里测试两个函数
Psam_Reset函数正常执行,一执行到Psam_Command_Send(send1,5,comresp);函数就出现oops
static int __init Psam_init(void)
{
        int result;
        dev_t devno=MKDEV(ippsam_major,0);

        if(ippsam_major)
                result=register_chrdev_region(devno,1,"ippsam");
        else
                {
                        result=alloc_chrdev_region(&devno,0,1,"ippsam");
                        ippsam_major=MAJOR(devno);
                }
        if(result<0)
                return result;
        Psam_setup_cdev();
        Psam_Hw_init();
        printk(KERN_ALERT"hello psam\n");

       
        Psam_Reset();
        char send1[]={0x12,0x84,0x34,0x56,0x04};

        int i;
        uch8*lenr;
        uch8 comresp[20]; //此处改成uch8*comresp=kmalloc(20,GFP_KERNEL);
        memset(comresp,0xFF,20);
        Psam_Command_Send(send1,5,comresp);
       
//        CPU_Cmd(5,send1,lenr,comresp);
//        for(i=0;i<10;i++)
//                printk(KERN_ALERT"data is %x\n",comresp);
        return 0;
}

[ 本帖最后由 kyt1984 于 2009-5-22 13:17 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-05-20 17:14 |只看该作者
OOPS里面 这一段
Stack: (0xc1daff34 to 0xc1db0000)
ff20:                                              565f4453 c1da6454 c1daff48
ff40: bf002128 bf000108 0f200000 ffffffff ffffffff ffffffff ffffffff ffffffff
ff60: 56348412 c0231e04 c0231e14 bf000c60 c0231e04 00000000 c1daffa4 c1daff88
ff80: c005147c bf002010 00001665 000000c2 be811e84 00000080 00000000 c1daffa8
ffa0: c0023b60 c0051324 000000c2 be811e84 00900080 001de330 00001665 001de320
ffc0: 00001665 000000c2 be811e84 00000000 be811f49 00000061 be811e84 001b2568
ffe0: be811abc be811ab0 000191e4 00119730 a0000010 00900080 9f9fffdf fdfffb8f

“ffffffff ffffffff ffffffff ffffffff ffffffff ”这一段是我在模块加载函数里调用memset(comresp,0xFF,20)的结果
而“ff60: 56348412 c0231e04 ”正是send1()={0x12,0x84,0x34,0x56,0x04}这五个命令,其他的我就看不懂了



/tmp # insmod ippsam.ko
hello psam
data len is12
data is 3b
data is 6e
data is 0
data is 0
data is 53
data is 54
data is 4d
data is 5f
data is 53
data is 44
data is 5f
data is 56
data is 31
data is 30
data is 30
data is 5f
data is 54
data is 64
Reset OK
Unable to handle kernel paging request at virtual address 565f4453
pgd = c1ee4000
[565f4453] *pgd=00000000
Internal error: Oops: 1a000805 [#1]
Modules linked in: ippsam
CPU: 0
PC is at Psam_Command_Send+0x74/0xbc [ippsam]
LR is at 0xc1daff4c
pc : [<bf00016c>]    lr : [<c1daff4c>]    Not tainted
sp : c1daff34  ip : 00000000  fp : c1daff44
r10: be811e84  r9 : c1dae000  r8 : c0023d04
r7 : c1daff4c  r6 : c1daff60  r5 : 5f303031  r4 : 565f4453
r3 : 0000006e  r2 : 80000012  r1 : ffffffff  r0 : c1daff60
Flags: nZcv  IRQs on  FIQs on  Mode SVC_32  Segment user
Control: 217F  Table: 31EE4015  DAC: 00000015
Process insmod (pid: 26, stack limit = 0xc1dae19
Stack: (0xc1daff34 to 0xc1db0000)
ff20:                                              565f4453 c1da6454 c1daff48
ff40: bf002128 bf000108 0f200000 ffffffff ffffffff ffffffff ffffffff ffffffff
ff60: 56348412 c0231e04 c0231e14 bf000c60 c0231e04 00000000 c1daffa4 c1daff88
ff80: c005147c bf002010 00001665 000000c2 be811e84 00000080 00000000 c1daffa8
ffa0: c0023b60 c0051324 000000c2 be811e84 00900080 001de330 00001665 001de320
ffc0: 00001665 000000c2 be811e84 00000000 be811f49 00000061 be811e84 001b2568
ffe0: be811abc be811ab0 000191e4 00119730 a0000010 00900080 9f9fffdf fdfffb8f
Backtrace:
[<bf0000f8>] (Psam_Command_Send+0x0/0xbc [ippsam]) from [<bf002128>] (Psam_init+0x128/0x164 [ippsam])
r4 = 565F4453
Backtrace aborted due to bad frame pointer <c1da6454>
Code: 0a000008 e3120040 059f3044 05933000 (07c4300c)
Segmentation fault

[ 本帖最后由 kyt1984 于 2009-5-21 16:26 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-05-20 17:15 |只看该作者
声明一下,我的代码里面数组元素resp后面是有方括号和i的,back后面也有发到帖子上就不见了
int  Psam_Command_Send(char*com,int len,uch8*resp)
{
        int stat;
        int i=0;
        uch8 *back;
        uch8 lenr=0;
       

        for(i=0; i<5; i++)
                {
                        writel(com,SMC0_TX_V);
                }
        writel(5,SMC0_TX_TRIG_V);
        stat = readl(SMC0_STATUS_V);
            while ((stat & 0x40) == 0x40)                                   
            {
            for (i=0;i<10;i++) ;
                    stat = readl(SMC0_STATUS_V);
          }
        while((stat& 0x4 != 0x4                                                        
        {
                if ((stat & 0x40) != 0x40) {
                        back[lenr]= readl(SMC0_RX_V);
                        lenr++;               
                }
                stat = readl(SMC0_STATUS_V);
                       
        }
        for(i=0;i<lenr;i++)
                {
                       
                        resp=back;
                }


       
}


运行到for(i=0;i<lenr;i++)
                {
                       
                        resp =back ;
                }
开始出现oops,去掉这一部分就没有

[ 本帖最后由 kyt1984 于 2009-5-21 16:22 编辑 ]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2009-05-20 17:54 |只看该作者
Backtrace: frame pointer underflow
Backtrace aborted due to bad frame pointer <c1da6454>

  1. Psam_Command_Send(char*com,int len,uch8*resp)
复制代码

这个函数的代码中也不对指针做一下合法性检查啊?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2009-05-20 17:57 |只看该作者
,一执行到Psam_Command_Send(send1,5,comresp);函数就出现oops


在这个函数里多加一些调试信息,看看具体走到哪一行出问题了?

论坛徽章:
0
6 [报告]
发表于 2009-05-20 18:17 |只看该作者
删除

[ 本帖最后由 kyt1984 于 2009-5-21 16:14 编辑 ]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2009-05-20 18:45 |只看该作者
原帖由 kyt1984 于 2009-5-20 18:17 发表
走到这就会出现问题
for(i=0; i


这是直接往端口写数据吧

论坛徽章:
0
8 [报告]
发表于 2009-05-20 19:03 |只看该作者
这个SMC0_TX_V是我需要用到的一个寄存器的虚拟地址
用*(volatile unsigned long*)SMC0_TX_V=com赋值同样会出现oops
头疼啊

论坛徽章:
5
9 [报告]
发表于 2009-05-20 19:08 |只看该作者

回复 #8 kyt1984 的帖子

看来这个地址不正确

论坛徽章:
5
10 [报告]
发表于 2009-05-20 19:09 |只看该作者

回复 #8 kyt1984 的帖子

这个地址是怎么来的?(宏的定义)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP