【linkedhashset源码详解】【自定义app程序源码】【博客中如何免费下载源码】eth内核源码_eth原版内核

时间:2024-12-28 08:59:34 来源:微信gif源码 分类:时尚

1.手把手教你搭建ARM64 QEMU环境
2.ZYNQ+linux网口调试笔记(3)PL-ETH
3.一文搞懂Linux内核网络设备驱动(白嫖小知识~)
4.转发:轻松理解 Docker 网络虚拟化基础之 veth 设备!内内核
5.网络驱动器怎么安装网络驱动linux

eth内核源码_eth原版内核

手把手教你搭建ARM64 QEMU环境

       在上篇介绍了ARM QEMU环境搭建过程后,核源让我们继续学习如何搭建ARM QEMU开发环境。原版

       首先,内内核准备开发环境:

       你的核源PC系统:Windows

       虚拟机软件:VMware

       虚拟机操作系统:Ubuntu .

       目标模拟的位CPU:Cortex-A

       使用版本:qemu-8.2.0、Linux Kernel 5..和busybox-1..1

       构建步骤如下:

       从qemu官网下载并解压qemu-8.2.0源码。原版linkedhashset源码详解

       确保你的内内核主机Python版本大于3.8,如需升级,核源访问python官网下载源码。原版

       安装所需的内内核Python依赖和glib2.0环境。

       进入qemu目录,核源配置源码,原版创建编译目录并进行配置。内内核

       从kernel.org获取Linux kernel 5.源码,核源解压并编译生成Image文件。原版

       同时,编译kernel modules,存放在指定目录。

       使用busybox制作根文件系统:下载最新版本源码,设置交叉编译工具链,重新配置并安装。

       创建rootfs目录,将busybox安装内容复制到其中,包括设置环境变量和设备节点。

       在/etc/init.d/rcS脚本中,rcS会挂载文件系统、处理热插拔和设置eth0的静态IP。

       理解并配置其他配置文件如/etc/fstab和/etc/profile。

       如果需要,自定义app程序源码可以尝试基于ram的内存文件系统,使用cpio工具制作initramfs或gzip压缩。

       如果需要持久化,制作基于硬盘的文件系统。

       最后,使用qemu命令启动内核并通过串口登录。

       对于更详细的步骤和示例,可以参考我的文章《Linux随笔录》,回复关键字"busybox"获取相关资源。作者潘小帅,热衷于Linux底层技术,喜欢分享原创文章,也欢迎关注微信公众号Linux随笔录,一同探讨技术与生活。感谢您的支持和关注!

