Linux网络系统底层机制分析(2)

【linux】剖析底层——带你详细了解Linux内核源码的构成及其作用 以及Linux系统调用,字符设备的和文件系统的指南,还有某些编程相关的内容;它是一种低功耗的RISC处理器,由Tensilica公司开发,具有高可配置性,包括可自定义的指令集,硬件加速器,多处理器,高容量存储,以及多个安全等级的支持。它是一种RISC处理器体系结构,其中包含多款不同的处理器产品,包括针对低成本,大容量存储,虚拟化,图形处理,以及应用程序指令优化的设计。它是一种IBM的架构,用于构建极高性能的RISC处理器,其具有多项必备的硬件功能,可支持指令集向后兼容性,以及低能耗和高可靠性。 阅读详情
 

Linux网络系统底层机制分析(2)

----linux底层的若干机制

暂且把报文的接收看作是上行处理,这一篇将总结linux是如何在底层处理从网络上接收到的报文。所有的源代码引自linux kernel 2.6.22。

1)硬件通知驱动的方式

网络适配器在收到报文之后,该怎么样通知内核(或者说驱动)呢?一般来说有这样集中方式:

A)轮询的方式  内核周期性检查设备的状态,看是否有报文到达,有的话就调用相应的驱动函数进行处理。这种方式会浪费大量的系统资源,因而现代的操作系统中很少采用,但是在某些应用场合,他是最佳的方式;

B)中断的方式  报文到达时,设备触发中断,通知系统切换上下文处理中断。中断处理函数接收报文,将报文入队,通知内核做进一步的处理。这种方式是最普遍,在低流量的情况下起性能也非常好,但是在网络高负荷的环境中,会有一些问题,显而易见,由于每个报文都会触发一次中断,系统将耗费大量的时间在处理中断和上下文切换当中。除此之外,还有其他的问题。处理入报文的代码通常会分成两部分:一部分负责将报文拷贝到内核可见的队列中,另一部分负责从该队列中去报文并加以处理。前一部分在中断上下文中执行,他能够抢占后一部分的处理。在大流量时,由于后一部分不能及时运行,队列会马上被填满,但是此时又没有禁止中断,那么随后到达的报文引发的中断极有可能使系统瘫痪。

C)多帧处理的方式(Processing multiple frames during an interrupt)  稍微改变一下中断处理函数的行为就是多帧处理的方式--在一个中断处理函数中处理多个报文。在这种方式中,驱动可以每次读取一定个数的报文到内核的入队列中,当然也可以每次把设备的入报文全部读完,但是这样可能会严重影响到内核的调度。这种方法不需要内核做什么改变,完全是驱动的行为。其实把这种概念延伸一下就是linux的新接口NAPI,这个等一下再讲。

D)定时器驱动中断(timer-driven interrupt)  这是上一种方式的增强:驱动可以设定一个时间t,然后设备会以t为周期定时中断系统,在中断处理中,驱动一次性把所有在这个间隔内到达的报文全部挂到系统的入报文队列中。这比轮询的方式节约不少的时间资源,但是它也依赖于硬件的功能--硬件要有这种定时中断的能力,并且会有一定的时延。

E)NAPI  上面三种接口(B,C,D)统统可以使用内核的旧机制,NAPI是linux kernel 2.5版本后开始采用的一种新的内核接口,意为new api。这个在后面详细总结。

可以看到,有若干种方式可以选择,他们都有各自的优缺点。我们可以将它们结合起来以适应变化的应用场合。比如,只要硬件允许,可以结合中断和定时驱动中断的方式,反正他们也不需要内核提供新的接口。事实上,tulip driver就是采取的这种方式(drivers/net/tulip/interrupt.c)。

2)中断处理函数

无论是NAPI,还是老的接口,都不可避免地用到中断,这里总结一下linux对中断的处理。

中断可以简单分为硬件和软件中断。硬件中断实际上是一种电信号(触发的方式有电平方式和边沿方式,记得在学校去一家公司应聘实习,里面就要讲讲这两种方式和linux在处理他们的不同考量,现在已经记不清了),cpu通过中断管理器得到硬件的通知,并及时作出响应。软件中断也有很多,比如我们时常用到的系统调用,一般实现的方式就是通过软中断陷入到内核中,在linux中,使用了0x80号软中断;还有更普通的除零也会引发软中断。这方面的资料可以参考intel或其他cpu厂家的一些编程资料。Arm等芯片的中断号不同,但机制都是一样的。

