1 /*
2 * linux/kernel/printk.c
3 *
4 * (C) 1991 Linus Torvalds
5 */
6
7 /*
8 * When in kernel-mode, we cannot use printf, as fs is liable to
9 * point to 'interesting' things. Make a printf with fs-saving, and
10 * all is well.
11 */
/*
* 当处于内核模式时,我们不能使用printf,因为寄存器fs指向其他不感兴趣
* 的地方。自己编制一个printf并在使用前保存fs,一切就解决了。
*/
// 标准参数头文件。以宏的形式定义变量参数列表。主要说明了-个类型(va_list)和三个宏
// va_start、va_arg和va_end,用于vsprintf、vprintf、vfprintf函数。
12 #include <stdarg.h>
13 #include <stddef.h> // 标准定义头文件。定义了NULL, offsetof(TYPE, MEMBER)。
14
15 #include <linux/kernel.h> // 内核头文件。含有一些内核常用函数的原形定义。
16
17 static char buf[1024]; // 显示用临时缓冲区。
18
// 函数vsprintf()定义在linux/kernel/vsprintf.c中92行开始处。
19 extern int vsprintf(char * buf, const char * fmt, va_list args);
20
// 内核使用的显示函数。
21 int printk(const char *fmt, ...)
22 {
23 va_list args; // va_list实际上是一个字符指针类型。
24 int i;
25
// 运行参数处理开始函数。然后使用格式串fmt将参数列表args输出到buf中。返回值i
// 等于输出字符串的长度。再运行参数处理结束函数。最后调用控制台显示函数并返回显示
// 字符数。
26 va_start(args, fmt);
27 i=vsprintf(buf,fmt,args);
28 va_end(args);
29 console_print(buf); // chr_drv/console.c,第995行开始。
30 return i;
31 }
32