ZYNQ+linux网口调试笔记(3)PL-ETH

       åœ¨ZYNQ上使用gigE Vision协议的网络接口相机。

        第一步:调通PS侧网口GEM0(Xilinx BSP默认配好)。

        第二步:调通PS侧网口GEM1(见前一篇文档:开发笔记(1))。

        第三步:调通PL侧网口(本文阐述)。

        第四步:在PL侧网口上验证Jumbo Frame特性,并在应用层适配gigE Vision协议。

        根据《xapp》可知,PL侧的PHY支持Base-X和SGMII两种配置,这两种配置对应两种不同的PHY引脚接口(连接到MAC)。而我们的hdf文件使用的是Base-X的配置。

        关于网口的Linux驱动,我们在官网找到一份资料: Xilinx Wiki - Zynq PL Ethernet 。资料很长,我们只看与我们相关的2.4.1 PL Ethernet BSP installation for Base-X”这一章节就可以了。

        首先导入FPGA设计同事提供的hdf文件:

        在弹出的图形界面里,进入Subsystem AUTO Hardware Settings——Ethernet Settings——Primary Ethernet,确认可以看到PL侧网络设备axi_ethernet_0,说明hdf文件里已包含了必要的网口硬件信息:

        上图中被选中的网口将成为Linux上的设备eth0。这里我们默认选择ps7_ethernet_0,即使用GEM0作为首选网口。

        启用Xilinx AXI Ethernet驱动

        进入Device Drivers -- Network device support – 选中Xilinx AXI Ethernet(以及Xilinx Ethernet GEM,这是PS侧网口的驱动)

        进入Networking support – 选中 Random ethaddr if unset

        进入Device Drivers -- Network device support -- PHY Device support and infrastructure – 启用Drivers for xilinx PHYs

        进入~~~~Device Drivers -- DMA Engine Support -– 禁用~~~~Xilinx AXI DMAS Engine~~~ (对应的配置项名为 ~~ CONFIG_XILINX_DMA ~~~)

        注意: Xilinx Wiki里对设备树节点的引用有误(&axi_ethernet),导致编译报错,应改为&axi_ethernet_0。

        注:PL-ETH驱动所在路径:<project>/build/tmp/work-shared/plnx_arm/kernel-source/drivers/net/ethernet/xilinx/xilinx_axienet_main.c和xilinx_axienet_mdio.c。对应的内核配置项为CONFIG_NET_VENDOR_XILINX和CONFIG_XILINX_AXI_EMAC。

        启用ethtool和tcpdump(调试用,非必须):

        然后将生成的BOOT.BIN和image.ub拷贝到SD卡根目录下,将SD卡插入板子上,上电运行。

        上电后,使用ifconfig eth1查看网口信息,观察MAC地址与设置的一致,且ifconfig eth1 ..1. up没有报错。

        测试网络通路:ping PC是通的。说明网口工作正常。

        Linux下eth1(即PL-ETH)的MAC地址有误

        问题描述:

        开机打印:

        注意:

        MAC地址是错的,驱动里解析出的是GEM0的MAC地址。

        试验发现,即使在system-user.dtsi里不写local-mac-address,也照样解析出的是GEM0的MAC。

        而将system-user.dtsi里的local-mac-address改名为pl-mac-address,并将驱动里解析的字符串也对应更改为pl-mac-address,则可以正确解析出来:

        Passing MAC address to kernel via Device Tree Blob and U-Boot:

       /support/answers/.html

        U-Boot里的环境变量ethaddr会覆盖掉设备树里pl-eth的local-mac-addr字段,从而影响Linux启动后的网卡MAC地址;

        但U-Boot里的环境变量ipaddr不会对Linux启动后的配置产生任何影响。因为设备树里根本就没有关于IP地址的配置。

        phy-mode怎么会是sgmii?查了下官方的提供的BSP里,也是“sgmii”。说明这个没问题。具体原因不清楚。

        @TODO: 设备树里的中断号的顺序如何影响功能?

        为何读出来的IRQ号不对呢?这是因为这里读到的不是硬件的中断号,而是经过系统映射之后的软件IRQ number。两者不具有线性关系。

        关于中断号的疑问:

        Linux上的网口eth0、eth1的顺序,似乎是按照phy地址从小到大来排布的。

        Xilinx xapp-zynq-eth.pdf (v5.0) July ,

       /support/documentation/application_notes/xapp-zynq-eth.pdf

        Xilinx Wiki - Zynq PL Ethernet:

       /wiki/spaces/A/pages//Zynq+PL+Ethernet

        Xilinx Wiki - Linux Drivers:

       /wiki/spaces/A/pages//Linux+Drivers

        Xilinx Wiki - Linux Drivers - Macb Driver:

       /wiki/spaces/A/pages//Macb+Driver

        Xilinx Wiki - Zynq Ethernet Performance:

       /wiki/spaces/A/pages//Zynq+Ethernet+Performance

        查到关于Jumbo frame MTU的定义,当前值为,可否改大一些?

        驱动源码里关于jumbo frame的说明:

        设置MTU为,发现ping包最大长度只能设为ping ..1. -s

       _device_ops变量,注册ethtool函数,以及配置软中断。

       网络设备启动过程中,igb_probe函数完成设备初始化工作,包括PCI相关的操作和通用网络功能。结构net_device_ops变量包含了网络设备相关的操作函数,例如开启网络设备(ndo_open)时会调用对应的方法。在使用DMA将数据直接写入内存后,实现这一功能的数据结构为ring buffer。预留内存区域给网卡使用,实现数据包的接收。网卡支持接收侧扩展(RSS)或多队列技术,博客中如何免费下载源码以利用多个CPU并行处理数据包。Intel I网卡支持多队列,其驱动在启用时调用igb_setup_all_rx_resources函数管理DMA内存。

       启用NAPI(New API)接收数据包,通过调用napi_enable函数设置NAPI变量中的启用标志位。对于igb驱动,当网卡被启用或通过ethtool修改队列数量或大小时,会启用每个q_vector的NAPI变量。注册中断处理函数,不同驱动实现因硬件而异,一般优先考虑MSI-X中断方式,以实现更高效的数据处理。最后,打开硬中断,网卡便可以接收数据包。

       监控网络设备有多种方式,从最粗粒度的ethtool -S查看网卡统计信息,到sysfs中获取接收端数据包的详细类型统计。sysfs提供统计信息,但驱动决定何时以及如何更新这些计数。/proc/net/dev提供了更高层级的网卡统计,适合作为常规参考。如果对数据的准确度有高要求,必须查看内核源码、驱动源码和驱动手册,以完全理解每个字段的实际含义。

       本文仅介绍了Linux内核网络设备驱动的基本概述,未来将深入探讨更详细的微信抢红包 app 源码内容,欢迎关注后续文章。

