内核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
相关产品推荐
相关产品推荐

