Linux kernel buffer ring

参考:What are the concepts of “kernel ring buffer”, “user level”, “log level”?

Ring Buffer

原始问题

个人补充:runlevel是指SysV中用于确定OS运行环境的一种技术。不过在CentOS 7.X以后就被淘汰了,老版本服务器上可能还在用。

protection ring指的是X86平台将指令集使用Ring 0、Ring 1、Ring 2、Ring 3四种级别来管理和使用物理服务器硬件。具体参考:Xen虚拟化——简介

回答问题

是的,所有这些都与日志记录有关。 但是,没有一个与runlevel或protection ring有关。

这个问题站在SysV下日志处理角度回答,对于Systemd的情况,道理是相通的,只不过命令换了。

内核将其日志保存在buffer ring中。 这样做的主要原因是系统启动时的日志会被保存,直到syslog daemon有机会启动并收集它们为止。 否则,在syslog daemon启动之前不会有任何日志被记录。 可以使用dmesg命令随时查看该buffer ring中的内容,并且其内容也会在syslog daemon启动时保存到/ var / log / dmesg。 所有不是来自内核的日志都会在生成时发送到syslog daemon,因此它们不会保存在任何buffer中。 内核日志也会在生成时由syslog daemon获取,但它们也会继续保存到buffer ring(这块感觉没啥必要)。

对于SysV,日志使用syslogd这个daemon,它的配置文件是/etc/syslog.conf。

 

 

转载于:https://www.cnblogs.com/kelamoyujuzhen/p/10111760.html

以下是完整的队列操作代码,包括驱动的初始化和退出函数: ``` #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/slab.h> struct msg { int data; int complete; }; struct ring_buffer { int head; int tail; struct msg *data; int size; unsigned int capacity; }; struct ring_buffer *ring_buffer_init(unsigned int capacity) { struct ring_buffer *rbuf = kmalloc(sizeof(struct ring_buffer), GFP_KERNEL); rbuf->capacity = capacity; rbuf->head = rbuf->size = 0; rbuf->tail = capacity - 1; rbuf->data = kmalloc(rbuf->capacity * sizeof(struct msg), GFP_KERNEL); printk(KERN_DEBUG "ring_buffer create successfully!\n"); return rbuf; } int ring_buffer_is_empty(struct ring_buffer *rbuf) { return (rbuf->size == 0); } int ring_buffer_is_full(struct ring_buffer *rbuf) { return (rbuf->size == rbuf->capacity); } void ring_buffer_in(struct ring_buffer *rbuf, struct msg msg) { if (ring_buffer_is_full(rbuf)) { return; } rbuf->tail = (rbuf->tail + 1) % rbuf->capacity; rbuf->data[rbuf->tail] = msg; rbuf->size = rbuf->size + 1; } struct msg ring_buffer_out(struct ring_buffer *rbuf) { struct msg rsv_msg; if (ring_buffer_is_empty(rbuf)) { pr_info("buffer is empty!\n"); rsv_msg.complete = -1; return rsv_msg; } rsv_msg = rbuf->data[rbuf->head]; rbuf->head = (rbuf->head + 1) % rbuf->capacity; rbuf->size = rbuf->size - 1; return rsv_msg; } void destroy_ring_buffer(struct ring_buffer *rbuf) { kfree(rbuf->data); kfree(rbuf); } static int __init my_driver_init(void) { struct ring_buffer *rbuf = ring_buffer_init(10); struct msg msg1 = {1, 0}; struct msg msg2 = {2, 0}; struct msg msg3 = {3, 0}; ring_buffer_in(rbuf, msg1); ring_buffer_in(rbuf, msg2); ring_buffer_in(rbuf, msg3); struct msg out1 = ring_buffer_out(rbuf); struct msg out2 = ring_buffer_out(rbuf); struct msg out3 = ring_buffer_out(rbuf); printk(KERN_DEBUG "out1: %d, out2: %d, out3: %d\n", out1.data, out2.data, out3.data); destroy_ring_buffer(rbuf); return 0; } static void __exit my_driver_exit(void) { printk(KERN_DEBUG "my_driver exit\n"); } module_init(my_driver_init); module_exit(my_driver_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A simple example Linux module."); MODULE_VERSION("0.01"); ``` 上面的代码在驱动初始化函数中创建了一个容量为 10 的环形队列,然后向队列中插入了三个元素,接着连续地从队列中取出三个元素并打印,最后在驱动退出函数中销毁了队列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值