zoukankan      html  css  js  c++  java
  • 2.16.5.内核启动的C语言阶段2

    本节开始按照代码执行路径分析内核的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。

  • 相关阅读:
    HDU 5441 离线处理 + 并查集
    [转载]HDU 3478 判断奇环
    POJ 1637 混合图的欧拉回路判定
    [转载] 一些图论、网络流入门题总结、汇总
    UVA 820 --- POJ 1273 最大流
    [转载 ]POJ 1273 最大流模板
    POJ 3041 -- 二分图匹配
    2014西安现场赛F题 UVALA 7040
    UVA 12549
    割点、桥(一点点更新)
  • 原文地址:https://www.cnblogs.com/Ocean-Star/p/9235980.html
Copyright © 2011-2022 走看看