- 博客(22)
- 收藏
- 关注
原创 保存中断现场和恢复中断现场的代码分析
中断发生后,内核会先保存中断现场,随后再调用中断控制器驱动设置的中断处理入口函数,在中断处理完成后,内核又会恢复中断现场。接下来的篇幅中,将分析arm的底层中断代码,感受一下保存中断和恢复中断现场的过程。
2025-04-19 13:58:57
445
原创 内核处理中断的基本过程
最近阅读了一些中断相关的代码,趁热打铁,把自己的浅显的理解记录下来。我们知道,使用中断的驱动程序或者内核模块在初始化的时候通常会调用或者之类的函数来向内核请求中断,并注册中断处理回调。当中断发生后,内核就会调用驱动或者内核注册的回调函数。在我们能够请求中断前,内核会执行许多中断相关的初始化动作,比如扫描设备树中的中断控制器节点,初始化中断控制器,创建数据结构用于管理控制器下的中断。另外内核还会扫描设备树中的各个节点,解析它们使用的中断,映射中断创建中断描述符用于记录中断相关的信息。
2025-04-18 23:07:42
514
原创 网卡驱动往网络设备层输送数据包的过程
中断触发收包流程,支持NAPI的驱动会直接调用来调度。不支持NAPI的驱动会读取网卡数据缓冲区构造sk_buff并调用netif_rx来将数据包缓存到积压队列,同时netif_rx会调度PERCPU的backlog和netif_rx都会唤醒软中断,在硬件中断处理函数退出时软中断处理函数将被调用。软中断处理函数中逐个处理链表上的,调用它们的poll回调。如果是由网卡驱动构造的poll回调中通常会读取网卡的数据缓冲区,构造sk_buff并通过函数将数据包送往上层协议栈。如果是由内核构造的poll。
2025-03-09 22:39:10
832
原创 bridge vlan
linux bridge允许我们把桥接端口加入不同的vlan,在使能bridge vlan后,桥接模块就会按照vlan来转发数据包,数据包携带的vlan id是什么,那它就只能在对应的vlan里面转发。接下来的篇幅中将简单分析bridge vlan的实现原理。
2025-03-05 22:28:14
648
原创 linux bridge转发数据包的基本过程
在linux内核中有一个桥接模块,它提供了创建虚拟桥接设备()的功能,并且允许我们把其它网卡设备添加到桥接设备下。桥下的网卡设备收到报文时,报文会被送入桥接模块进行处理,与网络层依据IP地址查找路由表确定出口设备的流程不同,桥接模块会依据MAC地址查找转发表确定出口设备。接下来的篇幅中将简单梳理桥接模块转发报文的逻辑。为了方便描述,稍后称桥接设备为桥,称那些添加到桥下的设备为桥接端口。
2025-03-05 22:00:02
1106
原创 邻居子系统的工作过程
linux内核发送数据包的过程中,当数据包经过网络层时,网络层会查找路由表选择出一个下一跳地址,有了这个下一跳地址后,就知道了这个报文应当往哪个主机发送。在数据包发往数据链路层前,内核会解析出下一跳地址对应的数据链路层地址,以便构造链路层报文头部。内核中的邻居子系统就是专门负责解析链路层地址的模块。
2025-01-19 21:46:59
637
原创 IP组包函数分析
当IP报文输入IPv4协议栈后,若IP报文是一个IP片段,则内核会尝试将收集该IP片段,收集完所有IP片段后再组合所有片段,然后才将最终的IP报文送往上层协议栈或者进行转发。内核在收集IP片段的过程中,会将属于同一IP报文的片段放入同一个队列中,在后续的描述中我们称之为‘IP片段队列’,内核使用structipq和来描述IP片段队列。
2025-01-19 19:46:00
712
原创 IP分段函数分析
IP协议栈在输出数据包到下层协议栈前会检查IP报文的长度,若是IP报文超过了MTU就会对报文执行分段,接下来的篇幅中就来分析IP分段函数。不管是本地输出的还是转发的IPv4数据包,最终都会被送入ip_output函数,ip_output函数大致内容如下,在报文经过回调点之后就会进行IP分段,分段完成后再输出到邻居子系统。IP分段由函数完成,函数会按照MTU值分配新的sk_buff,然后将原sk_buff携带的报文拷贝到到新分配的sk_buff并为新的报文构造IP头部。
2025-01-19 17:17:04
649
原创 udp发送消息到网络层前路由查找和缓存数据的过程
本篇中分析udp协议的消息发送函数,以此来观察udp查找路由的过程,以及udp将应用层传递的数据封装到sk_buff并传递到网络层的过程。应用层对udp socket调用函数后,内核中函数会被调用,sk_buffsk_buffsk_buff接下来依次从路由查找、分割和缓存数据、发送数据到下层协议栈这三个部分来分析。
2025-01-04 21:08:10
875
原创 IPv4输入输出报文的基本流程
写者是一枚小小路由器软件工程师,工作7年有余,常年奔波于业务需求的实现之中,对于工作中接触的知识却少有反思和总结,以后尝试将自己工作中的感悟和收获记录下来,以便复盘。这篇笔记记录的是IPv4输入输出报文的大致流程。
2024-12-28 11:55:36
971
原创 NAT执行过程
NAT(network address translation)是一种重要的网络技术,它可以用于解决公网ip地址不足的问题,也可以用于保证内网用户的安全性和隐私性。linux内核的NAT模块基于netfilter的hook机制以及连接跟踪来实现,接下来的篇幅中将简单分析NAT的执行过程。
2024-12-28 11:49:00
648
原创 连接跟踪代码分析
连接跟踪(conntrack)是内核中的一个模块,它基于netfilter的hook机制获取并跟踪通信双方的数据包,提取数据包的信息建立连接跟踪条目。
2024-12-28 11:47:01
1991
原创 netfilter的hook机制
netfilter提供了一个处理数据包的框架,IPv4、IPv6、bridge、arp这些协议栈会在数据包流动路径的关键位置上设立netfilter hook点,其它的内核模块可以向netfilter hook点上注册回调,当数据包经过这些hook点时,IPv4、IPv6、bridge、arp就会调用netfilter的核心代码,netfilter的核心代码进一步调用其它的内核模块注册的回调。
2024-12-28 11:45:58
1837
原创 iptable的结构和执行过程
netfilter允许其它内核模块往这些hook点上注册回调函数,当数据流过IP协议栈时,那些回调函数便会被调用,iptable就是基于netfilter来实现的。iptable的表中有一个’链’的概念,对应于netfilter的五个hook点,iptable总共有PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING五种链,表往链上注册了回调那么它就会有PREROUTING链,表往链上注册了回调那么它就会有INPUT链,表往。
2024-12-28 11:44:57
637
原创 策略路由代码分析
系统默认会有三个路由表:local、main、default,local表由内核更新,那些通往本机的路由会保存到local表,而应用层通过route指令或者ip route指令(不指定路由表id的情况)添加的路由会默认保存到main表,default表本来是用于保存默认路由,但写者工作中常见到的是默认路由也被保存在main表中,而default表是空的。其实不止local\main\default表,linux可以支持多达0xffffffff张路由表,在使用ip route。
2024-12-28 11:43:57
599
原创 路由相关的一些概念
路由器连接着多个网络并且内部存储着到达各个网络的路径信息(路由表),当网络中的数据包想要跨网络传输时,需要经过路由器的查表转发才能到达目的地。
2024-12-28 11:40:05
897
原创 ingress qdisc和filter
在报文输入路径上,只有ingress和clsact这两类qdisc可以使用,而这两类qdisc与作用于输出路径上那些qdisc的工作方式也大有不同。输出路径上,报文会经历enqueue/dequeue的过程,qdisc会在报文enqueue/dequeue的过程种执行各种逻辑,进而达到过滤报文、限速、整流的效果。而输入路径上,报文不会再经过enqueue/dequeue的过程,只会经过classify,ingress qdisc需要依赖filter才能实现过滤报文、限速那些功能。在htb-qdisc的分析
2024-12-28 11:39:01
616
原创 htb qdisc
htb qdisc是一种classfull qdisc,通过在htb qdisc下添加class和filter可以实现一些复杂的限速功能,本篇笔记中浅析一下htb enqueue/dequeue的过程,看看它是如何工作的。
2024-12-28 11:36:24
953
原创 记录一些tc命令
tc的命令比较复杂,本篇笔记中选择性的记录一些关键参数的用法和一些示例。添加qdiscclassfilter时,有三个参数基本是必传的:devparent。
2024-12-28 11:32:34
1022
原创 tc相关的一些概念
tc)是一个应用层工具,它与内核的tc模块共同协作,可以对内核进行流量控制,通过tc可以实现限速、数据包过滤等功能,接下来简单的介绍下tc的关键概念。
2024-12-28 11:29:41
930
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人