热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BUG:schedulingwhileatomic:events/0/4/总结

对于Linux内核来说,Oops就意外着内核出了异常,此时会将产生异常时CPU的状态,出错的指令地址、数据地址及其他寄存器,

对于Linux内核来说,Oops就意外着内核出了异常,此时会将产生异常时CPU的状态,出错的指令地址、数据地址及其他寄存器,函数调用的顺序甚至是栈里面的内容都打印出来,然后根据异常的严重程度来决定下一步的操作:杀死导致异常的进程或者挂起系统。

最典型的异常是在内核态引用了一个非法地址,通常是未初始化的野指针Null,这将导致页表异常,最终引发Oops。

Linux系统足够健壮,能够正常的反应各种异常。异常通常导致当前进程的死亡,而系统依然能够继续运转,但是这种运转都处在一种不稳定的状态,随时可能出问题。对于中断上下文的异常及系统关键资源的破坏,通常会导致内核挂起,不再响应任何事件。

2 内核的异常级别
2.1 Bug
Bug是指那些不符合内核的正常设计,但内核能够检测出来并且对系统运行不会产生影响的问题,比如在原子上下文中休眠。如:
BUG: scheduling while atomic: insmod/826/0x00000002
Call Trace:
[ef12f700] [c00081e0] show_stack+0x3c/0x194 (unreliable)
[ef12f730] [c0019b2c] __schedule_bug+0x64/0x78
[ef12f750] [c0350f50] schedule+0x324/0x34c
[ef12f7a0] [c03515c0] schedule_timeout+0x68/0xe4
[ef12f7e0] [c027938c] fsl_elbc_run_command+0x138/0x1c0
[ef12f820] [c0275820] nand_do_read_ops+0x130/0x3dc
[ef12f880] [c0275ebc] nand_read+0xac/0xe0
[ef12f8b0] [c0262d98] part_read+0x5c/0xe4
[ef12f8c0] [c017bcac] jffs2_flash_read+0x68/0x254
[ef12f8f0] [c0170550] jffs2_read_dnode+0x60/0x304
[ef12f940] [c017088c] jffs2_read_inode_range+0x98/0x180
[ef12f970] [c016e610] jffs2_do_readpage_nolock+0x94/0x1ac
[ef12f990] [c016ee04] jffs2_write_begin+0x2b0/0x330
[ef12fa10] [c005144c] generic_file_buffered_write+0x11c/0x8d0
[ef12fab0] [c0051e48] __generic_file_aio_write_nolock+0x248/0x500
[ef12fb20] [c0052168] generic_file_aio_write+0x68/0x10c
[ef12fb50] [c007ca80] do_sync_write+0xc4/0x138
[ef12fc10] [f107c0dc] oops_log+0xdc/0x1e8 [oopslog]
[ef12fe70] [f3087058] oops_log_init+0x58/0xa0 [oopslog]
[ef12fe80] [c00477bc] sys_init_module+0x130/0x17dc
[ef12ff40] [c00104b0] ret_from_syscall+0x0/0x38
--- Exception: c01 at 0xff29658
    LR = 0x10031300

2.2 Oops
程序在内核态时,进入一种异常情况,比如引用非法指针导致的数据异常,数组越界导致的取指异常,此时异常处理机制能够捕获此异常,并将系统关键信息打印到串口上,正常情况下Oops消息会被记录到系统日志中去。

Oops发生时,进程处在内核态,很可能正在访问系统关键资源,并且获取了一些锁,当进程由于Oops异常退出时,无法释放已经获取的资源,导致其他需要获取此资源的进程挂起,对系统的正常运行造成影响。通常这种情况,系统处在不稳定的状态,很可能崩溃。

2.3 Panic
当Oops发生在中断上下文中或者在进程0和1中,系统将彻底挂起,因为中断服务程序异常后,将无法恢复,这种情况即称为内核panic。另外当系统设置了panic标志时,无论Oops发生在中断上下文还是进程上下文,都将导致内核Panic。由于在中断复位程序中panic后,系统将不再进行调度,Syslogd将不会再运行,因此这种情况下,Oops的消息仅仅打印到串口上,不会被记录在系统日志中。

 

 

在调试IC卡驱动过程中频繁拔插卡则出现BUG: scheduling while atomic: events/0/4/0x00010004异常导致系统崩溃,具体信息如下:

