请教一个弱智的内核编程问题

内核编译和嵌入式产品的设计与开发
xialin7712
帖子: 1
注册时间: 2011-09-04 18:04

Re: 请教一个弱智的内核编程问题

#16

帖子 xialin7712 » 2011-09-04 18:13

printk 是内核的调用接口,它在系统init之前,把消息写往控制台,但是一旦系统init之后,便改写到系统的日志中。因为init之后用户所能够感受到的进程 (拥有控制台)都是用户空间的进程,而用户空间的进程是无法反映内核数据的,除非通过一定的方式(如proc文件,netlink...)向内核申请相关的信息,并在用户空间反映出来.这样做的好处不言而喻的,如果内核在任何的时候都可以写信息到控制台,那控制台一定会被这样的信息淹没,而无法工作。

系统初始化进程(pid=0),工作在内核空间,它在启动init进程(pid=1)之前,把所有的信息通过printk内核方法写往控制台.printk 把欲打印的日志消息,首先首先保存到内核的日志缓冲区之中.而后申请控制台的信号量,如果申请到,则调用控制台写方法,写控制台.而此时系统中并没有打开控制台,故而初始化进程,可以申请到控制台的信号量.当系统初始化到达一定阶段后,便会启动init进程(pid=1),并在此之前打开控制台,控制台的信号量增加,此后,printk便无法申请到信号量,而无法写数据到控制台.转而通过和用户空间的进程协作把内核的日志消息写到系统道的日志文件之中.-------前台进程通过sys_log系统调用读出,并根据配置文件sys_conf写向相应的日志文件或/var/log/messages文件中。
================================================

printk输出看不见不是因为init,和init没有关系,如果你在单用户模式下,即使系统启动完毕了(init已生成),printk仍然会输出到控制台的,printk直接调用控制台驱动程序的write函数,根本不需要打开文件->读写文件这样的步骤。看不见的原因是:在x下当前终端不是/dev/console而是/dev/pts/*(在字符界面的多用户模式下是/dev/tty*),因此printk的输出虽然送给了console,但用户却看不到(多用户模式下,console不作为进程的控制终端)。
回复