具体实例如下:
printk(KERN_ERR "random addess s is: %s\n",(char *)0X00000333);
输出为 : random addess s is: (null)
printk(KERN_ERR "random addess s is: %s\n",(char *)0X000003333);
却会导致系统崩溃
通过分析printk的源码发现:
printk-->vsnprintf-->string
char *string(char *buf, char *end, const char *s, struct printf_spec spec)
{
int len, i;
//加入输入的地址小于flash 一个page的时候(刚刚我用的是flash page size 是4096)
// 直接返回 “null”
if ((unsigned long)s < PAGE_SIZE)
s = "(null)";
return buf;
}
加入大于4096的话,去这个地址取字符串,会产生 memory 异常,导致系统奔溃。
本文深入分析了 printk 函数在特定条件下输出异常导致系统崩溃的现象,通过剖析源码,揭示了当输入地址小于 flash 大小限制时,函数如何直接返回 'null',避免内存访问错误;而当输入地址超过限制时,则尝试访问该地址,从而引发 memory 异常并导致系统崩溃。提供了一个清晰的技术案例,帮助开发者理解并预防此类错误。





