You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内核printf格式中%r的含义及相关文档查询

关于Linux内核中%r格式符的说明

哦,这个我熟!你在标准sprintf手册里找不到%r太正常了——这玩意儿是Linux内核自己给printf家族(比如printk)加的专属扩展格式符,根本不在标准C库的规范里,下面给你掰扯清楚:

核心功能

  • 它专门用来以带0x前缀的十六进制格式打印寄存器值、指针或者其他硬件相关的固定宽度数据,会自动根据参数的类型(比如32位/64位)适配输出长度,补全前导零。
  • 对比标准的%x/%lx,%r省去了手动指定宽度的麻烦,比如打印64位寄存器不用写%016lx,用%r就能自动输出16位的十六进制数,代码更简洁。

文档出处

不用找外部链接,直接看内核源码自带的官方文档就行:

  • 内核源码树里的Documentation/core-api/printk-formats.rst文件,里面把所有内核扩展的printf格式符都列全了,包括%r的详细使用规则。
  • 要是想深究实现逻辑,去看lib/vsprintf.c里的代码注释,里面有处理%r格式的具体逻辑说明。

代码示例

你在内核里看到的用法大概是这样的:

printk(KERN_DEBUG "Current RIP register: %r\n", get_current_rip());

这段代码会自动把RIP寄存器的值转换成带0x前缀的完整十六进制字符串输出,不用你操心宽度的问题。

内容的提问来源于stack exchange,提问作者Good Person

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:28:20