二、系统初始化Linux驱动,内核协议栈等等模块在具备接收网卡数据包之前,要做很多的准备工作才行。比如要提前创建好ksoftirqd内核线程,要注册好各个协议对应的处理函数,网络设备子系统要提前初始化好,网卡要启动好。只有这些都Ready之后,我们才能真正开始接收数据包。那么我们现在来看看这些准备工作都是怎么做的。Linux的子系统、模块均定义了一定的启动级别,在start_kernel函数中,按顺序启动/* initcalls are now grouped by functio..
1.3 协议分层大概了解了网卡驱动、硬中断、软中断和ksoftirqd线程之后,我们在这几个概念的基础上给出一个内核收包的路径示意:当网卡上收到数据以后,Linux中第一个工作的模块是网络驱动。网络驱动会以DMA的方式把网卡上收到的帧写到内存里。再向CPU发起一个中断,以通知CPU有数据到达。当CPU收到中断请求后,会去调用网络驱动注册的中断处理函数。网卡的中断处理函数并不做过多工作,发出软中断请求,然后尽快释放CPU。ksoftirqd检测到有软中断请求到达,调用pol..
1. 准备工作此处重点介绍基础概念,为后面介绍数据包收发打下基础。本次代码层面基于Linux 4.4 Kernel。1.1 系统调用Linux的系统运行分为用户态和内核态,内核态控制着系统资源。通过定时器进行调度,把cpu分配给用户进程使用;通过中断来响应外设请求;并有一定的框架来管理内存、文件、网络等。系统调用流程如下:1.2 中断内核和网络设备驱动是通过中断的方式来处理的。当设备上有数据到达的时候,会给CPU的相关引脚上触发一个电压变化,以通知CPU来处理数据..
0.引如下简单的一段在代码,我们在Linux上运行
2.2 网络子系统初始化linux内核通过调用subsys_initcall来初始化各个子系统
2.3 协议栈注册内核实现了网络层的ip协议,也实现了传输层的tcp协议
2.4 网卡驱动初始化每一个驱动程序(不仅仅只是网卡驱动)会使用 mod
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号