驱动调试(六)利用中断打印


title: 16-驱动调试(六)利用中断打印
date: 2019/1/15 23:35:14
toc: true
---

原理

  • 这一章节也没啥新知识,原理就是利用系统时钟的中断,去打印一些信息.

  • 在进入中断之前,会保存现场,包括LR,可以打印这个LR就能看到,定时器中断是普通中断,保存现场的时候已经将返回地址+4到LR寄存器,这个是硬件决定的,所以我们查找这个返回地址的时候减去4.

保护现场

  • 硬件自动保存
    • 保存当前的cpsr到中断下的scpsr
    • 保存返回地址到LR寄存器,(某种异常模式的LR等于被中断的下一条指令的地址)它有可能是PC + 4有可能是PC + 8,到底是那种取决于不同的情况
  • 软件需要做的stmdb sp!, {r0-r12, lr}

    • 保存R0~R12寄存器

    • 保存LR寄存器,注意这个保存之后是退出中断的返回地址,因为ARM架构的原因,不同的中断异常有不同的返回地址,所以需要对这个LR先进行一些运算再保存.偏移地址如下:举个例子比如UDEF异常,只需要直接复制,而FIQ则需要保存LR+4

      BL      MOV PC, R14
      SWI     MOVS PC, R14_svc 
      UDEF    MOVS PC, R14_und 
      FIQ     SUBS PC, R14_fiq, #4 
      IRQ     SUBS PC, R14_irq, #4 
      PABT    SUBS PC, R14_abt, #4 
      DABT    SUBS PC, R14_abt, #8 

死循环判断流程

记录pid,如果pid一直是同一个并且大于10s,打印这个pid和LR

asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
{
    struct pt_regs *old_regs = set_irq_regs(regs);
    struct irq_desc *desc = irq_desc + irq;

    /*
     * Some hardware gives randomly wrong interrupts.  Rather
     * than crashing, do something sensible.
     */
    if (irq >= NR_IRQS)
        desc = &bad_irq_desc;
    
    
#ifdef 1
    static pid_t pre_pid;                    //进程号  
    static int cnt=0;                          //计数值
    if(irq==30)          //判断irq中断号,是否等于系统时钟
    {  
        if(pre_pid==current->pid)
        {   
            cnt++;
        }
        else
        {
            cnt=0;   
            pre_pid=current->pid;
        }
        if(cnt==10*HZ)   //超时10s
        {
        cnt=0;
        printk("s3c2410_timer_interrupt : pid = %d, task_name = %s\n",current->pid,current->comm);
        printk("pc = %08x\n",regs->ARM_pc);
        }
}     
#endif
    
    
    irq_enter();

    desc_handle_irq(irq, desc);

    /* AT91 specific workaround */
    irq_finish(irq);

    irq_exit();
    set_irq_regs(old_regs);
}

代码简单解释

  • 中断号是30,在include\asm-arm\arch-s3c2410\Irqs.h,或者使用cat /proc/interrupt查看

  • current->pid:当前进程的PID号
  • current->com表示当前进程的name

  • HZ也是一个宏,代表每S的频率,比如每隔10ms加1,那么HZ就等于100

  • 参数的regs表示原有的寄存器,用他来查看进来之前普通函数的lr

参考

https://www.cnblogs.com/lifexy/p/8024415.html

转载于:https://www.cnblogs.com/zongzi10010/p/10272077.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值