0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux内核pr_xx()函数封装

麦辣鸡腿堡 来源:嵌入式Linux充电站 作者:Vincent 2023-09-27 15:58 次阅读

pr_xx( )封装

在使用printk的时候需要手动添加输出等级KERN_INFO、KERN_WARNING等,这样还是有些麻烦。因此,Linux内核也对printk进行了进一步的封装。

Linux内核将每一个输出等级封装为pr_xx()函数,例如,输出等级KERN_INFO封装为pr_info(),输出等级KERN_WARNING封装为pr_warn()。具体如下:

#define pr_emerg(fmt, ...) 
 printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)

#define pr_alert(fmt, ...) 
 printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)

#define pr_crit(fmt, ...) 
 printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)

#define pr_err(fmt, ...) 
 printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)

#define pr_warn(fmt, ...) 
 printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)

#define pr_notice(fmt, ...) 
 printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)

#define pr_info(fmt, ...) 
 printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)

#define pr_err(fmt, ...) 
 printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)

这里对输出等级为KERN_DEBUG的封装是比较特殊的,因为debug等级比较常用,内核对pr_debug()分为了三种情况:

如果设置了 CONFIG_DYNAMIC_DEBUG,则此pr_debug()扩展为 dynamic_pr_debug(),主要用于 动态输出 。否则,如果定义了 DEBUG宏,则它等同于具有 KERN_DEBUG 日志级别的 printk。 如果未定义 DEBUG,则它什么都不做

pr_debug()的定义如下:

/* If you are writing a driver, please use dev_dbg instead */
#if defined(CONFIG_DYNAMIC_DEBUG) || 
 (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE))
#include < linux/dynamic_debug.h >

/**
 * pr_debug - Print a debug-level message conditionally
 * @fmt: format string
 * @...: arguments for the format string
 *
 * This macro expands to dynamic_pr_debug() if CONFIG_DYNAMIC_DEBUG is
 * set. Otherwise, if DEBUG is defined, it's equivalent to a printk with
 * KERN_DEBUG loglevel. If DEBUG is not defined it does nothing.
 *
 * It uses pr_fmt() to generate the format string (dynamic_pr_debug() uses
 * pr_fmt() internally).
 */
#define pr_debug(fmt, ...)   
 dynamic_pr_debug(fmt, ##__VA_ARGS__)
#elif defined(DEBUG)
#define pr_debug(fmt, ...) 
 printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#else
#define pr_debug(fmt, ...) 
 no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#endif
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1372

    浏览量

    40275
  • Linux
    +关注

    关注

    87

    文章

    11292

    浏览量

    209315
  • 函数
    +关注

    关注

    3

    文章

    4327

    浏览量

    62567
收藏 人收藏

    评论

    相关推荐

    Linux内核中断设计与实现

    裸机编程中使用中断比较麻烦,需要配置寄存器、使能IRQ等等。而在Linux驱动编程中,内核提供了完善的终端框架,只需要申请中断,然后注册中断处理函数即可,使用非常方便。
    发表于 07-29 08:57 785次阅读

    Linux内核学习笔记:printk调试

    很多内核开发者喜欢的调试工具是printk,在Linux内核中,使用printk()函数来打印信息,它与C库的printf()函数类似。
    发表于 06-01 15:14 1136次阅读

    Linux内核教程

    本章学习目标掌握LINUX内核版本的含义理解并掌握进程的概念掌握管道的概念及实现了解内核的数据结构了解LINUX内核的算法掌握
    发表于 04-10 16:59 0次下载

    Linux内核源代码

    Linux内核源代码本章讲述在L i n u x内核源码中,应该从何处开始查找特定的内核函数。本书并不要求读者具有C语言编程能力,也不要求读
    发表于 02-09 15:24 36次下载

    linux内核kernel-api

    linux内核kernel-api,不知道从哪儿找的了,但是你如果想要做内核编程,这是一部api函数详尽的工具书!!!五星推荐
    发表于 10-30 17:16 19次下载

    基于Android的Linux内核的电源管理

    Early Suspend和Late Resume是Android在标准Linux的基础上增加的一项特性。当用户空间的向内核请求进入suspend时,这时候会先进入early suspend状态,驱动程序可以注册early suspend的回调
    发表于 04-24 13:47 1072次阅读
    基于Android的<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的电源管理

    linux内核是什么_linux内核学习路线

    Linux内核是一个操作系统(OS)内核,本质上定义为类Unix。它用于不同的操作系统,主要是以不同的Linux发行版的形式。Linux
    发表于 09-16 15:49 2637次阅读

    linux内核参数设置_linux内核的功能有哪些

    本文主要阐述了linux内核参数设置及linux内核的功能。
    发表于 09-17 14:40 1371次阅读
    <b class='flag-5'>linux</b><b class='flag-5'>内核</b>参数设置_<b class='flag-5'>linux</b><b class='flag-5'>内核</b>的功能有哪些

    快速理解什么是Linux内核以及Linux内核的内容

    01 前言 本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用与功能,以便于读者能快速理解什么是Linux
    的头像 发表于 10-21 12:02 4286次阅读
    快速理解什么是<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>以及<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的内容

    Linux内核GPIO操作函数的详解分析

    本文档的主要内容详细介绍的是Linux内核GPIO操作函数的详解分析免费下载。
    发表于 01-22 16:58 28次下载

    Linux内核热补丁安全隐患的探索

    Linux 内核热补丁可以修复正在运行的 linux 内核,是一种维持线上稳定性不可缺少的措施,现在比较常见的比如 kpatch 和 livepatch。
    的头像 发表于 10-11 11:54 1734次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>热补丁安全隐患的探索

    linux内核中do_initcalls函数的执行逻辑分析

    linux内核启动过程中,会向终端打印出很多的日志信息,从这些信息中可以得到许多内核的行为。
    的头像 发表于 01-13 09:20 1174次阅读

    Linux内核模块参数传递与sysfs文件系统

    Linux应用开发中,为使应用程序更加灵活地执行用户的预期功能,我们有时候会通过命令行传递一些参数到main函数中,使得代码逻辑可以依据参数执行不同的任务。同样,Linux内核也提供了
    发表于 06-07 16:23 2119次阅读

    万千设备,linux内核如何知道?

    linux内核设备的注册由device_register()函数完成,这个函数linux设备驱动模型的核心
    的头像 发表于 07-12 08:52 836次阅读
    万千设备,<b class='flag-5'>linux</b><b class='flag-5'>内核</b>如何知道?

    Linux内核如何使用结构体和函数指针?

    我将结合具体的Linux内核驱动框架代码来展示Linux内核如何使用结构体和函数指针。
    的头像 发表于 09-06 14:17 1017次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>如何使用结构体和<b class='flag-5'>函数</b>指针?