LWN: kernel warning 的时候应该怎么处理?

linux初学内核之打印消息 内核版本:Linux version 3.0.15(cat /proc) 阅读详情

关注了就能看到更多这么棒的文章哦~

What to do in response to a kernel warning

By Jonathan Corbet
November 18, 2021
DeepL assisted translation
https://lwn.net/Articles/876209/

内核内部提供了一些宏,供代码在出错的时候调用从而产生 warning。然而,它并没有提供多少指导,来告诉人们在看到 warning 的时候应该做些什么。Alexander Popov 最近发布了一组 patch,为系统对在发出 warning 的时候增加了一个选项。这一组 patch 似乎不太可能按它当前的做法来被合入,但它确实成功地引起了人们关于如何处理 warning 的讨论。

warning 是通过调用 WARN()和 WARN_ON_ONCE() 等宏来触发的。默认情况下,warning 文本被发送到 kernel log 中,然后系统继续执行,就好像 warning 没有发生过一样。有一个 sysctl 开关 (kernel/panic_on_warn),打开的话会在每次 warning 发出时就让系统 panic,但对于系统管理员来说,要么忽略问题、要么让系统完全无法继续用,在这两个选项之间缺乏中间地带。

Popov 的 patch 是增加了另一个名为 kernel/pkill_on_warn 的 sysctl 开关。如果设置为非零值,那么这个参数会要求内核在 warning 出现时就 kill 掉当前正在运行的进程的所有线程。Popov 说,这种行为比起什么都不做来说,可以增加系统的 safety 和 security,同时又不像直接导致系统 panic 方案那么大的破坏性。它可能会杀死当前正在试图攻击系统的进程,并且平时也能让进程避免在已知出现了某些错误的情况下继续运行。

有一些人反对这个方案,Linus Torvalds 是第一个。他指出,当系统出现 warning 时,当前正在运行的进程可能与 warning 本身并没有任何关系。例如,问题可能发生在一个中断处理程序中,或者是其他一些什么情况。他说:"随便向某个进程发送 signal,这只能算是盲目地写程序(voodoo programming),都有可能导致其他一些奇怪的故障"。

Torvalds 认为更好的方法可能是创建一个新的/proc 文件,当某个会影响整个系统的事件发生时(如出现了 warning),就可以从这个 /proc 文件获取到相关信息。然后使用一个用户空间的守护程序(daemon)可以保持对该文件进行 poll 轮询,在看到 warning 时读取到相关信息,然后自己判断需要杀死相关进程的话就自己动手。Marco Elver 补充说,这里有一个 tracepoint 就可以提供相关的信息,只需做一点工作就好。Kees Cook 提出了一个实现方案,但 Popov 不太喜欢。他认为这种方法会让一个进程在 warning 发生后继续执行,而当用户空间对这种情况采取行动时,可能已经太晚了。

James Bottomley 认为,到目前为止讨论中提出的所有方法都是不对路的。他说,如果 warning 发生了,那么内核就不再处于一个已知的正确状态,什么事情都有可能发生:

WARN 的意思是发生了一个意外状况,这意味着内核本身处于一个未知的状态。你不能通过杀死和重启某些东西来恢复,而是必须要重新初始化到一个已知的状态(也就是说需要 reset 系统)。我们之所以用 WARN 而不是 BUG,部分原因可能是我们相信这里的状态被破坏的问题不严重,如果你小心谨慎使用的话,系统可以继续在这种稍微退化一些的状态下继续运行,只要用户愿意接受这种风险。

因此,他说,唯一合理的策略就是继续运行(接受可能发生坏事的风险)或杀死整个系统并重新启动。而这些已经是内核现在就支持的了。