转发:轻松理解 Docker 网络虚拟化基础之 veth 设备!

       大家好,我是飞哥!

       最近,飞哥对网络虚拟化技术产生了浓厚的兴趣,特别是想深入理解在Docker等虚拟技术下,网络底层是如何运行的。在探索过程中,飞哥意识到网络虚拟化技术是一个挑战,尽管飞哥对原生Linux网络实现过程的理解还算不错,但在研究网络虚拟化相关技术时,仍感到有些难度。

       然而,飞哥有解决这类问题的技巧,那就是从基础开始。今天,飞哥将带大家深入理解Docker网络虚拟化中的基础技术之一——veth。

       在物理机组成的网络中,最基础、简单的网络连接方式是什么?没错,就是直接用一根交叉网线把两台电脑的网卡连起来,这样一台机器发送数据,另一台就能接收到。

       网络虚拟化实现的第一步就是用软件模拟这种简单的网络连接。实现的技术就是我们今天讨论的主角——veth。veth模拟了在物理世界里的两块网卡,以及一条网线,如何看电脑电源码数通过它可以将两个虚拟的设备连接起来,实现相互通信。平时我们在Docker镜像中看到的eth0设备,实际上就是veth。

       Veth是一种通过软件模拟硬件的方式来实现网络连接的技术。我们本机网络IO中的lo回环设备也是一种通过软件虚拟出来的设备,与veth的主要区别在于veth总是成对出现。

       现在,让我们深入了解veth是如何工作的。

       veth的使用

       在Linux中,我们可以使用ip命令创建一对veth。这个命令可以用于管理和查看网络接口,包括物理网络接口和虚拟接口。

       通过使用`ip link show`进行查看。

       和eth0、lo等网络设备一样,veth也需要配置IP才能正常工作。我们为这对veth配置IP。

       接下来,启动这两个设备。

       当设备启动后,我们可以通过熟悉的ifconfig查看它们。

       现在,我们已经建立了一对虚拟设备。但为了使它们互相通信,我们需要做些准备工作,包括关闭反向过滤rp_filter模块和打开accept_local模块。具体准备工作如下:

       现在,在veth0上pingveth1,它们之间可以通信了,真是太棒了!

       在另一个控制台启动了tcpdump抓包,结果如下。

       由于两个设备之间的首次通信,veth0首先发出一个arp请求,veth1收到后回复一个arp回复。然后就是正常的ping命令下的IP包。

       veth底层创建过程

       在上一小节中,我们亲手创建了一对veth设备,并通过简单的配置让它们互相通信。接下来,让我们看看在内核中,veth是如何被创建的。

       veth相关的源码位于`drivers/net/veth.c`,初始化入口是`veth_init`。

       `veth_init`中注册了`veth_link_ops`(veth设备的操作方法),包含了veth设备的创建、启动和删除等回调函数。

       我们先来看看veth设备的创建函数`veth_newlink`,这是理解veth的关键。

       `veth_newlink`中,通过`register_netdevice`创建了peer和dev两个网络虚拟设备。接下来的`netdev_priv`函数返回的是网络设备的私有数据,`priv->peer`只是一个指针。

       两个新创建的设备dev和peer通过`priv->peer`指针完成配对。dev设备中的`priv->peer`指针指向peer设备,而peer设备中的`priv->peer`指针指向dev。

       接着我们再看看veth设备的启动过程。

       其中`dev->netdev_ops = &veth_netdev_ops`这行代码也非常重要。`veth_netdev_ops`是veth设备的操作函数。例如在发送过程中调用的函数指针`ndo_start_xmit`,对于veth设备来说就会调用到`veth_xmit`。这部分内容将在下一个小节详细说明。

       veth网络通信过程

       回顾《张图,一万字,拆解Linux网络包发送过程》和《图解Linux网络包接收过程》中的内容,我们系统介绍了Linux网络包的收发过程。在《.0.0.1 之本机网络通信过程知多少 ?》中,我们详细讨论了基于回环设备lo的本机网络IO过程。

       基于veth的网络IO过程与上述过程图几乎完全相同,不同之处在于使用的驱动程序。我们将在下一节中具体说明。

       网络设备层最后会通过`ops->ndo_start_xmit`调用驱动进行真正的发送。

       在《.0.0.1 之本机网络通信过程知多少 ?》一文中,我们提到对于回环设备lo来说,`netdev_ops`是`loopback_ops`。那么`ops->ndo_start_xmit`对应的发送函数就是`loopback_xmit`。这就是在整个发送过程中唯一与lo设备不同的地方。我们简单看看这个发送函数的代码。

       `veth_xmit`中的主要操作是获取当前veth设备,然后将数据发送到对端。发送到对端设备的工作由`dev_forward_skb`函数完成。

       先调用`eth_type_trans`将`skb`所属设备更改为刚刚取到的veth对端设备rcv。

       接着调用`netif_rx`,这部分操作与lo设备的操作相似。在该方法中最终执行到`enqueue_to_backlog`,将要发送的`skb`插入`softnet_data->input_pkt_queue`队列中,并调用`_napi_schedule`触发软中断。

       当数据发送完毕唤起软中断后,veth对端设备开始接收。与发送过程不同的是,所有虚拟设备的收包`poll`函数都是一样的,都是在设备层初始化为`process_backlog`。

       因此,veth设备的接收过程与lo设备完全相同。想了解更多这部分内容的同学,请参考《.0.0.1 之本机网络通信过程知多少 ?》一文中的第三节。

       总结

       大部分同学在日常工作中通常不会接触到veth,因此在看到Docker相关技术文章中提到veth时,可能会觉得它是一个高深的技术。实际上,从实现角度来看,虚拟设备veth与我们日常接触的lo设备非常相似。基于veth的本机网络IO通信图直接从《.0.0.1的那篇文章》中复制而来。只要你看过飞哥的《.0.0.1的那篇文章》,理解veth将变得非常容易。

       只是与lo设备相比,veth是为了虚拟化技术而设计的,因此它具有配对的概念。在`veth_newlink`函数中,一次创建了两个网络设备,并将对方设置为各自的peer。在发送数据时,找到发送设备的peer,然后发起软中断让对方收取数据即可。

       怎么样,是不是很容易理解!

       轻松理解 Docker 网络虚拟化基础之veth设备!

