程序8-11 linux/kernel/printk.c


  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_startva_argva_end,用于vsprintfvprintfvfprintf函数。

 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.c92行开始处。

 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