printk日志级别以及Linux内核atomic_set介绍

这篇具有很好参考价值的文章主要介绍了printk日志级别以及Linux内核atomic_set介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、printk 介绍

printk 是 Linux 内核中用于输出信息的函数,它可以将信息输出到各种不同的设备和位置,例如控制台、串口、日志文件等。

printk 函数的输出会被写入内核的环形缓冲区中,并由一个或多个后台进程将其传输到目标设备或位置。可以使用 dmesg 命令来查看内核环形缓冲区中的输出消息。此外,也可以将 printk 输出重定向到其他设备或位置,例如串口或日志文件。

需要注意的是,由于 printk 函数可能会在中断上下文或原子上下文中被调用,因此需要遵循一些特殊规则来确保其安全性和可用性。例如,在中断上下文中只能使用 printk 函数的非阻塞版本,而在原子上下文中则不能使用 printk 函数。此外,为了避免死锁等问题,还需要谨慎地使用 printk 函数以及与之相关的锁机制。

(1)printk函数原型介绍

printk 是 Linux 内核中用于输出信息的函数。它的基本语法如下:

int printk(const char *fmt, ...);

其中,fmt 是格式化字符串,它指定了输出信息的格式,下面会介绍;… 表示可变参数列表,它可以传递多个参数给格式化字符串。

(2)printk日志级别介绍

在Linux内核中,printk函数用于在内核中输出日志信息。printk函数支持不同的日志级别来区分日志的重要性和优先级。

这些日志级别的定义位于头文件<linux/kernel.h>中。可以在Linux源代码树中的/include/linux/kernel.h路径下找到该头文件。

常用的日志级别包括:

  • KERN_EMERG:紧急情况,系统无法使用;
  • KERN_ALERT:需要立即采取行动;
  • KERN_CRIT:临界状态,需要注意;
  • KERN_ERR:错误信息;
  • KERN_WARNING:警告信息;
  • KERN_NOTICE:普通但重要的信息;
  • KERN_INFO:一般信息;
  • KERN_DEBUG:调试信息。

可以通过在格式化字符串前加上相应的日志级别前缀来指定输出的日志级别。

举个栗子:

printk(KERN_WARNING "This is a warning message\n");

(3)举个栗子

printk_test.c:

/*************************************************************************
    > File Name: printk_test.c
    > Author: WangDengtao
    > Mail: 1799055460@qq.com 
    > Created Time: 2023年04月02日 星期日 17时59分29秒
 ************************************************************************/

#include <linux/module.h>
#include <linux/kernel.h>