网络驱动器怎么安装网络驱动linux

       Linux下如何获取网卡信息?

       查看linux的网卡信息步骤如下:工具原料:linux操作系统①启动linux操作系统,进入到桌面;

       ②启动终端;

       ③终端输入命令ifconfigeth0,回车;④linux的网卡信息解读:

       1.查看网卡生产厂商和信号:查看基本信息:lspci查看详细信息:lspci-vvv#3个小写的v查看网卡信息:lspci|grepEthernet;

       2.查看网卡驱动:查看网卡驱动信息:lspci-vvv#找到网卡设备的详细信息,包括网卡驱动#lsmod列出加载的所有驱动,包括网卡驱动;

       3.查看网卡驱动版本查看模块信息:modifomodulename>#其中包含version信息或#ethtool-idevicename>;

       4.查看网络接口队列数查看网卡接口的中断信息:#cat/proc/interrupts|grepeth0或#ethtool-Seth0;

       5.查看网卡驱动源码的版本号解压Intel网卡驱动源码,打开解压缩目录下的*.spec文件查看驱动的版本;

       linux在hyper-v中的驱动如何安装?

       微软的Hyper-V公认支持WindowsVM,但Hyper-V也支持LinuxVM。Hyper-V支持各种Linux发行版的VM,包括CentOS、RedHatEnterpriseLinux(RHEL)、Debian、Oracle、SUSE和Ubuntu。Hyper-V可为大部分Linux版本提供仿真支持,尽管你需要为特殊的驱动版本安装Linux集成服务,以启动Windows服务器平台上的LinuxVM。现在,来考虑Hyper-V下运行LinuxVM时可能会引起的一些问题。

       在WindowsServer和WindowsServerR2上使用RHEL6.5时,有一些问题需要检查。第一个问题涉及到内存映射I/O(MMIO)缺口,其通常提供物理内存空间留给(但很少使用)PCI设备。WindowsServerR2Hyper-V允许管理员配置两个MMIO缺口来支持虚拟设备配置。配置MMIO缺口的能力是成功部署虚拟设备的重要因素,因此较早的Windows服务器平台需要升级到WindowsServerR2,才能配置并支持RHEL6.5虚拟设备。

       动态内存特性还支持热插或内存膨胀等内存功能。热插内存功能首次在WindowsServerR2SP1中出现。根据虚拟机的资源需求和启动的数量及最大内存指定为虚拟机分配资源。膨胀技术允许服务器恢复LinuxVM不再需要的内存,通常VM在启动后,对内存的需求会下降。

       linux如何加载驱动?

       linux操作系统下,加载驱动的方式有两种方法:

       静态加载驱动。通过将驱动程序编译到内核而进行的一系列配置操作。动态加载驱动。是内核注册设备信息,从而在kernel启动后,再通过insmod指令,关联好主、次设备号,从而以模块的形式进行加载。

       linux驱动设备名在哪个文件夹下?

       设备驱动名一般都在/dev目录下。一般常用的设备的设备文件名如下:/dev/hd:IDE设备/dev/sd:SCSI设备/dev/fd:标准软驱/dev/md:软raid设备/dev/loop:本地回环设备/dev/ram:内存/dev/null:无限数据接收设备,相当于黑洞/dev/zero:无限零资源/dev/tty:虚拟终端/dev/ttyS:串口/dev/lp:并口/dev/console:控制台/dev/fb:framebuffer

       Linux驱动工程师需要掌握哪些驱动子系统?

       网卡驱动,USB驱动,各种总线(i2c,uart,spi,pci)驱动,flash驱动等。