printk函数
       printk函数在linux内核中定义,功能和标准C库中的printf函数类似。因为内核需要自己的打印函数,又不能依赖于C库,模块在连接到内核之后就可以访问内核的公共符号。其中KERN_ALERT定义了这条消息的优先级。在<linux/kernel.h>中定义了8种记录级别,按照优先级递减的顺序分别是:

  1. KERN_EMERG:用于紧急消息,常常是那些崩溃前的消息<0>
  2. KERN_ALERT:需要立即行动的消息<1>
  3. KERN_CRIT:严重情况<2>
  4. KERN_ERR:错误情况<3>
  5. KERN_WARNING:有问题的警告<4>
  6. KERN_NOTICE:正常情况,但是仍然值的注意<5>
  7. KERN_INFO:信息型消息<6>
  8. KERN_DEBUG:用作调试消息<7>
    如果没有指定优先级的话,那么printk默认使用DEFAULT_MESSAGE_LOGLEVEL优先级,他是在kernel/printk.c中定义的整数。
    #define DEFAULT_MESSAGE_LOGLEVEL 4         //KERN_WARNING
           如果运行以上代码,你并没有发现控制台有打印输出,那么这些内容可能输出到某个系统日志中了,可以使用dmesg | tail -n 10来打印系统日志的最后10行。
    printk函数是位于kernel/printk.h中定义的,以下为该函数的源码
/*** printk - print a kernel message* @fmt: format string** This is printk().  It can be called from any context.  We want it to work.** We try to grab the console_lock.  If we succeed, it's easy - we log the output and* call the console drivers.  If we fail to get the semaphore we place the output* into the log buffer and return.  The current holder of the console_sem will* notice the new output in console_unlock(); and will send it to the* consoles before releasing the lock.** One effect of this deferred printing is that code which calls printk() and* then changes console_loglevel may break. This is because console_loglevel* is inspected when the actual printing occurs.** See also:* printf(3)** See the vsnprintf() documentation for format string extensions over C99.*/asmlinkage int printk(const char *fmt, ...)
{va_list args;int r;#ifdef CONFIG_KGDB_KDBif (unlikely(kdb_trap_printk)) {va_start(args, fmt);r = vkdb_printf(fmt, args);va_end(args);return r;}
#endifva_start(args, fmt);r = vprintk(fmt, args);va_end(args);return r;
}

我们再看linux/kernel.h,发现kernel.h已经将printk.h包含了。

       但是我们最终测试发现,如果不包含这个kernel.h这个头文件依然是可以访问到这个printk这个函数的。有可能是当模块直接使用了内核符号表中的东西。

printk函数相关知识相关推荐

  1. Schedule()函数相关知识

    Schedule()函数最主要作用就是从就绪进程中选择一个优先级最高的进程来代替当前进程运行. 内核抢占基础知识 1.内核抢占概念 当进程位于内核空间,有一个更高优先级的任务出现时,如果该内核支持抢占 ...

  2. 十四、MySQL函数相关知识总结(简单易懂)

    函数 含义:一组预先编译好的SQL语句的集合,理解成批处理语句 提高代码的重用性 简化操作 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率 区别: 存储过程:可以有0个返回,也可以有多个 ...

  3. 【C++笔记】构造函数与析构函数相关知识

    目录 一.构造函数和析构函数 二.构造函数的分类及调用 三.拷贝构造函数调用时机 四.构造函数调用规则 五.深拷贝与浅拷贝 六.初始化列表 七.类对象作为类成员 八.静态成员 每个对象需要有初始设置以 ...

  4. 复习对数函数相关知识

    对数公式是数学中的一种常见公式,如果a^x=N(a>0,且a≠1),则x叫做以a为底N的对数,记做x=log(a)(N),其中a要写于log右下.其中a叫做对数的底,N叫做真数 . 通常将以10 ...

  5. 【三角函数】常用的三角函数相关知识

    常用三角函数 常用三角函数值 常用三角函图像 Ref 常用三角函数 常用三角函数值 常用三角函图像 Ref 常用的三角函数公式 : 常用的公式,很全面 常用的三角函数公式与推导 : 带推导 7个GIF ...

  6. ACM基础知识及算法

    ACM 算法   难度 数据结构 栈 栈     1 单调栈       队列 一般队列     1 优先队列/单调队列     1 循环队列     2 双端队列     2 链表 一般链表     ...

  7. 数学命题初步以及三角函数相关复习

    一,什么叫做命题? 可以判断真假的陈述句叫做命题. 必须满足两个条件:1)陈述句,2)能判断真假 真命题:结论为真 假命题:结论为真 命题的否定:只否定结论 原命题:若p,则q 逆命题:若q,则p 否 ...

  8. acm竞赛要掌握的知识 北大ACM分类 ACM网址大全

    图论 路径问题 0/1边权最短路径 BFS 非负边权最短路径(Dijkstra) 可以用Dijkstra解决问题的特征 负边权最短路径 Bellman-Ford Bellman-Ford的Yen-氏优 ...

  9. 从零开始之驱动发开、linux驱动(六十四、内核调试篇--基础知识2[console的建立])

    上一节我们分析的earlay的printk知识,本节主要分析一下在内核启动后的printk的知识. 主要是通过下面函数实现的 after_dashes = parse_args("Booti ...

最新文章

  1. 与其焦虑成疾,不如静心学习
  2. 查询存在表1但不存在表2的所有数据
  3. 20145202马超 2016-2017-2 《Java程序设计》第一次实验
  4. C#字符串的基本操作
  5. c语言开发破解pdf软件,ARM处理器与C语言开发应用(第2版) PDF
  6. Python实现在当前目录新建目录img, 里面包含100个文件, 100个文件名 各不相同(X4G5.png)
  7. spark调用python程序包_pycharm编写spark程序,导入pyspark包的3中实现方法
  8. python-成都Python课程
  9. 注塑机摆放间距多少合适_请查阅:过滤毛刷摆放参考标准!
  10. 让html的text输入框只能输入数字和1个小数点
  11. 利用html5实现的飞雪效果代码实例
  12. python不解压读取zip压缩包图片
  13. Android Q的多屏幕支持
  14. [深度学习][原创]yolact编译DCNv2错误解决方法
  15. pythonista_Pythonista的假期愿望清单
  16. 最新游戏陪玩源码V2.0升级版/商业版语音聊天系统源码
  17. macOS 开发 - XPC
  18. 为ibus安装极点五笔字库
  19. PostgreSQL学习笔记(更新ing)+c# 使用ef连接数据库postgreSQL
  20. 【毕业设计】 基于单片机的wifi智能远程开关控制

热门文章

  1. Quartz修改JobDetail
  2. 专家建议恢复五一黄金周或者设新长假-全国假日办-五一假期-国家旅游局
  3. java多线程学习(超详细吐血总结)
  4. IBM朱近之:对云计算的十大误解
  5. nodejs中module.exports和exports的区别
  6. IPv6地址的分类与使用
  7. EDA电子设计自动化01--简介
  8. c语言排序(反向快速排序)
  9. 小学五年级计算机课含板书设计,小学五年级下册课文丰碑教学设计和板书
  10. 傅里叶级数与傅里叶变换_Part7_离散傅里叶变换的性质