news 2026/5/8 16:32:53

征程 6X 之 Memory corruption 问题分析方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
征程 6X 之 Memory corruption 问题分析方法

Memory corruption

对于系统中出现随机、不可解释的异常指针访问或数据错误导致的异常,一般要考虑是内存使用上出现了 UAF(Use-After-Free),OOB(Out-of-Bounds)。

本章所指的”Memory corruption”特指 Linux kernel 侧出现的”Memory corruption”,子系统间的内存踩踏请参考 Firewall 。

通用方法

当怀疑系统有 OOB、UAF 类问题时,打开 CONFIG_KASAN 开关,进行复现。

当出现 memory corruption 问题时,系统默认会 BUG_ON。

检查 panic log 信息,对于 slub、stack、buddy page、全局变量的 UAF 和 OOB 均有关键信息指出,基本通过 log 能够解决所有问题。

典型问题

[ 6.262525] BUG: KASAN: global-out-of-bounds in __of_match_node+0x70/0xb8

[ 6.263391] Read of size 1 at addr ffffff9008d153a8 by task swapper/0/1

[ 6.264231]

[ 6.264439] CPU: 5 PID: 1 Comm: swapper/0 Not tainted 6.1.94-rt33-gac7c113a9bab #2

[ 6.265488] Hardware name: Horizon Robotics 征程 6E Evaluation Module Board (DT)

[ 6.266362] Call trace:

[ 6.266694] [] dump_backtrace+0x0/0x538

[ 6.267391] [] show_stack+0x14/0x20

[ 6.268048] [] dump_stack+0xa4/0xc8

[ 6.268703] [] print_address_description+0x1e4/0x250

[ 6.269539] [] kasan_report+0x2cc/0x300

[ 6.270240] [] __asan_load1+0x44/0x50

[ 6.270912] [] __of_match_node+0x70/0xb8

[ 6.271617] [] of_match_node+0x38/0x60

[ 6.272301] [] of_match_device+0x3c/0x50

[ 6.273012] [] platform_match+0x64/0x118

[ 6.273719] [] __driver_attach+0x40/0x140

[ 6.274435] [] bus_for_each_dev+0xcc/0x140

[ 6.275164] [] driver_attach+0x30/0x40

[ 6.275848] [] bus_add_driver+0x220/0x388

[ 6.276566] [] driver_register+0x108/0x170

[ 6.277295] [] __platform_driver_register+0x7c/0x88

[ 6.278122] [] 征程 6_wdt_driver_init+0x34/0x4c

[ 6.278861] [] do_one_initcall+0xe4/0x1b8

[ 6.279581] [] kernel_init_freeable+0x1ac/0x260

[ 6.280363] [] kernel_init+0x10/0x118

[ 6.281036] [] ret_from_fork+0x10/0x18

[ 6.281713]

[ 6.281911] The buggy address belongs to the variable:

[ 6.282570] 0xffffff9008d153a8

[ 6.282974]

[ 6.283173] Memory state around the buggy address:

[ 6.283794] ffffff9008d15280: fa fa fa fa 07 fa fa fa fa fa fa fa 00 00 00 00

[ 6.284715] ffffff9008d15300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

[ 6.285636] >ffffff9008d15380: 00 00 00 00 00 fa fa fa fa fa fa fa 00 00 00 00

[ 6.286552] ^

[ 6.287137] ffffff9008d15400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

[ 6.288057] ffffff9008d15480: 00 00 00 fa fa fa fa fa 00 00 fa fa fa fa fa fa

[ 6.288974] ==================================================================

[ 6.289890] Disabling lock debugging due to kernel taint

错误类型 global-out-of-bounds,全局变量越界访问,越界读取访问一个字节。

检查 Calltrace 是在驱动 probe 匹配 device、driver 的过程中。

复杂问题可能需要检查 trace 后面 buggy address(并非实际数据地址,而是在 shadow 区的映射)信息综合分析,此问题可以看到要访问地址 ffffff9008d153a8 里数据为 0xFA,0xFA 代表全局变量的 redzone(越界检测)。

检查逻辑__of_match_node 过程是循环遍历 of_match_table 中所有的项,直到表项中成员为空退出循环。

const struct of_device_id *__of_match_node(const struct of_device_id *matches,

const struct device_node *node)

{

const struct of_device_id *best_match = NULL;

int score, best_score = 0;

if (!matches)

return NULL;

for (; matches->name[0] |matches->type[0] |matches->compatible[0]; matches++) {

score = __of_device_is_compatible(node, matches->compatible,

matches->type, matches->name);

if (score > best_score) {

best_match = matches;

best_score = score;

}

}

return best_match;

}

根据代码可知,越界原因是 of_match_table 变量尾部没有填充 0。

#ifdef CONFIG_OF

static const struct of_device_id 征程 6_wdt_of_match[] = {

  • { .compatible = “snps,征程 6_wdt”, }
  • /* sentinel */
  • { .compatible = “snps,征程 6_wdt”, },
  • {/* sentinel/} /PRQA S 1041/};MODULE_DEVICE_TABLE(of, 征程 6_wdt_of_match); /PRQA S 0605 */

#endif

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 16:32:46

从分散到统一:如何重构支付计费系统,降低新业务接入成本

摘要:本文介绍一套面向海外支付场景的计费中台架构实践,通过领域驱动设计(DDD)和配置化引擎,实现新业务接入成本降低 80%、代码复用率提升 70%、计费成功率 100% 的工程目标。关键词:计费中台;领…

作者头像 李华
网站建设 2026/5/8 16:32:38

一行代码调用20+主流大模型:打造你的统一AI网关

从OpenAI到Claude,从文心到DeepSeek,企业如何优雅地管理多个大模型API?本文分享一套生产级方案。 前言 作为一名AI应用开发者,你是否也经历过这样的痛苦: 接入GPT-4,文档是英文的,参数格式和其…

作者头像 李华
网站建设 2026/5/8 16:32:38

Thorium浏览器终极指南:如何让老旧电脑也能流畅上网

Thorium浏览器终极指南:如何让老旧电脑也能流畅上网 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, links are towards the top of the R…

作者头像 李华
网站建设 2026/5/8 16:32:29

专业的国内无人物流车租赁公司

一、行业背景与需求随着电商的迅猛发展和物流行业的不断进步,物流配送的效率和成本控制成为了企业关注的重点。在这个背景下,无人物流车的应用逐渐崭露头角。据相关数据显示,近年来我国快递业务量持续增长,2023 年已经突破 1000 亿…

作者头像 李华
网站建设 2026/5/8 16:32:25

动态定价算法解析:从技术原理到消费者应对策略

1. 动态定价:一次差点让我“破费”的真实遭遇前几天,我差点被一个看不见的“数字捕手”给咬了一口。事情是这样的,我正为即将到来的Design West会议准备一个关于辐射对嵌入式系统影响的演讲,想搞点有趣的演示道具。我相中了一个带…

作者头像 李华
网站建设 2026/5/8 16:32:22

摩尔定律失效?从NAND闪存工艺演进看半导体产业转型

1. 从“伦敦呼唤”说起:一场关于摩尔定律的行业预判十多年前,一篇来自EE Times的评论文章《London Calling: Moore’s Law fail at NAND flash node》在半导体圈内激起了不小的涟漪。文章的核心观点直指产业心脏:闪存巨头SanDisk在其1Y代NAND…

作者头像 李华