![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Something in Kernel
win9zz
Life is brief, and then you die, you know?
展开
-
三大链表之struct list_head
在Linux内核中,有一种通用的双向循环链表,构成了各种队列的基础。链表的结构定义和相关函数均在include/linux/list.h中,下面就来全面的介绍这一链表的各种API。struct list_head结构体的定义在linux/types.h中。[cpp] view plain copy print?struct list_head原创 2017-04-04 15:41:18 · 2683 阅读 · 0 评论 -
GENERIC SYSTEM INTERCONNECT SUBSYSTEM
GENERIC SYSTEM INTERCONNECT SUBSYSTEMIntroduction该框架旨在提供标准内核接口,以控制SoC上互连的设置。 这些设置可以是多个互连设备或功能块之间的吞吐量,延迟和优先级。 这可以动态控制,以节省电力或提供最大性能。互连总线是具有可配置参数的硬件,可以根据从各种驱动程序接收的请求在数据路径上设置。 互连总线的示例是芯片组中的各种组件或功能块之间的互...翻译 2019-03-22 00:24:33 · 330 阅读 · 0 评论 -
The seq_file interface
The seq_file interfaceCopyright 2003 Jonathan Corbet <corbet@lwn.net>This file is originally from the LWN.net Driver Porting series athttp://lwn.net/Articles/driver-porting/设备驱动程序(或其他内核组件)有...翻译 2019-03-21 00:50:45 · 373 阅读 · 0 评论 -
linux中 likely与unlikely
看内核时总遇到if(likely( )){}或是if(unlikely( ))这样的语句,最初不解其意,现在有所了解,所以也想介绍一下。likely() 与 unlikely()是内核(我看的是2.6.22.6版本,2.6的版本应该都有)中定义的两个宏。位于/include/linux/compiler.h中,具体定义如下:#define likely(x) __builtin_e转载 2017-05-19 13:46:51 · 1202 阅读 · 0 评论 -
bus_register(待续)
struct subsys_private { struct kset subsys; 定义这个子系统 struct kset *devices_kset; 子系统的“设备”目录 struct list_head interfaces; 相关子系统接口的list struct mutex mutex; 保护设备和接口list的互斥体 struct kset *dri原创 2017-04-06 01:22:17 · 1527 阅读 · 0 评论 -
通知链
在阅读内核源码的时候,到处会看到通知链的身影。从技术上来讲,这并不是一个多么复杂、高深、难懂的部分,说白了就是一个单向链表的插入、删除和遍历等操作。但这部分是由协议栈头号大Boss----Alan Cox亲自主刀,足以说明这个基础特性的重要性,也有很多值得我们学习的地方。内核中通知链的基础文件就两个,头文件include/linux/notifier.h,源文件kernel/notifier.c,转载 2017-04-06 00:58:18 · 1341 阅读 · 0 评论 -
三大链表之klist
前面我们说到过list_head,这是Linux中通用的链表形式,双向循环链表,功能强大,实现简单优雅。可如果您认为list_head就是链表的极致,应该在linux链表界一统天下,那可就错了。据我所知,linux内核代码中至少还有两种链表能占有一席之地。一种就是hlist,一种就是本节要介绍的klist。虽然三者不同,但hlist和klist都可以看成是从list_head中发展出来的,用于特殊原创 2017-04-04 17:59:42 · 1573 阅读 · 0 评论 -
记录生命周期的kref
kref是一个引用计数器,它被嵌套进其它的结构中,记录所嵌套结构的引用计数,并在计数清零时调用相应的清理函数。kref的原理和实现都非常简单,但要想用好却不容易,或者说kref被创建就是为了跟踪复杂情况下地结构引用销毁情况。所以这里先介绍kref的实现,再介绍其使用规则。 kref的头文件在include/Linux/kref.h,实现在lib/kref.c。闲话少说,上代码。转载 2017-04-04 17:42:30 · 1092 阅读 · 0 评论 -
barrier 和 smp_mb
优化屏障 编译器编译源代码时,会将源代码进行优化,将源代码的指令进行重排序,以适合于CPU的并行执行。然而,内核同步必须避免指令重新排序,优化屏障(Optimization barrier)避免编译器的重排序优化操作,保证编译程序时在优化屏障之前的指令不会在优化屏障之后执行。 Linux用宏barrier实现优化屏障,gcc编译器的优化屏障宏定义列出如下转载 2017-04-04 17:32:31 · 2569 阅读 · 0 评论 -
原子操作atomic_t
所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念。 原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作。 原子操作主要用于实原创 2017-04-04 17:05:23 · 2110 阅读 · 0 评论