Popov 曾提到 ELISA 项目,该项目正在努力将 Linux 部署到安全关键(safety-critical)的应用中,这个项目可能会支持增加 pkill_on_warning 开关。但为该项目工作的 Lukas Bulwahn(但他小心翼翼地表示他不代表 ELISA 的官方观点)表示不赞同。他说,正确的解决方案是在 warning 时杀死系统,但也要确保只有在事情真正脱离轨道的情况下才发出 warning:

应该是只在某些东西没有按照开发者的期望进行配置、或者内核被置于一个是意料之外的状态、并且基本上只有开发者在紧密关注、测试,尚未被人们广泛使用时,才应该发出 warning。warning 不应该被当作提供信息的机制(informative),因为这些信息提供机制仍然允许内核在正常的环境中继续适当地运行。

他补充说,真正的安全(truly safe)还需要确保对 panic() 的调用在无论什么情况下都能真正停止系统。这一点其实并不像人们想象的那么容易。例如,某次 panic() 调用中可能会在试图获得一个锁时就卡住了。

Christoph Leroy 认为,warning 应该在内核内处理,这样系统才能尽可能地保持良好的运行。鉴于此,他继续说:"pkill_on_warning 似乎很危险,而且关联性不强,可能比什么都不做更危险,尤其是 WARN 可能是因为与当前在运行的线程无关的原因而被触发"。然而,Popov 不同意这样的观点,他认为我们不可以期望所有的 warning 都能在内核中得到正确的处理:

对于在内核源代码中加入 BUG*(),存在着非常强烈的反对力量。所以有很多情况下,使用了 WARN*() 来处理严重的问题,因为内核开发者们没有其他选择。

确实,他的 patch 如何合入并启用了新的选项的话,warning 的行为几乎就跟 BUG() 调用相同了。BUG() 调用默认就会使运行中的进程立即结束。正如他所指出的,开发人员在试图使用这些 BUG() 之类的函数调用时遇到了阻力,因为人们认为这些函数的效果太严重(severe)了。

目前还不清楚这种增加一个让 warning 变得更严重的选项,是否是解决这个问题的最好办法。不过,这次讨论可能会产生一个好的结果,那就是对 warning 的含义和产生 warning 时应该发生什么会继续进行更好地定义。跟内核中的许多机制一样,warning 宏是在没有系统尚未进行整体设计的情况下出现的。现在有了很多关于开发者们使用 warning 的丰富经验,所以现在开始进行一些设计可能会使内核整体上更加茁壮稳定(robust)。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

b872dd568bec10d0a7ab905a67ea7ff3.png

pycharm添加Anaconda解释器显示不出来 因为我之前下载的是pycharm最新版本2024.1的,所以我抱着试一试的心态卸载重装了2021.3.3的,创建新文件的时候立刻就自己识别好了conda环境。就是图中画圈的地方,之前一直显示为python的图标,但是再Python Interpreter后面跟的路径确实是我下载anaconda的地方。另外一种方法就是使用Virtualenv Environment方式配置,但是我的pycharm还是没有识别出conda的图标。首先是这位的方法,先添加系统解释器,再重启,但是我的图标还是python。 阅读详情

相关推荐

ESP32-P4 GPIO双域架构:HP/LP分离、寄存器级控制与低功耗工程实践

GPIO(通用输入输出)是嵌入式系统中最基础且高频使用的硬件接口,其性能、灵活性与功耗特性直接影响产品实时性与续航能力。现代高性能MCU如ESP32-P4通过HP/LP双电源域分离、可编程IO复用(IO MUX)、信号交换矩阵及硬件自动化机制(如ETM事件、Sigma-Delta调制),将传统GPIO升级为兼具模拟能力、亚微秒响应与微安级待机的智能外设子系统。其核心价值在于实现引脚功能动态重构、中断零延迟处理、Deep-sleep期间自主唤醒与多核安全操作。典型应用场景涵盖工业PLC信号采集、电池供电传感器

weixin_35949153的博客 96

printk函数相关知识