// 打印普通信息(info)
#define INFO(fmt, ...) \
    printk(KERN_INFO "INFO: " fmt "\n", ##__VA_ARGS__)

static int __init my_module_init(void)
{
	printk(KERN_INFO"Enter");
    printk(KERN_DEBUG "Debugging information!\n");
    printk(KERN_NOTICE "Common but important information!\n");
    printk(KERN_WARNING "Warning message!\n");
    printk(KERN_ERR "Error message!\n");
    printk(KERN_CRIT "Critical states, you need to pay attention!\n");
    printk(KERN_ALERT "Immediate action is needed!\n");
    printk(KERN_EMERG "GIn an emergency, the system is unavailable!\n");
    INFO("General Information!");

    return 0;
}

static void __exit my_module_exit(void)
{
	INFO("Exit");
}

module_init(my_module_init);
module_exit(my_module_exit);

/*添加LICENSE和作者信息,是来告诉内核,该模块带有一个自由许可证;没有这样的说明,在加载模块的时内核会“抱怨”.*/
MODULE_LICENSE("Dual BSD/GPL");//许可 GPL、GPL v2、Dual MPL/GPL、Proprietary(专有)等,没有内核会提示.
MODULE_AUTHOR("WangDengtao");//作者
MODULE_VERSION("V1.0");//版本

Makefile:

KERNAL_DIR ?= /lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
obj-m := printk_test.o

all:
	$(MAKE) -C $(KERNAL_DIR) M=$(PWD) modules
	@make clear

clean:
	@rm -f *.ko

clear:
	@rm -f *.o *.cmd *.mod *.mod.c
	@rm -rf *~ core .depend .tmp_versions Module.symvers modules.order -f
	@rm -f .*ko.cmd .*.o.cmd .*.o.d
	@rm -f *.unsigned

make之后就可以看见我们的.ko驱动文件了。
安装卸载驱动:

wangdengtao@wangdengtao-virtual-machine:~/wangdengtao/driver/x86$ sudo insmod printk_test.ko 
wangdengtao@wangdengtao-virtual-machine:~/wangdengtao/driver/x86$ sudo rmmod printk_test

查看:

wangdengtao@wangdengtao-virtual-machine:~/wangdengtao/driver/x86$ sudo dmesg | tail -10
[ 4993.976274] Enter
[ 4993.976277] Debugging information!
[ 4993.976278] Common but important information!
[ 4993.976278] Warning message!
[ 4993.976279] Error message!
[ 4993.976281] Critical states, you need to pay attention!
[ 4993.976282] Immediate action is needed!
[ 4993.976282] GIn an emergency, the system is unavailable!
[ 4993.976283] INFO: General Information!
[ 4997.412881] INFO: Exit

printk,# IGKBoard(imx6ull)驱动开发,linux,驱动开发,c语言,物联网,嵌入式硬件
宏定义的INFO已经有’\n’了,所以就不需要了。


二、atomic_set 介绍

包含的头文件:

#include <asm/atomic.h>

(1)atomic_set 函数原型介绍

函数 atomic_set() 的功能是将原子类型的变量v的值设置为i。

static inline void atomic_set(atomic_t * v, int i)
  • v:原子类型变量,该参数一般传递一个指针;
  • 整型值,原子类型变量的值将被设置为该值;
  • 函数atomic_set()没有返回值。

原子类型 atomic_t

typedef struct {
        int counter;
} atomic_t;

counter 为一个int变量的计数器。

(2)举个栗子

首先定义一个原子类型my_atomic,然后调用函数atomic_set()将其值设置为5,并通过函数atomic_read()将原子类型my_atomic的counter字段读出。由输出信息可知,调用atomic_set()后,原子类型的值由0变为了5。

atomic_set_test.c:

/*************************************************************************
    > File Name: atomic_set_test.c
    > Author: WangDengtao
    > Mail: 1799055460@qq.com 
    > Created Time: 2023年04月02日 星期日 19时12分55秒
 ************************************************************************/

#include <linux/types.h>
#include <linux/init.h>
#include <linux/module.h>

atomic_t my_atomic;
static int __init atomic_set_init(void)
{
    int i = 5;
    printk("before atomic_set, my_atomic.counter = %d\n", atomic_read(&my_atomic));
    atomic_set(&my_atomic, i);
    printk("after atomic_set, my_atomic.counter = %d\n", atomic_read(&my_atomic));
    return 0;
}
static void __exit atomic_set_exit(void)
{
    printk("exit!\n");
}

module_init(atomic_set_init);
module_exit(atomic_set_exit);

/*添加LICENSE和作者信息,是来告诉内核,该模块带有一个自由许可证;没有这样的说明,在加载模块的时内核会“抱怨”.*/
MODULE_LICENSE("Dual BSD/GPL");//许可 GPL、GPL v2、Dual MPL/GPL、Proprietary(专有)等,没有内核会提示.
MODULE_AUTHOR("WangDengtao");//作者
MODULE_VERSION("V1.0");//版本

Makefile:

KERNAL_DIR ?= /lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd)
obj-m := atomic_set_test.o

all:
	$(MAKE) -C $(KERNAL_DIR) M=$(PWD) modules
	@make clear

clean:
	@rm -f *.ko

clear:
	@rm -f *.o *.cmd *.mod *.mod.c
	@rm -rf *~ core .depend .tmp_versions Module.symvers modules.order -f
	@rm -f .*ko.cmd .*.o.cmd .*.o.d
	@rm -f *.unsigned
wangdengtao@wangdengtao-virtual-machine:~/wangdengtao/driver/x86$ sudo insmod atomic_set_test.ko  
wangdengtao@wangdengtao-virtual-machine:~/wangdengtao/driver/x86$ sudo rmmod atomic_set_test 
wangdengtao@wangdengtao-virtual-machine:~/wangdengtao/driver/x86$ sudo dmesg | tail -3
[ 9410.583005] before atomic_set, my_atomic.counter = 0
[ 9410.583029] after atomic_set, my_atomic.counter = 5
[ 9420.932523] exit!

printk,# IGKBoard(imx6ull)驱动开发,linux,驱动开发,c语言,物联网,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-751413.html