可以用request_irq来注册并激活一个中断处理函数,free_irq注销中断处理函数,释放中断线。这两个函数的实现是架构相关的。Request_irq主要是分配资源,并放入到全部变量:irq_desc的适当位置。irq_desc保存了256级中断的处理信息,里面的“struct irqaction *action;”成员保存了具体的处理函数信息,对于共享中断线来说,链表上会有多个处理函数存在。

Linux对中断处理流程比较简单,处理器中断内核以后会跳到do_IRQ函数,显然,该函数也是体系架构相关的。此函数的主要任务是调用注册到该中断线的处理函数(对于共享中断线的方式,会有多个):

desc->handle_irq(irq, desc).

在处理函数被调用执行以后,流程到达ret_from_intr,该入口定义在entry.S中,汇编代码,下面是片段:

ret_from_intr:

 GET_THREAD_INFO(%ebp)

check_userspace:

 movl PT_EFLAGS(%esp), %eax # mix EFLAGS and CS

 movb PT_CS(%esp), %al

 andl $(VM_MASK | SEGMENT_RPL_MASK), %eax

 cmpl $USER_RPL, %eax

 jb resume_kernel  #检查是返回到用户空间还是内核空间(根据USER_RPL

的定义可以看到,此时判断的依据是当前的处理器的执行级别,eax的值是当前的运行级别,不过比USER_RPL(3)要小,那么表示是在中断发生时,运行在内核空间,否则返回到用户空间)

ENTRY(resume_userspace)

  DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt

     # setting need_resched or sigpending

     # between sampling and the iret

 movl TI_flags(%ebp), %ecx

 andl $_TIF_WORK_MASK, %ecx # is there any work to be done on

     # int/exception return?

 jne work_pending

 jmp restore_all

END(ret_from_exception)

#ifdef CONFIG_PREEMPT

ENTRY(resume_kernel)

 DISABLE_INTERRUPTS(CLBR_ANY)

 cmpl $0,TI_preempt_count(%ebp)   #判断preept_count是否为零,如果是,表明此时内核没有持有共享资源,因此抢占是安全的。

 jnz restore_nocheck

need_resched:

 movl TI_flags(%ebp), %ecx # need_resched set ?

 testb $_TIF_NEED_RESCHED, %cl  #判断重新调度标志是否被置位,如果是,则此时的重新调度是安全的

 jz restore_all

 testl $IF_MASK,PT_EFLAGS(%esp) # interrupts off (exception path) ?

 jz restore_all

 call preempt_schedule_irq

 jmp need_resched

END(resume_kernel)

由于中断处理函数在中断中断上下文中执行,所以不能调用引发等待,占用锁,休眠等行为的函数。另一个注意的问题是关于中断的重入,由于当某条中断线上有中断时,所有的cpu上的此条中断线的请求全部被屏蔽,所以我们不必考虑重入的问题。

在linux中,为了使中断处理程序快速完成,有下半部处理机制,这个和linux的网络子系统的关系挺大,下面总结一下。

 
Linux 网络系统学习: Neighboring Subsystem Linux 网络系统学习: Neighboring Subsystem1. 概述在数据包的发送过程中,通过路由获得下一跳的 L3 地址,下一步是获得此 L3 地址所对应的 L2 地址,这个过程称为 neighbor discovery。IPv4对应的是 ARP 协议,IPv6 对应的是Neighbor Discovery 协议。Linux 中,用于处理neighbor discov 阅读详情

相关推荐

深入Linux网络系统调用入口:从socket()到内核协议栈的完整路径解析

系统调用是用户程序与操作系统内核交互的核心接口,它通过特定的处理器指令实现用户态到内核态的权限切换。在网络编程中,套接字系统调用如socket()、bind()、connect()等构成了网络通信的基石,其底层实现涉及内核中复杂的协议栈处理流程。理解这些系统调用的入口机制,对于高性能网络编程、复杂网络问题调试以及系统安全加固都具有重要价值。在实际工程中,通过strace工具可以追踪系统调用执行过程,而eBPF技术则能在内核层面进行深度监控和性能分析。本文聚焦于网络套接字系统调用的内核入口函数,详细解析从用户