printk函数        printk函数在linux内核中定义,功能和标准C库中的printf函数类似。因为内核需要自己的打印函数,又不能依赖于C库,模块在连接到内核之后就可以访问内核的公共符号。其中KERN_ALERT定义了这条消息的优先级。在<linux/kernel.h>中定义了8种记录级别,按照优先级...

weixin_43718250的博客 673

Innovus ECO修复时序违例:ecoAddRepeater插Buffer原理与实战

芯片物理设计越到后期,时序收敛越依赖局部修正而非全局重跑。ECO(Engineering Change Order)作为数字后端高频操作,能在不破坏既有布局布线结果的前提下,精准修复DRV违例、hold时序问题或实现功能补丁。其中,插入Buffer或Inverter是拆解长线RC负载、改善max_transition/max_capacitance最直接的手段。Innovus提供的ecoAddRepeater命令封装了单元选择、坐标摆放和网表重连等底层细节,配合ecoRoute可快速完成绕线。合理选型Buf

weixin_31858171的博客 299

linux kernel内核、驱动日志调试方法(一)

对于正在运行的内核,所谓的core文件就是这个内核在内存中的核心映像,即/proc/kcore。proc文件系统是一种无存储的文件系统,当读其中的文件时,其内容由文件关联的读函数动态生成,当写文件时,文件所关联的写函数被调用。printk是打印内核消息的函数,printk通过附加不同日志级别(loglevel)或者说消息优先级,让printk对消息进行分类,这是与printf最大的区别,在编译时,日志级别宏会被展开为一个字符串,然后与消息本文拼接在一起,因此printk中优先级和格式字符串之间没有逗号。

rjszcb的博客 7242

【Bug已解决】Auto mode cannot determine the safety of an action — Claude Code 自动模式安全判断失败解决方案

将已知安全的操作添加到白名单,分类器不再拦截这些操作。# 步骤 1:编辑 Claude Code 配置"Read","Write"EOF# 步骤 2:白名单中的操作将自动通过# 不在白名单中的操作仍需分类器判断# 步骤 3:重启 Claude Codeclaude方案适用场景推荐指数难度方案一:手动审批偶发回退,安全优先⭐⭐⭐⭐⭐低方案二:/compact 压缩上下文超限导致⭐⭐⭐⭐低方案三:拆分步骤复杂操作触发⭐⭐⭐⭐低方案四:跳过审批隔离环境,CI/CD。

博客 1万+

ubuntu20 安装px4、mavros、QGroundControl

首先安装一下ant,否则没法运行,同时因20.04的缺少动态库libawt_xawt.so无法被Java8给调用,我的解决办法是去18.04把18.04的相同路径下的动态库libawt_xawt.so移动到20.04的/usr/lib/jvm/java-11-openjdk-amd64/lib/路径中。用rosdepc的时候,你得确保你用的是鱼香ROS的提供的ROS安装方法,否则是没有rosdepc的。make px4_sitl gazebo之前,可以安装一下gazebo的 模型。二、安装MAVROS。

qq_58060770的博客 3349

kernel debug by printk and syslogd

首先申明,我还没有试验成功。呵呵 在头文件 中定义了 【8种可用的日志级别字符串】KERN_EMERG    用于紧急事件消息,它们一般是系统崩溃之前提示的消息。KERN_ALERT    用于需要立即采取动作的情况。KERN_CRIT     临界状态,通常涉及严重的硬件或软件操作失败。KERN_ERR      用于报告错误状态;设备驱动程序会经常使用KERN_ERR

RichardYSteven的专栏 1595

14、多标签分类与卷积神经网络在医学图像处理中的应用

本文探讨了多标签分类与卷积神经网络(CNN)在医学图像处理中的应用。文章详细介绍了多标签分类的概念和挑战,以及如何通过CNN进行高效、准确的分类任务。内容涵盖模型设计、损失函数选择、数据增强技术、类别权重调整等关键技术点,并结合实际案例,如白内障手术工具检测、视网膜血管分割等,展示了CNN在医学图像分析中的强大潜力。此外,还讨论了模型优化策略及面临的挑战与解决方案。