到了这里,关于printk日志级别以及Linux内核atomic_set介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python爬虫——scrapy_日志信息以及日志级别

    日志级别(由高到低) CRITICAL: 严重错误 ERROR: 一般错误 WARNING: 警告 INFO: 一般警告 DEBUG: 调试信息 默认的日志等级是DEBUG 只要出现了DEBUG或者DEBUG以上等级的日志,那么这些日志将会打印 settings.py文件设置: 默认的级别为DEBUG,会显示上面所有的信息 LOG_FILE:将屏幕显

    2024年02月11日
    浏览(35)
  • Linux 日志级别

    ` 本教程的目的是了解各种 linux 内核日志级别、它们的组织方式,以及我们如何根据消息的严重性设置应在控制台上显示哪些消息。 Linux 内核日志文件的管理是服务器管理的一个重要方面:日志可以简单地通知我们守护程序的状态,或者显示关键消息或警告。在本教程中,我

    2024年02月14日
    浏览(24)
  • linux pstore 存储内核崩溃日志

    备注:   参考博客:   (1)Linux pstore 实现自动“抓捕”内核崩溃日志   (2)1-Linux 保存kernel panic信息到flash 实际项目是嵌入式linux环境,内核为linux-4.19版本,一直想实现panic/oops等log信息存放在spinor/spinand的设备的功能,便于分析相关的异常log。直至看到 《Linux pst

    2024年02月01日
    浏览(30)
  • Linux启动过程以及7种运行级别

    Linux启动需要经历一些步骤,这些步骤确保系统能够在各种不同的硬件和配置条件下可靠地启动和运行,并且具有足够的灵活性以适应不同的使用场景和需求,具体步骤如下: BIOS/UEFI初始化(硬件初始化): 执行基本输入输出系统(BIOS)或统一可扩展接口(UEFI)中的初始化程序。

    2024年04月26日
    浏览(18)
  • 【博客566】Linux内核系统日志查看方式汇总

    当出现一些网络异常或者程序异常,但是linux系统各项性能指标都正常时,有可能是一些内核异常导致的服务异常 1、系统启动后的信息和错误日志: cat /var/log/message 2、守护进程启动和停止相关的日志消息 cat /var/log/boot.log 3、系统异常日志 cat /var/log/syslog cat /var/log/kern journa

    2023年04月17日
    浏览(30)
  • 深入了解Linux下的dmesg指令:查看系统内核日志的利器

    简介: 在Linux系统中,了解系统的内核信息和故障诊断是至关重要的。而dmesg指令就是一个强大的工具,它可以帮助我们查看系统内核的日志信息,了解系统的运行状态和故障原因。本篇博客将以通俗易懂的方式,详细解析dmesg指令的功能和用法,并提供示例代码和参考链接,

    2024年02月08日
    浏览(45)
  • Linux 内核线程启动以及内核调用应用层程序

    #include linux/kthread.h //内核线程头文件   static task_struct *test_task; test_task = kthread_run(thread_function, NULL, \\\"test_thread_name\\\"); if(IS_ERR(test_task)) {         pr_err(\\\"test_thread_name create failn\\\"); } static int thread_function(void *arg) {     char *envp[3];     char *argv[3];     int ret= 0;     argv[0] = \\\"/bin/sh\\\";  

    2024年02月12日
    浏览(37)
  • 【Linux内核解剖】内核问题之softlockup以及应对之法

    操作系统是计算机硬件和应用程序之间的接口,它负责管理和调度系统资源,以实现高效、稳定和安全的运行。Linux内核是Linux操作系统的核心组件,负责实现操作系统的基本功能。 在日常使用中,Linux内核可能会遇到各种故障,导致系统性能下降或无法正常工作。为了排查和

    2024年02月03日
    浏览(18)
  • 【linux驱动开发】在linux内核中注册一个杂项设备与字符设备以及内核传参的详细教程

    开发环境: windows + ubuntu18.04 + 迅为rk3568开发板 相较于字符设备,杂项设备有以下两个优点: 节省主设备号:杂项设备的主设备号固定为 10,在系统中注册多个 misc 设备驱动时,只需使用子设备号进行区分即可。 使用简单:相比如普通的字符设备驱动, misc驱动只需要将基本信

    2024年01月21日
    浏览(36)
  • Linux 查看内核以及系统版本的3种方法

    uname命令显示多个系统信息,包括Linux内核体系结构,名称版本和发行版。 查看Linux内核版本,输入以下命令: uname -a uname -srm uname -r 4.18.0-348.el8.x86_64就是内核版本,其中: 4 内核版本 18 主修订版本 0-348 次要修订版本 hostnamectl 是 systemd 的一部分,用于查询和更改系统主机名。

    2024年03月10日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包