内核开发不同于以往我们编写应用程序那样肆无忌惮,内核的运行环境不具备很多“智能处理”,我们常常需要遵守某些规则和特点进行内核程序的编写。
如我们在编写一些应用的时候常常使用printf
函数来做格式化输出,但是内核中并没有实现该函数,取而代之的是printk
函数,该函数的功能与printf
功能基本一致
printk是使用宏的方式定义了该函数,靠开发者自己实现
# linux/printk.h
#define printk(fmt, ...) printk_linux_wrap(_printk, fmt, ##__VA_ARGS__)
#define printk_linux_wrap(_p_func, _fmt, ...) \
({ \
__printk_index_emit(_fmt, NULL, NULL); \
_p_func(_fmt, ##__VA_ARGS__); \
})
# linux/printk.c
asmlinkage __visible int _printk(const char *fmt, ...)
{
va_list args;
int r;
va_start(args, fmt);
r = vprintk(fmt, args);
va_end(args);
return r;
}