<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[weixin_45302098的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/weixin_45302098</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; weixin_45302098]]></copyright><item><title><![CDATA[等待队列＜linux/wait.h＞]]></title><link>https://blog.youkuaiyun.com/weixin_45302098/article/details/145457453</link><guid>https://blog.youkuaiyun.com/weixin_45302098/article/details/145457453</guid><author>weixin_45302098</author><pubDate>Thu, 06 Feb 2025 14:10:06 +0800</pubDate><description><![CDATA[在开始枯燥的代码分析之前，我们简单概述下等待队列的实现原理，希望能提起阅读兴趣：1、顾名思义，等待队列是将进程(内核中称之为任务)的代码实现流程放入到一个特殊的链表中，并设计一些操作函数或者宏去管理这个队列；2、这个特殊的独队列称之为数据或数据结构，操作函数或宏称之为方法，其设计思想本质与其他模块一致，方法与数据分离；3、基于这样的设计框架，我们希望wait.h内可以提供一些接口，使得在条件不满足时将进程挂起，不再使用cpu资源，当条件满足时，唤醒挂起的进程；]]></description><category></category></item><item><title><![CDATA[工作队列＜linux/workqueue.h＞]]></title><link>https://blog.youkuaiyun.com/weixin_45302098/article/details/145466206</link><guid>https://blog.youkuaiyun.com/weixin_45302098/article/details/145466206</guid><author>weixin_45302098</author><pubDate>Thu, 06 Feb 2025 14:09:41 +0800</pubDate><description><![CDATA[linux/workqueue.h>通过工作项、工作队列和工作者线程的协同工作，实现了内核中的异步任务处理。内核开发者可以方便地使用工作队列机制，将耗时的操作推迟到专门的内核线程中执行，提高系统的响应性能。理解工作队列机制的底层实现原理和代码细节，对于开发高效稳定的内核模块和驱动程序具有重要意义。希望本文能帮助你更好地理解 Linux 内核工作队列机制，如果在实际使用过程中遇到问题，欢迎在评论区留言交流。]]></description><category></category></item><item><title><![CDATA[环形缓冲区＜ring_buffer.h＞]]></title><link>https://blog.youkuaiyun.com/weixin_45302098/article/details/145463287</link><guid>https://blog.youkuaiyun.com/weixin_45302098/article/details/145463287</guid><author>weixin_45302098</author><pubDate>Thu, 06 Feb 2025 14:09:03 +0800</pubDate><description><![CDATA[以log文件存储为例，为什么内核日志可以存储定长的log信息，同时保障数据都是最新的部分；1、为什么要定长：因为要限定文件大小，否则无限量的log信息会堆满限定的f存储空间；2、为什么要数据是最新部分：因为设备运行一段时间如果出问题后，查看最新的log信息远比刚开机时的log信息更有意义；3、如何实现：定义一个确定大小的连续存储空间-数组，永远从低地址向高地址存储和读取，到数组末尾时再掉回头；4、掉头时有数据覆盖怎么办：覆盖就覆盖了，这就是更新迭代；]]></description><category></category></item><item><title><![CDATA[Linux 内核宏 container_of：原理、应用与妙处]]></title><link>https://blog.youkuaiyun.com/weixin_45302098/article/details/145469219</link><guid>https://blog.youkuaiyun.com/weixin_45302098/article/details/145469219</guid><author>weixin_45302098</author><pubDate>Thu, 06 Feb 2025 14:08:35 +0800</pubDate><description><![CDATA[size_t0->这个宏看起来有些复杂，我们来逐步拆解它的实现原理。指针有效性：在使用 container_of 宏时，必须确保传入的指针是有效的，即该指针确实指向结构体的某个成员，否则可能会导致未定义行为。类型匹配：传入的 ptr 指针的类型必须与结构体成员的类型一致，否则类型检查可能会失败。]]></description><category></category></item><item><title><![CDATA[同步机制＜completion.h＞]]></title><link>https://blog.youkuaiyun.com/weixin_45302098/article/details/145471828</link><guid>https://blog.youkuaiyun.com/weixin_45302098/article/details/145471828</guid><author>weixin_45302098</author><pubDate>Thu, 06 Feb 2025 14:08:14 +0800</pubDate><description><![CDATA[completion.h 通过 struct completion 结构体和一系列函数实现了完成量机制，利用等待队列来管理等待线程，通过 done 字段标记完成量的状态。线程可以等待完成量，直到其他线程完成任务并标记完成量，从而实现线程间的同步。这种机制简单而高效，在 Linux 内核中得到了广泛应用。通过深入理解其底层实现原理和代码细节，我们可以更好地在实际开发中运用完成量机制，解决线程同步问题。]]></description><category></category></item><item><title><![CDATA[内核链表＜linux/list.h＞]]></title><link>https://blog.youkuaiyun.com/weixin_45302098/article/details/145462083</link><guid>https://blog.youkuaiyun.com/weixin_45302098/article/details/145462083</guid><author>weixin_45302098</author><pubDate>Thu, 06 Feb 2025 14:07:37 +0800</pubDate><description><![CDATA[链表在内核中无处不在设计精巧灵活高效，几乎被应用于所有的内核数据结构中巧妙的借用结构体内成员偏移思想获取宿主结构体指针（container_of 宏的实现），从而间接可以获取到主体中的其他数据即使你是app开发者，可以模仿内核链表的实现撰写出适用于自己需求的数据结构，点击查看demoint data;<linux/list.h> 提供了 Linux 内核中双向链表的通用实现，通过 list_head 结构体和一系列操作宏/函数，内核能够高效地管理链表数据。]]></description><category></category></item><item><title><![CDATA[ring_buffer]]></title><link>https://blog.youkuaiyun.com/weixin_45302098/article/details/145316495</link><guid>https://blog.youkuaiyun.com/weixin_45302098/article/details/145316495</guid><author>weixin_45302098</author><pubDate>Thu, 23 Jan 2025 09:51:18 +0800</pubDate><description><![CDATA[优点：实现最基本环形读写，便于理解改造缺点：用于具体存储时需二次封装改造，不及链表灵活。]]></description><category></category></item><item><title><![CDATA[list_buffer]]></title><link>https://blog.youkuaiyun.com/weixin_45302098/article/details/145298781</link><guid>https://blog.youkuaiyun.com/weixin_45302098/article/details/145298781</guid><author>weixin_45302098</author><pubDate>Wed, 22 Jan 2025 10:38:42 +0800</pubDate><description><![CDATA[#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>#define OFFSETOF(type, member) ((size_t)(&((type *)0)->member))
#define CONTAINER_OF(ptr, type, member) ((type *)((size_t)ptr - OFFSETOF(]]></description><category></category></item><item><title><![CDATA[一种CAN通讯矩阵填包算法]]></title><link>https://blog.youkuaiyun.com/weixin_45302098/article/details/127645918</link><guid>https://blog.youkuaiyun.com/weixin_45302098/article/details/127645918</guid><author>weixin_45302098</author><pubDate>Thu, 03 Nov 2022 09:00:12 +0800</pubDate><description><![CDATA[CAN通讯矩阵填包的实现，入参需要填入起始地址、占用的长度、需要填入的值、偏移（若无则填0）、倍率（无则填1）、需要填入的矩阵地址，该接口实现最通用的接口算法，无任何行数和应用场景的限制。如果需要依据具体的协议封装出更上层的接口，可在此通用接口上直接封装，需要代写请私信联系。]]></description><category></category></item></channel></rss>