1. 说明
根据内核文档整理而成,具体格式含义可查看内核文档,或点击如何获得正确的printk格式占位符(v6.6)或如何获得正确的printk格式占位符(latest)查看。 linux-6.6相关内核文档路径如下:
Documentation/core-api/printk-formats.rst Documentation/translations/zh_CN/core-api/printk-formats.rst
2. 整数类型
内核的printk
不支持%n
,也不支持浮点格式(%e / %f / %g / %a)。在printk
中使用任何不支持的占位符或长度限定符都会导致一个WARN并且终止vsnprintf()
执行。注意,sizeof()返回类型为size_t。
type | format(DEC) | format(HEX) |
---|---|---|
char / short int / int | %d | %x |
unsigned char / unsigned short int / unsigned int | %u | %x |
long | %ld | %lx |
unsigned long | %lu | %lx |
long long | %lld | %llx |
unsigned long long | %llu | %llx |
s8 / s16 / s32 | %d | %x |
u8 / u16 / u32 | %u | %x |
s64 | %lld | %llx |
u64 | %llu | %llx |
size_t | %zu | %zx |
ssize_t | %zd | %zx |
如果type的大小依赖于配置选项 (例如sector_t, blkcnt_t) 或其大小依赖于架构(例如tcflag_t),则使用其可能的最大类型的格式占位符并显式强制转换为它。例如:
1printk("test: sector number/total blocks: %llu/%llu\n",
2 (unsigned long long)sector, (unsigned long long)blockcount);
3. 指针类型
一个原始指针值可以用%p
打印,它将在打印前对地址进行哈希处理。内核也支持扩展占位符来打印不同类型的指针。
type | format |
---|---|
普通指针 | %p |
错误指针 | %pe |
符号/函数指针 | %ps / %pS[Rb] / %pB[b] |
来自BPF / tracing追踪的探查指针 | %p[ku]s |
内核指针 | %pK |
未经修改的地址 | %px |
指针差异 | %t[dx] |
结构体资源(Resources) | %p[rR] |
物理地址类型 phys_addr_t | %pa[p] |
DMA地址类型dma_addr_t | %pad |
原始缓冲区为转义字符串 | %*pE[achnops] |
原始缓冲区为十六进制字符串 | %*ph[CDN] |
MAC/FDDI地址 | %pM[RF] / % pm[R] |
IPv4地址 | %p[Ii]4[hnbl] |
IPv6 地址 | %pi6[c] / %pI6[c] |
IPv4/IPv6地址(generic, with port, flowinfo, scope) | %p[Ii]S[pfschnbl] |
UUID/GUID地址 | %pU[BbLl] |
目录项(dentry)的名称 | %p[Dd]{,2,3,4} |
块设备(block_device)名称 | %pg |
va_format结构体 | %pV |
设备树节点 | %pOF[fnpPcCF] |
Fwnode handles | %pfw[fP] |
时间和日期 | %pt[RT][dt][r][s] |
clk结构体 | %pC[n] |
位图及其衍生物,如cpumask和nodemask | %*pb[l] |
标志位字段,如页标志、gfp_flags | %pG[pgv] |
网络设备特性 | %pNF |
V4L2和DRM FourCC代码(像素格式) | %p4cc |
一些扩展占位符会打印给定地址上的数据,而不是打印地址本身。在这种情况下,以下错误消息可能会被打印出来,而不是无法访问的消息
打印内容 | 描述 |
---|---|
(null) | data on plain NULL address |
(efault) | data on invalid address |
(einval) | invalid data on a valid address |