本节开始按照代码执行路径分析内核的C阶段。本节课主要讲了printk函数的工作原理和内核初始化打印出banner信息的部分。
参考:http://blog.chinaunix.net/uid-20543672-id-3157283.html

2.16.5.1、杂碎

(1)smp。smp就是对称多处理器(其实就是我们说的多核心CPU)
(2)lockdep。锁定依赖,是一个内核调试模块,处理内核自旋锁死锁问题相关的。
(3)cgroup。control group,内核提供的一种来处理进程组的技术。

2.16.5.2、打印内核版本信息

(1)代码位于:kernel/init/main.c中的572行

(2)printk函数是内核中用来从console打印信息的,类似于应用层编程中的printf。内核编程时不能使用标准库函数,因此不能使用printf,其实printk就是内核自己实现的一个printf。
(3)printk函数的用法和printf几乎一样,不同之处在于可以在参数最前面用一个宏来定义消息输出的级别。为什么要有这种级别?主要原因是linux内核太大了,代码量太多,里面的printk打印信息太多了。如果所有的printk都能打印出来而不加任何限制,则最终内核启动后得到海量的输出信息。
(4)为了解决打印信息过多,无效信息会淹没有效信息这个问题,linux内核的解决方案是给每一个printk添加一个打印级别。级别定义0-7(注意编程的时候要用相应的宏定义,不要直接用数字)分别代表8种输出的重要性级别,0表示最重要,7表示最不重要。我们在printk的时候自己根据自己的消息的重要性去设置打印级别。
(5)linux的控制台监测消息的地方也有一个消息过滤显示机制,控制台实际只会显示级别比我的控制台定义的级别高的消息。譬如说控制台的消息显示级别设置为4,那么只有printk中消息级别为0-3(也可能是0-4)的才可以显示看见,其余的被过滤掉了。
(6)linux_banner的内容解析。

在编译后的内核里面搜索:》》grep “UTS_RELEASE” * -nR
LINUX_COMPILE_BY、LINUX_COMPILE_HOST、 LINUX_COMPILER、UTS_VERSION也是在编译linux kernel的时候伸出的,也可以用grep xxx -nR命令搜索。 其文件是:include/linux/compile.h。

posted on 2018-06-27 21:05  Ocean&Star  阅读(164)  评论(0编辑  收藏  举报