与用户空间应用不同的是,内核不能调用标准C库或其它任何不属于内核的库。主要原因是,速度及大小的限制。
标准C库对内核而言实在是太大了。
许多常用的的 libc 函数已经在内核中实现了。内核中的库文件是在内核的根目录下 lib 目录下存放。
如常用的字符串操作函数是在 lib/string.c 中定义的,调用时主需要将头文件 <linux/string.h>包含进即可。
关于内核的头文件,内核是不能包含内核之外的头文件的,如同内核不能调用内核之外的库一样。
1)基本的头文件放在内核的 include/ 目录下,比如以下引用的头文件
#include <linux/i2c.h>
位于 include/linux/i2c.h
2)平台相关的头文件位于 arch/<architecture>/include/asm 下,在包含这些头文件时以 asm/ 为前缀,如下:
#include <asm/ioctl.h>
内核中不能调用 printf(), 但内核提供了 printk() 供我们使用。
printk() 与printf()的用法很相似,如下:
printk("Hello world! A string '%s' and an integer '%d' ", str, i);
printk() 与 printf() 一个显著的区别是,printk() 允许使用优先级标记。该优先级标志被 syslogd 进程用来决定在哪显示
内核打印信息。如下例:
printk(KERN_ERR "this is an error! ");
注意,在优先级标记 KERN_ERR 后面没有逗号。