t8u9v0的博客 191

嵌入式linux调试技巧

一、printk 1、打印往往是最常用的调试技巧。调试内核和驱动都可以采用printk。在Kernel.h (include\linux)中定义了log的等级。 未指定日志级别的 printk() 采用的默认级别是 DEFAULT_MESSAGE_LOGLEVEL,这个宏在kernel/printk.c 中被定义为整数 4,即对应KERN_WARNING。在 /proc/sys/kerne

风雨无阻 2840

【专栏目录】

🌟 深度学习工程师的终极武器库!本专栏深度解析近3年CV领域最前沿的YoloV8改进方案,每一种方法都经过实战验证,性能显著提升!🌟。

m0_47867638的博客 1万+

SolidWorks2020详细步骤安装教程

1、在安装软件前请断开网络连接,需要安装.NETFramework3.5和4.0,最后还要确保把之前安装的旧版本完全卸载,以管理员身份运行SolidWorks_Flexnet_Server\server_remove.bat,然后等到服务“SolidWorksFlexnet服务器”将被删除。12、先不要运行软件,找到_SolidSQUAD_文件夹,将文件夹“ProgramFiles\SOLIDWORKSCorp”中的所有破解文件复制替到“ProgramFiles\SOLIDWORKSCorp”目录下;

qq_53545309的博客 1万+

【翻译】 如何应对内核警告?

LWN.net需要你!没有订阅者,LWN就根本不存在。 请考虑注册订阅,帮助LWN继续出版。 作者:Jonathan Corbet2021年11月18日 内核在内部提供了许多宏,允许代码在出错时产生警告。 然而,它并没有提供很多关于警告发出时应该发生什么的指导。 Alexander Popov最近发布了一个补丁系列,为系统对警告的响应...

超级码力 4070

基于PyTorch+Transformer实现谣言检测系统

本项目使用基于`PyTorch+Transformer`的谣言检测模型,将文本中的谣言事件进行连续向量化,通过一维卷积神经网络的学习训练来挖掘表示文本深层的特征,避免了特征构建的问题,并能发现那些不容易被人发现的特征,从而产生更好的效果。

优快云 精品推荐 6349

Linux kernel的调试技术

内核中的调试支持 内核开发者在内核中建立了很多调试功能。但是这些调试功能会造成额外的输出,并且导致性能下降,因此发行版厂商通常会禁止发行版内核中的这些功能。但是作为一名内核开发者,调试需求具有更高优先级,从而乐意接受额外的调试支持而带来的性能损失。 这里列出内核开发的几个配置选项,除特殊指出,所有这些选项均出现在“kernel hacking”菜单。并非所有体系架构都支持其中的某些选线。更多的调试功可能查看lib/Kconfig.debug文件,或者在menuconfig中搜索关键字debug。 CO

jinchengzhou的专栏 1653

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

linux内核printk用法以及相关调试

1、内核中打印信息,只能使用printk,不能使用printf。 函数原型: int printk(const char *fmt, ...); 2、printk打印等级 #define KERN_EMERG “&amp;amp;amp;lt;0&amp;amp;amp;gt;” /* system is unusable / #define KERN_ALERT “&amp;amp;amp;lt;1&amp;amp;amp

Feng_8071的博客 847

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Linux kernel 命令行参数二

memblock=debug [KNL] Enable memblock debug messages. load_ramdisk= [RAM] [Deprecated] lockd.nlm_grace_period=P [NFS] Assign grace period. Format: <integer> lockd.nlm_tcpport=N [NFS] Assign T...

哦,原来你也在这里。 3378

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux字符设备驱动学习(4)——内核调试

