Linux RCU 内核同步机制

RCU(Read, Copy, Update)是一组Linux内核API,实现了一种同步机制,允许多个读者与写者并发操作而不需要任何锁,这种同步机制可以用于保护通过指针进行访问的数据。RCU读者只有很低的额外成本,在典型服务器内核配置下甚至是0成本。如果可能有多个写者,写者之间需要使用其他同步机制。除了使用RCU API直接访问指针数据,更多的使用方式是封装RCU API使其用于链表访问。

阅读全文

Linux timer 内核软件定时器

Linux内核中提供有timer软件定时器,可配置精度为1/HZ。同时还提供有高精度软件定时器hrtimer。本文记录低精度软件定时器timer的使用及原理。

阅读全文

Linux generic netlink 自定义内核通信

前文说过将32个netlink协议号中未使用的号码用于自定义内核模块通信并不是一个好主意,更规范的做法是使用generic netlink的方式达成同样的目的。generic netlink是一种netlink协议,被设计为一个通用的协议,用于承载运行于其上的各种用户自定义协议。这里介绍generic netlink的使用方式及其实现原理。

阅读全文

graphviz(dot) file vim 缩进设置

graphviz是一个开源图形可视化软件,使用dot语言以文本形式描述图形,并提供工具将dot文件输出为图片。但如果使用vim编辑dot文件,可能会面临缩进格式错误的情况。主要原因是vim没有识别dot文件中port格式,而是默认按照label的方式缩进到行首。

阅读全文

Linux netlink socket 内核通信

Netlink用于内核与用户空间程序传输信息,同时也可用于用户进程间通信。它包含用户空间下基于socket的标准接口,以及用于内核模块的内核API。iproute2工具包使用该方式从用户空间与内核进行通信。这里介绍netlink的简单使用方式与其实现原理。

阅读全文

Linux kernel thread 内核线程

Linux中无论是用户态进程、线程,还是内核线程,在内核中都使用同样的结构task_struct,可以看出内核都是以任务这个概念对待这些不同名字的事物。至于为什么会有kernel thread或者说内核线程这个词,个人认为应该是因为所有内核线程共享内核空间资源,因此有线程之名。

阅读全文

Linux kernel 链路层帧接收

Linux kernel接收链路层帧时涉及中断部分、软中断部分,具体数据接收过程根据网卡驱动不同有传统的中断方式接收与NAPI方式接收,本文会分析两种方式的具体接收过程及两者的不同之处。

阅读全文

Netfilter 内核数据包过滤框架

Netfilter是linux内核中的数据包过滤框架,2.4版本及其后的内核包含该框架,该框架使数据包过滤、网络地址转换(NAT)和其他数据包修改功能成为可能。Netfilter框架由之前的ipfwadm和ipchains系统改进并重新设计而来,iptables工具与其紧密关联并依赖其在内核完成相应功能。

阅读全文

NFQUEUE 用户态数据包处理

本文部分翻译自Using NFQUEUE and libnetfilter_queue

NFQUEUE是iptables和ip6tables的一种target,用于将数据包委托给用户态应用程序裁决如何处理数据包。用户态应用程序可以使用libnetfilter_queue库连接到该队列获取包含了数据包的内核消息,并必须为数据包做出一个裁决。

阅读全文

Linux kernel module 内核模块

Linux内核模块是一种可以根据需要动态加载和卸载的代码,可以在不重启系统的情况下扩展内核功能。
这里演示一个最简单的内核模块的开发过程。

阅读全文