weixin_30873847的博客 415

深入网络底层,了解Linux系统收发网络数据包的过程、原理、流程,附图文说明

深入网络底层,了解Linux系统收发网络数据包的过程、原理、流程,附图文说明。

代码讲故事 1107

【嵌入式原理系列-第七篇】ld脚本实战:从零构建MCU内存布局

本文是一篇针对嵌入式开发者的实战指南,详细讲解了如何从零开始为MCU编写ld链接器脚本以构建自定义内存布局。文章以STM32F103C8T6为例,深入剖析了MEMORY和SECTIONS指令的用法,并提供了OTA分区、非易失数据存储等高级定制案例,帮助开发者解决实际工程中的Flash与RAM管理难题,实现对程序运行的深度掌控。

weixin_29271263的博客 249

Linux操作系统基本代码

【tar -cvf example.tar example】把example文件打包成example.tar文件。useradd -m-g 组名 用户名(新建用户的同时 将他添加到指定组 并且指定home文件下)chmod o+w 文件名 (o-other-别人 +w增加write权限)【修改文件权限】(o表示other 别人 +-w 增写write权限)chmod o-w simple.txt 修改别人other的权限-w。chmod a-w simole.txt 所有人减去w权限。

xiaoyiBaby_的博客 3026

【Vite+Vue3+TS】基于Vite+Vue3+TypeScript+ESLint+Prettier+Stylelint搭建项目(亲测超详细)

结合了很多项目和文章,总结一篇项目构建的笔记。 温馨提示:文章末尾记录了我在搭建项目过程中,遇到的一些问题和解决办法 ~

aDiaoYa_的博客 4231

逆向工程师的Shopee爬虫避坑指南:af-ac-enc-dat参数生成原理与反反爬策略

本文深入剖析了Shopee电商平台的反爬虫加密机制,重点解析了核心请求头参数x-sap-ri、x-sap-sec及af-ac-enc-dat的生成原理与联动关系。文章从逆向工程视角,提供了定位加密代码、分析算法逻辑的实战方法,并分享了基于JS执行环境模拟与无头浏览器控制的可持续反反爬策略,为高效、稳定地采集数据提供专业指南。

weixin_28607671的博客 1494

【Linux文件操作的底层原理:文件描述符与缓冲区】

pathname: 要打开或创建的目标文件flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定一个且只能指定一个O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND: 追加写O_TRUNC: 如果文件存在且是可写的,则截断文件为零长度。

qq_64446981的博客 1076

WSL子系统启动报错 Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE

WSL子系统启动报错 :Wsl/Service/CreateInstance/CreateVm/HCS_E_SERVICE_NOT_AVAILABLE 于是分析原因,最终发现是Windows功能中的虚拟机平台功能不知道什么时候被取消了。

Linux I Tell U 6万+

Linux 网络编程及底层实现过程