[ 1947.900000] BUG: scheduling while atomic: events/0/4/0x00010004
<4>[ 1947.900000] &#64;&#64;&#64;&#64;cardslot_iso7816_uart_interrupt,line:1384
<3>[ 1947.900000] BUG: scheduling while atomic: events/0/4/0x00010004
<4>[ 1947.900000] Modules linked in: iccard iso7816_uart bcm589x_pm(P) bar_scanner bcm589x_ped idtechencmag magstripe

cx930xx modem slnsp ftp101 printer bcm589x_spi touch_screen bcm5892_adc_driver matrix_keys beeper leds fusion

bcm589x_otg bcm589x_dwccom [last unloaded: iso7816_uart]
<4>[ 1947.900000]
<4>[ 1947.900000] Pid: 4, comm:             events/0
<4>[ 1947.900000] CPU: 0    Tainted: P            (2.6.32.9-bcm5892 #8)
<4>[ 1947.900000] PC is at memcpy&#43;0x16c/0x330
<4>[ 1947.900000] LR is at 0xffffff
<4>[ 1947.900000] pc : []    lr : [<00ffffff>]    psr: 20000013
<4>[ 1947.900000] sp : c3823ecc  ip : 00ffffff  fp : c3823f60
<4>[ 1947.900000] r10: 00000000  r9 : 00ffffff  r8 : 00ffffff
<4>[ 1947.900000] r7 : 00ffffff  r6 : 00ffffff  r5 : ff000000  r4 : 0000ffff
<4>[ 1947.900000] r3 : ff00ffff  r2 : 0000003f  r1 : c483ad44  r0 : c4854d40
<4>[ 1947.900000] Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
<4>[ 1947.900000] Control: 00c5387d  Table: 43b14008  DAC: 00000017
<4>[ 1947.900000] [] (show_regs&#43;0x0/0x4c) from [] (__schedule_bug&#43;0x48/0x5c)
<4>[ 1947.900000]  r4:c3823e84
<4>[ 1947.900000] [] (__schedule_bug&#43;0x0/0x5c) from [] (schedule&#43;0x78/0x45c)
<4>[ 1947.900000]  r4:c3823ce8
<4>[ 1947.900000] [] (schedule&#43;0x0/0x45c) from [] (schedule_timeout&#43;0x20/0x1dc)
<4>[ 1947.900000] [] (schedule_timeout&#43;0x0/0x1dc) from [] (wait_for_common&#43;0xf8/0x1b4)
<4>[ 1947.900000]  r6:c3822000 r5:c3815340 r4:c3823ce8
<4>[ 1947.900000] [] (wait_for_common&#43;0x0/0x1b4) from [] (wait_for_completion&#43;0x18/0x1c)
<4>[ 1947.900000] [] (wait_for_completion&#43;0x0/0x1c) from [] (__cancel_work_timer&#43;0x140/0x194)
<4>[ 1947.900000] [] (__cancel_work_timer&#43;0x0/0x194) from [] (cancel_delayed_work_sync&#43;0x14/0x18)
<4>[ 1947.900000] [] (cancel_delayed_work_sync&#43;0x0/0x18) from []

(fb_deferred_io_fsync_delay&#43;0x1c/0x2c)
<4>[ 1947.900000] [] (fb_deferred_io_fsync_delay&#43;0x0/0x2c) from []

(new8110_lcd_icon_control&#43;0xb0/0xbc)
<4>[ 1947.900000]  r5:c38daa80 r4:00008040
<4>[ 1947.900000] [] (new8110_lcd_icon_control&#43;0x0/0xbc) from [] (lcd_icon_set&#43;0x20/0x28)
<4>[ 1947.900000]  r7:bf08e6b0 r6:000000ff r5:c3bee70c r4:c3b0aa1c
<4>[ 1947.900000] [] (lcd_icon_set&#43;0x0/0x28) from [] (led_trigger_event&#43;0x64/0xa0)
<4>[ 1947.900000] [] (led_trigger_event&#43;0x0/0xa0) from [] (card_insert_interrupt&#43;0x70/0x98

[iccard])
<4>[ 1947.900000]  r6:bf08cacc r5:c041cf4c r4:00000040
<4>[ 1947.900000] [] (card_insert_interrupt&#43;0x0/0x98 [iccard]) from []

(cardslot_iso7816_uart_interrupt&#43;0xd4/0xb68 [iccard])
<4>[ 1947.900000]  r7:0000002e r6:c041cf4c r5:0000002e r4:bf08cacc
<4>[ 1947.900000] [] (cardslot_iso7816_uart_interrupt&#43;0x0/0xb68 [iccard]) from []

(handle_IRQ_event&#43;0x3c/0xfc)
<4>[ 1947.900000]  r6:00000000 r5:00000000 r4:c3932da0
<4>[ 1947.900000] [] (handle_IRQ_event&#43;0x0/0xfc) from [] (handle_level_irq&#43;0xcc/0x168)
<4>[ 1947.900000]  r7:00000002 r6:0000002e r5:c3932da0 r4:c0420810
<4>[ 1947.900000] [] (handle_level_irq&#43;0x0/0x168) from [] (asm_do_IRQ&#43;0x70/0x8c)
<4>[ 1947.900000]  r6:00004000 r5:00000000 r4:0000002e
<4>[ 1947.900000] [] (asm_do_IRQ&#43;0x0/0x8c) from [] (__irq_svc&#43;0x38/0xd4)
<4>[ 1947.900000] Exception stack(0xc3823e84 to 0xc3823ecc)
<4>[ 1947.900000] 3e80:          c4854d40 c483ad44 0000003f ff00ffff 0000ffff ff000000 00ffffff
<4>[ 1947.900000] 3ea0: 00ffffff 00ffffff 00ffffff 00000000 c3823f60 00ffffff c3823ecc 00ffffff
<4>[ 1947.900000] 3ec0: c017c5cc 20000013 ffffffff
<4>[ 1947.900000]  r5:d102a000 r4:ffffffff
<4>[ 1947.900000] [] (new8110fb_deferred_io&#43;0x0/0x5ac) from [] (fb_deferred_io_work&#43;0x90/0xe0)
<4>[ 1947.900000] [] (fb_deferred_io_work&#43;0x0/0xe0) from [] (worker_thread&#43;0x178/0x22c)
<4>[ 1947.900000]  r8:c0197eb0 r7:c3801900 r6:c38daa1c r5:c3822000 r4:c38daa20
<4>[ 1947.900000] [] (worker_thread&#43;0x0/0x22c) from [] (kthread&#43;0x84/0x8c)
<4>[ 1947.900000] [] (kthread&#43;0x0/0x8c) from [] (do_exit&#43;0x0/0x62c)
<4>[ 1947.900000]  r7:00000000 r6:00000000 r5:00000000 r4:00000000

 

经过反复调试确定问题出在拔插卡中断里面,在拔插卡中断中调用了led_trigger_event(card_insert_led_trigger, LED_OFF)函数,此函数将会加锁而概率性引起死锁或者阻塞,而在中断上下文中绝对不允许调用阻塞函数,故系统将会报bug.

去掉后问题解决.

转:https://www.cnblogs.com/dyllove98/p/3194225.html



推荐阅读
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • macOS命令行创建Android模拟器
    macOS下不安装AndroidStudio使用VSCode来开发Flutter应用使用命令行创建和管理Android模拟器设备avdmanageravdmanager 是一种命令 ... [详细]
  • Linux学习笔记:psef、ps aux、kill9
    一、查看进程命令1.ps命令Linux中的ps命令是ProcessStatus的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 原因是客户端和服务器端的kryo必须register同样的class类,某一端多register一个class类导致的转载于:https:www.cnblogs.co ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
  • AstridDAO 专访:波卡稳定币黑马 BAI
    加入Pol ... [详细]
  • Ihavebeenworkingwithbufferingafileonmylocaldrivetoparseandobtaincertaindata.Forte ... [详细]
  • 动手动脑,无法自拔(3)课时作业6
    1.动手动脑(五子棋棋盘排布)(1)源程序(2)实验截图2.动手动脑(数字转换成汉字)(1)源程序(2)实验截图3.动手动脑(大数计算)(1)源程序 ... [详细]
  • C#设计模式之八装饰模式(Decorator Pattern)【结构型】
    一、引言今天我们要讲【结构型】设计模式的第三个模式,该模式是【装饰模式】,英文名称:DecoratorPattern。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理 ... [详细]
author-avatar
mobiledu2502857923
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有