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

KernelOops和Panic是一回事吗?在未开启panic_on_oops,内核态非中断上下文发生访问0地址时,kernel只会发oops,而不会panic。

帐号已迁移如上链接是《宋宝华:KernelOops和Panic是一回事吗?》大概介绍了在未开启panic_on_oops,内核态非中断

帐号已迁移

如上链接是《宋宝华: Kernel Oops和Panic是一回事吗?》

大概介绍了在未开启panic_on_oops,内核态非中断上下文 发生 访问0地址 时,kernel只会发oops,而不会panic。

看完之后会有个疑问:缺页异常的上下文 是不是 中断上下文?

答案是否。具体解析如下:

1. 首先中断上下文是指当前HARDIRQ/NMI/softIRQ的计数不为0,code 如下:

1 #define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \
2 | NMI_MASK))
3 #define in_interrupt() (irq_count())

  HARDIRQ 计数 在irq_enter()/irq_exit()接口中 做增减, 题外话:在irq_exit接口中通过invoke_softirq()触发软中断,一次执行时间限制在2ms或10次以内

  NMI 计数 在nmi_enter()/nmi_exit()接口中 做增减,ARM64貌似没有找到调用的地方?????

  softIRQ 计数 在__local_bh_disable_ip/__local_bh_enable接口中 做增减

2. 对于ARM64, 异常向量表如下:

1 // 文件:arch/arm64/kernel/entry.S2 3 // 向量表------------------------------------------------------------------------------------------------4 .align 11 //对齐2^7=1285 ENTRY(vectors)6 ventry el1_sync_invalid // Synchronous EL1t7 ventry el1_irq_invalid // IRQ EL1t8 ventry el1_fiq_invalid // FIQ EL1t9 ventry el1_error_invalid // Error EL1t10 11 ventry el1_sync // Synchronous EL1h 同步异常入口,缺页属于这一类12 ventry el1_irq // IRQ EL1h IRQ中断入口, HARDIRQ/SOFTIRQ 计数均在此入口增减13 ventry el1_fiq_invalid // FIQ EL1h FIQ入口,即NMI???? NMI计数应该在这个入口增减???14 ventry el1_error_invalid // Error EL1h15 16 ventry el0_sync // Synchronous 64-bit EL017 ventry el0_irq // IRQ 64-bit EL018 ventry el0_fiq_invalid // FIQ 64-bit EL019 ventry el0_error_invalid // Error 64-bit EL020 21 #ifdef CONFIG_COMPAT22 ventry el0_sync_compat // Synchronous 32-bit EL023 ventry el0_irq_compat // IRQ 32-bit EL024 ventry el0_fiq_invalid_compat // FIQ 32-bit EL025 ventry el0_error_invalid_compat // Error 32-bit EL026 #else27 ventry el0_sync_invalid // Synchronous 32-bit EL028 ventry el0_irq_invalid // IRQ 32-bit EL029 ventry el0_fiq_invalid // FIQ 32-bit EL030 ventry el0_error_invalid // Error 32-bit EL031 #endif32 END(vectors)33 34 // 同步异常:系统调用/数据abort/指令abort/未对齐/未定义/调试异常---------------------------------------------35 .align 636 el1_sync:37 kernel_entry 138 mrs x1, esr_el1 // read the syndrome register39 lsr x24, x1, #ESR_ELx_EC_SHIFT // exception class40 cmp x24, #ESR_ELx_EC_DABT_CUR // data abort in EL141 b.eq el1_da42 cmp x24, #ESR_ELx_EC_SYS64 // configurable trap43 b.eq el1_undef44 cmp x24, #ESR_ELx_EC_SP_ALIGN // stack alignment exception45 b.eq el1_sp_pc46 cmp x24, #ESR_ELx_EC_PC_ALIGN // pc alignment exception47 b.eq el1_sp_pc48 cmp x24, #ESR_ELx_EC_UNKNOWN // unknown exception in EL149 b.eq el1_undef50 cmp x24, #ESR_ELx_EC_BREAKPT_CUR // debug exception in EL151 b.ge el1_dbg52 b el1_inv53 // 数据abort54 el1_da:55 /*56 * Data abort handling57 */58 mrs x0, far_el159 enable_dbg60 // re-enable interrupts if they were enabled in the aborted context61 tbnz x23, #7, 1f // PSR_I_BIT62 enable_irq63 1:64 mov x2, sp // struct pt_regs65 // 跳往do_mem_abort->do_transation_fault->do_page_fault->do_kernel_fault->die->...66 bl do_mem_abort67 68 // disable interrupts before pulling preserved data off the stack69 disable_irq70 kernel_exit 171 el1_sp_pc:72 /*73 * Stack or PC alignment exception handling74 */75 mrs x0, far_el176 enable_dbg77 mov x2, sp78 b do_sp_pc_abort79 el1_undef:80 /*81 * Undefined instruction82 */83 enable_dbg84 mov x0, sp85 b do_undefinstr86 el1_dbg:87 /*88 * Debug exception handling89 */90 cmp x24, #ESR_ELx_EC_BRK64 // if BRK6491 cinc x24, x24, eq // set bit '0'92 tbz x24, #0, el1_inv // EL1 only93 mrs x0, far_el194 mov x2, sp // struct pt_regs95 bl do_debug_exception96 kernel_exit 197 el1_inv:98 // TODO: add support for undefined instructions in kernel mode99 enable_dbg
100 mov x0, sp
101 mov x1, #BAD_SYNC
102 mrs x2, esr_el1
103 b bad_mode
104 ENDPROC(el1_sync)
105
106 // IRQ-------------------------------------------------------------------------------------------------------
107 .align 6
108 el1_irq:
109 kernel_entry 1
110 enable_dbg
111 #ifdef CONFIG_TRACE_IRQFLAGS
112 bl trace_hardirqs_off
113 #endif
114 // 中断入口调用:handle_arch_irq->handle_irq
115 irq_handler
116
117 #ifdef CONFIG_PREEMPT
118 get_thread_info tsk
119 ldr w24, [tsk, #TI_PREEMPT] // get preempt count
120 cbnz w24, 1f // preempt count != 0
121 ldr x0, [tsk, #TI_FLAGS] // get flags
122 tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling?
123 // 中断返回前执行抢占
124 bl el1_preempt
125 1:
126 #endif
127 #ifdef CONFIG_TRACE_IRQFLAGS
128 bl trace_hardirqs_on
129 #endif
130 kernel_exit 1
131 ENDPROC(el1_irq)

3. HARDIRQ softIRQ 计数增减 的 代码流程,即缺页异常的流程 如下图:

综上,在缺页的流程中:HARDIRQ/SOFTIRQ/NMI计数都没有增减,故in_interrupt()

内核态发生非法地址访问是否会panic - black_man - 博客园


推荐阅读
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
author-avatar
UU常璐图_302
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有