落尘纷扰的专栏

在现实中守护程序员内心的一方净土

Linux内核中负责回写脏页的线程

内核版本 3.0 和 3.4.35 (不同内核版本的回写机制不同哦~) Linux内核里负责回写脏页的线程称为flusher线程,它们以“flush-”+“设备名”来命名,例如”[flush-8:64]”(这里设备名是指用设备号拼接的字符串)。 在BDI(即backing device inf...

2018-05-08 23:25:04

阅读数 520

评论数 0

Linux内核中的内存屏障

编译器有时会对代码做一些优化,例如尝试在保证程序执行正确的前提下修改指令顺序或优化ldr/str指令,让程序执行地更快。但是编译器毕竟不能完全猜透人的心思,有时候它做的优化会导致程序运行不符我们的预期。 因此,内核中提供了一些额外的函数,可以插在某段代码里,告诉编译器不要在这里做指令优化。这些函...

2018-04-30 19:07:16

阅读数 285

评论数 0

Linux内核中的page migration和compaction机制简介

我们知道buddy容易产生内存碎片,内核中可以通过给页面设置迁移类型以及compaction机制来预防和处理内存碎片。 内存页主要有下面三种类型: 1.可移动的(movable)。用户态申请。 2.可回收的(reclaimable)。文件系统的cache。 3.不可移动(unmovable...

2018-04-06 18:31:55

阅读数 955

评论数 0

Linux内核中的skb_queue_splice_tail_init函数

skb_queue_splice_tail_init()函数用于将链表a连接到链表b上,形成一个新的链表b,并将原来a的头变成空链表。 其实现如下: /** * skb_queue_splice_tail - join two skb lists and reinitialise th...

2018-04-06 13:26:00

阅读数 381

评论数 0

Linux内核中的锁

1. 为什么要保证原子性 处理器分两种:cisc(复杂指令集,可以直接在内存上进行操作,如x86,一条汇编指令可以原子的完整读内存、计算、写内存)和rics(精简指令集,所有操作都必须是在CPU内部进行。所以你想给内存某个变量做加法,你要先用load指令把内存load到CPU的寄存器、再执行ad...

2018-03-07 00:05:34

阅读数 1053

评论数 0

Linux内存管理 —— DMA和一致性缓存

1. 出现内存不一致的原因 CPU写内存的时候有两种方式: 1. write through: CPU直接写内存,不经过cache。 2. write back: CPU只写到cache中。cache的硬件使用LRU算法将cache里面的内容替换到内存。通常是这种方式。 DMA可以完成从内...

2018-03-06 18:34:30

阅读数 3040

评论数 0

Linux内存管理 —— 文件系统缓存和匿名页的交换

1. swap的含义 在Linux里swap有两个意思: 1. 动词:交换。内存和磁盘的颠簸行为。 2. 名词:硬盘的swap分区。 没有文件背景的页面,即匿名页(anonymous page),如堆,栈,数据段等,不是以文件形式存在,因此无法和磁盘文件交换,但可以通过硬盘上划分额外的sw...

2018-03-06 18:27:22

阅读数 2985

评论数 0

Linux内存管理 —— 进程的虚拟地址空间和VSS

1. 进程虚拟地址空间 进程的虚拟地址空间记录在其task_struct结构的指针成员mm中(struct mm_struct),这是用户态进程才有的,里面包含pgd、代码段、堆、栈地址等信息。(kernel不需要mm,因为kernel不需要引用动态库,内核线程有自己的栈空间,虚拟地址映射关系也...

2018-03-06 17:47:07

阅读数 397

评论数 0

Linux内存管理 —— 内核态和用户态的内存分配方式

1. 使用buddy系统管理ZONE 我的这两篇文章buddy系统和slab分配器已经分析过buddy和slab的原理和源码,因此一些细节不再赘述。 所有zone都是通过buddy系统管理的,buddy system由Harry Markowitz在1963年提出。buddy的工作方式我就不说...

2018-03-06 17:36:04

阅读数 2660

评论数 0

Linux内存管理 —— 为buddy做准备:MMU, TLB, ZONE

本文都是假设系统是32位,页大小为4KB,基于ARM架构(不过和体系结构相关的内容不多)。 1. 了解MMU 在启用MMU的Linux内核中,CPU是通过虚拟地址来访问物理内存的。MMU(Memory Management Unit),即内存管理单元,它集成在CPU中,负责虚拟地址到物理地...

2018-03-06 17:12:32

阅读数 361

评论数 0

Linux协议栈——compare_ether_addr_64bits函数分析

从陈老哥的博文中,获得一种新体验。在学习kernel代码的时候,不仅要注重其内在的流程和架构,也可以多多关注一下代码的实现细节,从小的地方去学习编程之道。今天以一个小函数compare_ether_addr_64bits,作为一个尝试。static inline unsigned compare_...

2017-12-29 23:35:28

阅读数 231

评论数 0

PPPoE收发包过程分析

路由器中的LAN/WAN口都是通过以太网(ether)设备来收发包的,而在WAN口进行了PPPoE拨号后,ifconfig会发现多出一个ppp0,这个设备是干什么用的呢? 实际上,这个设备是内核的ppp模块为方便pppoe等协议收发包用的,有了这个设备,你就可以将路由表改一改,将发往WAN口的数...

2017-12-29 23:26:39

阅读数 867

评论数 0

Linux内核中的kobject和kset介绍

本文会围绕kobject、ktype和kset三个概念进行介绍。kobject在内核中应用最多的就是设备驱动模型————总线、设备、驱动、类的管理都使用了kobject,但是kobject并不只为设备驱动模型服务,它是内核中的通用对象模型,用来为内核中各部分的对象管理提供统一视图,其实现在内核的l...

2017-09-17 21:28:03

阅读数 1484

评论数 0

Linux字符设备驱动

1. Linux设备类型Linux内核中的设备可分为三类:字符设备、块设备和网络设备。 字符设备(Character device):适合面向字符的数据交换,因其数据传输量较低。对这种设备的读写是按字符进行的,而且这些字符是连续地形成一个数据流。他不具备缓冲区,所以对这种设备的读写是实时的,如终...

2017-08-27 18:36:35

阅读数 880

评论数 0

Linux 虚拟文件系统(VFS)介绍

1. 通用文件模型Linux内核支持装载不同的文件系统类型,不同的文件系统有各自管理文件的方式。Linux中标准的文件系统为Ext文件系统族,当然,开发者不能为他们使用的每种文件系统采用不同的文件存取方式,这与操作系统作为一种抽象机制背道而驰。为支持各种文件系统,Linux内核在用户进程(或C标准...

2016-05-27 21:40:20

阅读数 6872

评论数 2

linux内核中打印栈回溯信息 - dump_stack()函数分析

当内核出现比较严重的错误时,例如发生Oops错误或者内核认为系统运行状态异常,内核就会打印出当前进程的栈回溯信息,其中包含当前执行代码的位置以及相邻的指令、产生错误的原因、关键寄存器的值以及函数调用关系等信息,这些信息对于调试内核错误非常有用。

2015-05-08 21:19:32

阅读数 10461

评论数 0

linux内核中的likely()和unlikely()宏的作用

在看linux内核代码的时候,经常会看到likely(x)和unlikely(x)宏的使用。那这两个宏有什么作用呢? 这两个宏在内核中的定义如下: # define likely(x) __builtin_expect(!!(x), 1) # define unlikely(x) __builti...

2015-04-10 00:16:17

阅读数 9642

评论数 0

Linux协议栈-netfilter(5)-iptables

iptables是用户态的配置工具,用于实现网络层的防火墙,用户可以通过iptables命令设置一系列的过滤规则,来截获特定的数据包并进行过滤或其他处理。 iptables命令通过与内核中的netfilter交互来起作用。我们知道netfilter通过挂在每个hook点上的hook函数来过滤数据包...

2015-04-04 22:36:15

阅读数 3285

评论数 0

Linux协议栈-netfilter(4)-期望连接

传统的conntrack和NAT处理只对IP层和传输层头部进行转换处理,但是一些应用层协议,在协议数据报文中包含了地址信息。为了使得这些应用也能透明地完成NAT转换,NAT使用一种称作ALG的技术,它能对这些应用程序在通信时所包含的地址信息也进行相应的NAT转换。 例如:对于FTP协议的PORT/...

2015-04-04 22:18:18

阅读数 3109

评论数 0

Linux协议栈-netfilter(3)-NAT

本文对netfilter中NAT部分的源码进行分析,读者需要先对NAT的基本概念有一个大致了解。1. NAT模块的初始化NAT模块的初始化过程主要是初始化一些全局变量以及注册NAT相关的hook函数。在下面nf_nat_init()函数和nf_nat_standalone_init()函数的流程图...

2015-04-04 18:45:22

阅读数 2088

评论数 0

提示
确定要删除当前文章?
取消 删除
关闭
关闭