一、内核开发的配置选项 1.CONFIG_DEBUG_KERNEL 该选项仅仅使得其他的调试选项可以。我们应该打开该选项,但它本身不会打开所以的调试功能。 2.CONFIG_DEBUG_SLAB 这是一个非常重要的选项,他打开内核内存分配函数中的多个类型检查:打开该检查后,就可以检测许多内存溢出及忘记初始化的错误。在将已分配内存返回给调用者之前,内核将把其中的每个字节设置为0xa5,而在释放后将其设置为0x6b。可在自己去的程序的输出或用过在oops信息中看字符判断问题所在。在打开调试选项后,内核还会在每个

PPPPPPPKD的博客 2476

printk日志级别以及Linux内核atomic_set介绍

printk是 Linux 内核中用于输出信息的函数,它可以将信息输出到各种不同的设备和位置,例如控制台、串口、日志文件等。printk 函数的输出会被写入内核的环形缓冲区中,并由一个或多个后台进程将其传输到目标设备或位置。可以使用dmesg命令来查看内核环形缓冲区中的输出消息。此外,也可以将 printk 输出重定向到其他设备或位置,例如串口或日志文件。需要注意的是,由于 printk 函数可能会在中断上下文或原子上下文中被调用,因此需要遵循一些特殊规则来确保其安全性和可用性。

m0_51429770的博客 3361

linux内核中printk的打印级别

内核中预定义的内核log等级 // include/linux/kern_levels.h #define KERN_SOH "\001" /* ASCII Start Of Header */ #define KERN_SOH_ASCII '\001' #define KERN_EMERG KERN_SOH "0" /* system is unusable */...

夜风的博客 3万+

Linux设备驱动程序(四)——调试技术

由于内核是一个不与特定进程相关的功能集合,所以内核代码无法轻易地放在调试器中执行,而且也很难跟踪跟踪,本章节将介绍监视内核代码并跟踪错误的技术。

明天你好的博客 3101

Linux的kern日志和demsg,Linux中的Printk与dmesg功能

要将linux内核的带级别控制的printk内容打印出来,在命令行输入 dmesg -n 8 就将所有级别的信息都打印出来。Linux命令:dmesg  功能说明:显示开机信息。语 法:dmesg [-cn][-s ]补充说明:kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里...

weixin_39851048的博客 621

linux内核bug问题排查过程详细报告

Linux Kernel BUG:soft lockup CPU#1 stuck分析 1.线上内核bug日志 kernel: Deltaway too big! 18428729675200069867 ts=18446743954022816244 write stamp =18014278822746377 kernel:------------[ cut here ]------------ kernel:WARNING: at kernel/trace/ring_buffer.c:198..

一口Linux的专栏 5313

kernel中的日志打印

1.kernel中打印日志形式 (1)printk (2)pr_xxx (pr_debug支持动态打印) (3)dev_xxx (dev_dbg支持动态打印) (4)module_param_named (支持动态动态打印) 目前在kernel驱动代码中,不在建议直接使用printk直接添加打印信息,而是使用pr_debug、pr_info、dev_info、dev_dbg之类的函数替代,这些函数的本质还是printk打印,但相比具有以下优点: (1)支持打印模块信息、dev信息(指的是dev_xxx)

云淡风轻 4152

解决编译kernel出现WARNING: modpost: Found 4 section mismatch(es)

板子 helper2416  (cpu s3c2416) 编译kernel 时 版本3.2.11 WARNING: modpost: Found 4 section mismatch(es). To see full details build your kernel with: 'make CONFIG_DEBUG_SECTION_MISMATCH=y' make ARCH=arm

zmlovelx(帅得不敢出门 程序员群31843264) 1万+

Linux:进程暂停与继续

如下: LINUX 暂停、继续进程

zwx54088的博客 577

Linux内核编译时warning被当作error处理的解决办法

Linux内核编译时warning被当作error处理的解决办法

lp135032236的博客 4836
上一篇: LWN:对加速器驱动的硬性要求!
下一篇: LWN: 换一种方式来实现BPF循环!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值