也许学过从事过网络编程的人都知道socket是什么,表示什么?socket的英文原义是“孔”或“插座。但我们用网络术语将它称为“套接字”(见Linux网络编程),但是我习惯叫“套接口”,可能是受Unix网络编程的影响。里面是这样解释的:首先Socket作为网络API之一,跟XTI一样,是应用层或其他协议层访问接口,其次具体使用的套接口是与Unix管道某端口类似的机制,应用程序和内核(实际是内核实现

chengfangang的专栏 2815

2026华为OD面试题084:贪心的商人

商人经营一家店铺,有 `number` 种商品。由于仓库限制,每件商品的最大持有数量是 `item[index]`。 每种商品每天有一个价格 `item_price[item_index][day]`。通过对商品买进和卖出获取利润,请给出商人在 `days` 天内能获取到的最大利润。 注:同一件商品可以反复买进和卖出。 输入描述: - 第一行输入商品数量 `number` - 第二行输入商人售货天数 `days` - 第三行输入 `number` 个整数,表示每件商品的最大持有数量 `item[in

琅嬛福地 273

STM32G431的 FDCAN使用5M加速时,出现奇葩问题,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1638

Linux网络系统底层机制分析(3)----报文接收(续)

 Linux网络系统底层机制分析(3)                 ----报文接收(续)3.下半部处理Net_rx_action是软中断NET_RX_SOFTIRQ的处理函数。处理函数执行时,帧有可能在两个地方:CPU的入报文队列,设备内存中。前者对应应用老接口的驱动,后者则是采用了NAPI接口的驱动的情形。Net_rx_action的处理比较简单:对当前cpu上poll_l

asung811的专栏 2465

基于Spring Boot + Vue 3的前后端分离教材订购系统设计与实现

随着高校信息化建设的不断深入,传统手工管理教材的方式已无法满足高效、准确、透明的需求。文章将详细阐述系统的需求分析、架构设计、数据库设计、核心功能模块的实现(包括用户认证、教材管理、购物车、订单管理等),并提供关键代码片段。一个集中化、在线化的教材订购系统可以有效地解决这些问题,实现教材信息的统一管理、学生在线选书、订单自动汇总、财务清晰对账,极大地提升了管理效率和服务质量。系统采用了先进的前后端分离架构,实现了用户管理、教材管理、购物车、订单管理等核心功能,具有良好的可扩展性和可维护性。

2201_76125393的博客 330

Linux网络系统底层机制分析(3)---- 报文接收

Linux网络系统底层机制分析(3)----报文接收前面介绍了两种接口:老接口,NAPI接口。两者在报文接收的处理机制是不一样的,下面结合内核中实际的驱动仔细分析。1.sk_buff结构  sk_buff结构可能是贯穿整个子系统的结构,它表明了接收到的或者要发送的数据的一些重要信息。其包含的域非常多,定义在include/linux/skbuff..h中。内核利用其next

asung811的专栏 3331

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

linux底层的若干机制之linux下半部处理

<!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } --> Linux网络系统底层机制分析(2) ----linux底层的若干机制(续) <!-- @page { size: 8.5in 11in; margin

asung811的专栏 2164

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

从零搭建Linux网络系统管理竞赛环境:VirtualBox多节点实战

在Linux系统管理与网络运维领域,构建一个贴近生产环境的综合实验平台是掌握核心技能的关键。其原理在于通过虚拟化技术模拟真实网络拓扑,将分散的服务节点(如Web、数据库、DNS)进行有机联动,从而深入理解服务间的依赖关系与数据流。这种实践方法的技术价值在于,它超越了单一命令的练习,能够系统性地锻炼网络规划、服务部署、安全策略配置与故障排查的综合能力。特别是在职业技能竞赛或企业运维场景中,这种多节点、服务联动的环境是考核与工作的核心。本文以VirtualBox和CentOS/Rocky Linux为基础,详细

weixin_33884611的博客 375

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

深入解析Linux网络系统调用:从socket()到协议栈的完整路径

系统调用是用户程序与操作系统内核交互的核心接口,它通过软中断机制实现用户态到内核态的安全切换。在网络编程中,套接字系统调用如socket()、bind()、connect()等构成了网络通信的基石,其入口函数负责参数验证、权限检查和协议栈分发。理解这些底层机制对于优化网络性能至关重要,例如通过分析send()和recv()的数据拷贝开销,可以应用零拷贝技术提升吞吐量。在高并发场景下,accept()系统调用的处理效率直接影响服务器性能,而setsockopt()等调用则允许开发者精细调整协议栈行为。掌握网络

weixin_30800987的博客 436

终于有人把操作系统,网络系统,线程进程,IO模型全部总结出来了

摘要:操作系统是计算机运行的核心,但其原理晦涩难懂。《图解系统》以图解方式讲解操作系统五大结构(进程、内存、文件、设备、网络),涵盖计算机组成和Linux命令。内容包含进程管理、线程同步、I/O多路复用等核心概念,帮助揭开操作系统神秘面纱。学习是程序员保持竞争力的关键,这份资料可助力掌握操作系统精髓。完整版可通过指定方式获取。

m0_46995061的博客 439

Linux内核源码分析代码详解

Linux内核源码分析代码详解 链接:https://pan.baidu.com/s/1MxbVZAKtDzW_ig1Njvb5Vw 提取码:ho3a 链接无效了的话请加Q群:832218493免费领取! 免费学习地址:https://ke.qq.com/course/417774?flowToken=1017067 本系列文章主要是近期针对Linux进程调度源码进行阅读与分析后的经验总结,分析过程中可能结合部分Linux网络编程的相关知识以便于理解,加深对Linux进程调度的理解和知识分享。 本系列文

资料qun832218493 2370

玩转Linux内核套接字(socket)原理与机制

1、套接字基本知识 套接字(socket)就是对网络当中不同主机上面的应用程序进程之间进行双向通信的端点的抽象。套接字类型:流式套接字、数据报套接字、原始套接字。套接字作用:主要完成两个应用程序之间的数据传输。套接字本质:两个网络各自通信连接中的端点。 2、套接字表示方式 套接字socket=(ip地址:端口号),套接字表示方法采用点分十进制的ip地址后面写上端口号,中间用冒号或逗号隔开。每个传输层连接唯一地被通信两的两个端点(两个套接字)所确定。比如IP地址是192.168.2.34,端口

youzhangjing_的博客 1942

Linux内核源码分析代码详解|Linux内核视频教程

Linux内核源码分析代码详解 链接:https://pan.baidu.com/s/1MxbVZAKtDzW_ig1Njvb5Vw 提取码:ho3a 链接无效了的话请加Q群:832218493免费领取! 1、进程管理专题 1.1进程原理 进程生命周期 task_struct结构 进程优先级 进程系统调用 1.2进程调度机制 调度器实现schedule() 完全公平调度类CFS 实时调度类原理 多核模式调度SMP 1.3进程竞争机制 RCU机制原理 内存优化与屏障 大内核锁 pe

资料qun832218493 2661

Linux 内核源码完全注释

Linux 内核源码完全注释 去发现同类优质开源项目:https://gitcode.com/ 本仓库提供了一个珍贵的资源文件——Linux内核源码完全注释。该资源文件详细注释了LINUX内核的同步、信号、内存、调度、文件系统、网络系统、时钟等关键部分的源码,旨在帮助开发者深入理解Linux内核的工作原理。 简介 本资源文件是一份历时三年的研究成果,凝聚了作者对Linux内核源码的深刻理解。文件内...

gitblog_06790的博客 848

基于memflow框架的CS2内存分析实现方案

cs2-dumper是一款基于memflow框架开发的Counter-Strike 2内存偏移与接口提取工具,为游戏开发者和研究人员提供了高效、稳定的内存数据提取解决方案。该工具支持Windows和Linux双平台,能够自动化提取CS2游戏的关键内存结构、接口信息和偏移数据,为游戏插件开发、逆向分析和模组制作提供可靠的技术支持。 ## 架构实现原理 cs2-dumper采用模块化设计架构,通过

gitblog_00029的博客 307

Linux内核网络源码分析合集:深入理解Linux网络架构的核心工具

Linux内核网络源码分析合集:深入理解Linux网络架构的核心工具 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在当今技术飞速发展的时代,Linux内核网络源码分析合集为那些对Linux内核及网络协议实现感兴趣的开发者提供了一个宝贵的学习资源。该项目汇集了三本电子书,详尽地剖析了Linux内核网络部分的源代码,旨在帮助读者深入理解Linux网络架构的工作原理。 项...

gitblog_06736的博客 417

深度解析phytool:Linux网络硬件诊断的底层利器

当网络连接出现异常时,你可能会发现传统的网络诊断工具无法触及硬件层面的根本问题。这时,一个名为phytool的工具便成为了网络工程师和系统管理员的重要武器。phytool是一款专门用于Linux系统下以太网PHY设备寄存器访问的命令行工具,它通过MDIO(Management Data Input/Output)接口直接与网络物理层芯片通信,为深度网络故障排查提供了底层支持。 ## 工具核心能力

gitblog_01031的博客 983
上一篇: Linux 网络子系统底层机制分析(1)
下一篇: linux底层的若干机制之linux下半部处理
firePhoenix1981
博客等级 码龄20年 17粉丝 67原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值