news 2026/10/29 11:02:00

slub restore_bytes

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
slub restore_bytes

restore_bytes()是 SLUB 调试里修复被破坏内存区域的辅助函数:把一段被越界写或 poison 破坏的字节恢复成期望值,并记录一条FIX日志。

一、函数签名

static void restore_bytes(struct kmem_cache *s, const char *message, u8 data, void *from, void *to)
参数含义
s缓存
message描述这段区域是什么,如"redzone"、"Poison"
data要恢复成的字节值(期望值)
from起始地址(含)
to结束地址(不含,即[from, to))

无返回值。

二、实现解析

static void restore_bytes(struct kmem_cache *s, const char *message, u8 data, void *from, void *to) { slab_fix(s, "Restoring %s 0x%p-0x%p=0x%x", message, from, to - 1, data); memset(from, data, to - from); }

两步:

1. 记录修复日志

slab_fix(s, "Restoring %s 0x%p-0x%p=0x%x", message, from, to - 1, data);
  • 用slab_fix()输出一条FIX级别日志(前面讲过,表示“发现异常并已修复”,而非致命 BUG)。

  • 打印内容:

    • message:区域描述。

    • from/to - 1:闭区间[from, to-1],比半开区间直观,方便人看。

    • data:恢复的目标值。

  • 输出形如:

FIX kmalloc-64: Restoring redzone 0xffff888012345780-0xffff88801234578f=0xbb

2. 恢复内存

memset(from, data, to - from);
  • 把[from, to)这段内存全部填成data。

  • to - from是字节数。

  • 覆盖被破坏的越界写痕迹,让对象回到合法状态。

三、修复的语义

restore_bytes()用于非致命、可恢复的破坏:

  • 红区被轻微越界写:越界写覆盖了红区的一小段,但对象本身没坏。恢复红区,让后续校验继续通过。

  • poison 值被意外改写:比如释放后某处写了脏数据,恢复成POISON_FREE。

  • padding 被破坏:填充区被覆盖,恢复成标准填充值。

与object_err()的区别:

函数语义后续动作
object_err()致命错误,无法恢复污染内核,停止使用
restore_bytes()可恢复的破坏修复并继续运行

slab_fix()的FIX前缀正好表达“发现问题 + 已修复”,而不是“BUG”。

四、与check_object()的配合

restore_bytes()的典型调用点是check_object()检测到红区或 poison 被破坏时:

static int check_bytes_and_report(struct kmem_cache *s, struct slab *slab, u8 *object, const char *what, u8 *start, unsigned int value, unsigned int bytes) { u8 *fault; u8 *end; fault = memchr_inv(start, value, bytes); // 找第一个不等于 value 的字节 if (!fault) return 1; // 全部正常 end = start + bytes; while (end > fault && end[-1] == value) end--; // 收缩到被破坏的区间 slab_bug(s, "%s overwritten", what); object_err(s, slab, object, "Object already free"); // 或类似 print_section(...); restore_bytes(s, what, value, fault, end); // 恢复被破坏区间 return 0; }

流程:

  1. 检测:用memchr_inv()找出第一个不等于期望值的字节。

  2. 报告:slab_bug/object_err/print_section输出现场。

  3. 收缩区间:把尾部也是期望值的部分排除,只保留真正被破坏的[fault, end)。

  4. 修复:restore_bytes(s, what, value, fault, end)恢复。

具体用途

  • check_bytes_and_report(..., "Left Redzone", ..., SLUB_RED_INACTIVE, ...)

  • check_bytes_and_report(..., "Right Redzone", ..., SLUB_RED_INACTIVE, ...)

  • check_bytes_and_report(..., "Padding", ..., POISON_FREE, ...)

  • check_bytes_and_report(..., "Object", ..., POISON_FREE/INUSE, ...)

message参数就是what,data是value,from/to是fault/end。

五、输出示例

一次红区被破坏后的输出:

BUG kmalloc-64 (debug): Left Redzone overwritten ... Object 0xffff888012345678 ... FIX kmalloc-64: Restoring Left Redzone 0xffff888012345770-0xffff888012345777=0xbb
  • BUG:报告检测到破坏。

  • FIX:说明已恢复破坏的字节。

六、与前面知识的呼应

前面讲过这里体现
slab_fix()输出FIX日志
slab_bug()/object_err()同一流程里先报 BUG
check_object()/check_bytes_and_report()调用restore_bytes的上层
SLUB_RED_INACTIVE/POISON_FREE等data的典型取值
print_section()报错时打印现场,修复前
memset()底层恢复操作

七、设计要点总结

  1. 检测 + 修复:SLUB 调试不仅报错,还尽量恢复,让系统继续运行以收集更多信息。

  2. 日志明确:FIX前缀区分“已修复”和“致命 BUG”。

  3. 区间语义:[from, to),日志里显示to - 1方便人读。

  4. 精确恢复:只恢复被破坏的区间,不动正常部分。

  5. 配合校验:由check_bytes_and_report()检测后调用,形成“检测→报告→收缩→恢复”闭环。

八、一句话总结

restore_bytes(s, message, data, from, to)把[from, to)这段被破坏的内存恢复成期望字节data,并用slab_fix()输出一条FIX日志说明修复了什么。它是 SLUB 调试里“可恢复破坏”的修复端,由check_bytes_and_report()在检测到红区/poison/padding 被改写后调用,与object_err()(致命错误)形成“能修则修、不能修则报 BUG”的分工。

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

第10章:四维能力1:I维度——洞察力:看清世界的能力

开篇引子某零售企业ITBP在日常销售报表中发现华东区某品类销量连续3周下降5%。他没有把这个当作“正常的波动”,而是主动联系该区域业务负责人深入了解情况——发现竞品推出了类似产品且价格更低。他随即建议调整促销策略并上线了价格监控看板。3周后销量回升。“数…

作者头像 李华
网站建设 2026/10/29 10:59:28

亿智 SA223 MDVR 配套 Sensor 推荐清单

定位:国产车载 AI 视觉 SoC,大量用于网约车 / 货车 MDVR、流媒体后视镜、双录记录仪,内置 DDR,BOM 简洁,你前面 MDVR 方案经常用到珠海亿智电... 表格 项目 参数 CPU 双核 NPU 第二代自研 NPU,1.0 TOPS 内置内存 2Gb DDR3L(片上集成,不用外挂 DDR) ISP 最高 5MP@30fps…

作者头像 李华
网站建设 2026/10/29 10:59:27

接收3C商品图字节,先设总量上限再谈解码

下载或接收一份3C商品图片时,文件还没有交给图像解码器,程序就可能已经把大量字节累积进内存。只在打开图片后检查宽高,无法约束前面已经收进来的数据。本篇先做一个更靠前的小边界:从字节块迭代器累积内容,总量超过约…

作者头像 李华
网站建设 2026/10/29 10:57:41

3D高斯泼溅技术优化:PM-Loss解决深度不连续性难题

1. 项目概述3D高斯泼溅(3D Gaussian Splatting)技术近年来在计算机视觉领域获得了广泛关注,特别是在新视角合成任务中展现出显著优势。这项技术通过将3D场景表示为一系列可学习的高斯分布,实现了高效的场景重建和渲染。然而,传统基于深度图的…

作者头像 李华
网站建设 2026/10/29 10:56:08

AI情感伴侣“集体下线“:1000万“电子恋人“一夜失恋

AI情感伴侣"集体下线":1000万"电子恋人"一夜失恋七部门联合发布新规,AI拟人化互动服务被划定红线,大量虚拟伴侣APP一夜之间下架。有人哭了三天三夜,有人说"我再也不相信爱情了"。本文通过三个真实故…

作者头像 李华