【Linux】在Xilinx平台上实现UVC Gadget(1)

news2025/1/16 15:47:28

【Linux】在Xilinx平台上实现UVC Gadget(1)

  • 前言:关于UVC
  • 一、创建Petalinux工程并修改设备树
    • 1) 创建一个基本的petalinux工程
    • 2) 配置sstate和downloads
    • 3) 配置内核
    • 4) 修改设备树
  • 二、在petalinux下添加uvc-gadget测试程序
    • 1) 创建一个空应用程序,并用hello world模板填充
    • 2) 把源代码clone到应用程序文件夹
    • 3) 编辑recipe文件,把应用加到petalinux最终生成的镜像中
    • 4) 修改Makefile
    • 5) 编译Petalinux,生成镜像文件
    • 6) 对sd卡分区,并把文件复制到sd卡
  • 三、测试步骤
    • 1) 在嵌入式Linux
    • 2) 在主机Windows/Ubuntu输入以下命令
  • ps

前言:关于UVC

UVC全称为USB Video Class,即:USB视频类,是一种为USB视频捕获设备定义的协议标准。是Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准之一。

UVC设备都是多Interface设备,这点同普通的u盘不同。UVC设备最起码有两个Interface,VideoControl(VC)Interface和VideoStream(VS) Interface; 这也是最常见的UVC设备。 Spec明确要求一个具有可用的,具有实际UVC功能的设备要有一个VC Interface,一个或多个VS Interface。

VCInterface用于进行配置,操控,设置UVC设备进入不同的功能状态,而VSInterface则负责视频数据流的传输;完整的UVC功能需依赖VS,VC Interfaces的配合才能实现。

Linux下的uvc驱动位于drivers/usb/gadget/目录下,需要的话可以仔细读一下源代码。
我这篇文章主要记录了一下大概的调试过程,时间有限,断断续续写了一星期才写完,可能有些细节没写到的,见谅。

参考链接
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/2046001302/Building+Linux+usb+device+drivers+with+2021.1

开发环境
ubuntu16.04.1
zcu104或者zcu106,其他开发板根据硬件配置稍做修改
官方推荐petalinux2021.1,实测2019.2也可以,但是内核的配置菜单选项位置不太一样,需要自己调整



一、创建Petalinux工程并修改设备树

1) 创建一个基本的petalinux工程

参考以下链接
Petalinux快速入门向导 (4) 第三章.PetaLinux开发基本流程

先从www.xilinx.com官网下载zcu104对应的bsp文件xilinx-zcu104-v2021.1-final.bsp
然后用bsp创建petalinux工程

petalinux-create -t project -s xilinx-zcu104-v2021.1-final.bsp

2) 配置sstate和downloads

gedit project-spec/meta-user/conf/petalinuxbsp.conf

增加以下几行,路径按自己的路径配置

DL_DIR = "/opt/xilinx/p211/downloads"
SSTATE_DIR = "/opt/xilinx/p211/sstate/aarch64"
RM_WORK_EXCLUDE += "linux-xlnx"
RM_WORK_EXCLUDE += "u-boot-xlnx"

3) 配置内核

petalinux-config -c kernel

Device Drivers ->USB support -> USB Gadget Support
默认值

在这里插入图片描述

修改后
在这里插入图片描述

Device Drivers ->USB support -> USB Gadget Support -> USB Gadget precomposed configurations
默认值
在这里插入图片描述
修改后
在这里插入图片描述

Device Drivers -> Multimedia support(第2页第5个) -> Media drivers(倒数第2个) -> V4L test drivers
先选中
在这里插入图片描述
默认
在这里插入图片描述
修改后
在这里插入图片描述

NOTE: Executing Tasks
NOTE: Tasks Summary: Attempted 475 tasks of which 463 didn't need to be rerun and all succeeded.
[INFO] bitbake virtual/kernel -c diffconfig
NOTE: Started PRServer with DBfile: /opt/work/uvc-demo/xilinx-zcu104-2021.1/build/cache/prserv.sqlite3, IP: 127.0.0.1, PORT: 44949, PID: 17197
Loading cache...done.
Loaded 5098 entries from dependency cache.
Parsing recipes...done.
Parsing of 3471 .bb files complete (3463 cached, 8 parsed). 5106 targets, 222 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Initialising tasks...done.
Sstate summary: Wanted 11 Found 11 Missed 0 Current 54 (100% match, 100% complete)
NOTE: Executing Tasks
NOTE: Running task 300 of 300 (/opt/work/uvc-demo/xilinx-zcu104-2021.1/components/yocto/layers/meta-xilinx/meta-xilinx-bsp/recipes-kernel/linux/linux-xlnx_2021.1.bb:do_diffconfig)
NOTE: recipe linux-xlnx-5.10+gitAUTOINC+c830a552a6-r0: task do_diffconfig: Started
Config fragment has been dumped into:
 /opt/work/uvc-demo/xilinx-zcu104-2021.1/build/tmp/work/zynqmp_generic-xilinx-linux/linux-xlnx/5.10+gitAUTOINC+c830a552a6-r0/fragment.cfg
NOTE: recipe linux-xlnx-5.10+gitAUTOINC+c830a552a6-r0: task do_diffconfig: Succeeded
NOTE: Tasks Summary: Attempted 300 tasks of which 299 didn't need to be rerun and all succeeded.

generate_bbappend /opt/work/uvc-demo/xilinx-zcu104-2021.1/build/tmp/work/zynqmp_generic-xilinx-linux/linux-xlnx/5.10+gitAUTOINC+c830a552a6-r0/user_2022-11-19-04-16-00.cfg /opt/work/uvc-demo/xilinx-zcu104-2021.1/project-spec/meta-user/
[INFO] recipetool appendsrcfile -wW /opt/work/uvc-demo/xilinx-zcu104-2021.1/project-spec/meta-user/ virtual/kernel /opt/work/uvc-demo/xilinx-zcu104-2021.1/build/tmp/work/zynqmp_generic-xilinx-linux/linux-xlnx/5.10+gitAUTOINC+c830a552a6-r0/user_2022-11-19-04-16-00.cfg
NOTE: Starting bitbake server...
NOTE: Started PRServer with DBfile: /opt/work/uvc-demo/xilinx-zcu104-2021.1/build/cache/prserv.sqlite3, IP: 127.0.0.1, PORT: 38335, PID: 17550
Loading cache...done.
Loaded 5098 entries from dependency cache.
Parsing recipes...done.
Parsing of 3471 .bb files complete (3463 cached, 8 parsed). 5106 targets, 222 skipped, 0 masked, 0 errors.
NOTE: Writing append file /opt/work/uvc-demo/xilinx-zcu104-2021.1/project-spec/meta-user/recipes-kernel/linux/linux-xlnx_%.bbappend
NOTE: Copying /opt/work/uvc-demo/xilinx-zcu104-2021.1/build/tmp/work/zynqmp_generic-xilinx-linux/linux-xlnx/5.10+gitAUTOINC+c830a552a6-r0/user_2022-11-19-04-16-00.cfg to /opt/work/uvc-demo/xilinx-zcu104-2021.1/project-spec/meta-user/recipes-kernel/linux/linux-xlnx/user_2022-11-19-04-16-00.cfg
[INFO] bitbake virtual/kernel -c cleansstate
NOTE: Started PRServer with DBfile: /opt/work/uvc-demo/xilinx-zcu104-2021.1/build/cache/prserv.sqlite3, IP: 127.0.0.1, PORT: 45175, PID: 17636
Loading cache: 100% |########################################################################################################################################################################| Time: 0:00:01
Loaded 5098 entries from dependency cache.
Parsing recipes: 100% |######################################################################################################################################################################| Time: 0:00:02
Parsing of 3471 .bb files complete (3462 cached, 9 parsed). 5106 targets, 222 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Initialising tasks: 100% |###################################################################################################################################################################| Time: 0:00:02
Sstate summary: Wanted 0 Found 0 Missed 0 Current 0 (0% match, 0% complete)
NOTE: No setscene tasks
NOTE: Executing Tasks
NOTE: Tasks Summary: Attempted 3 tasks of which 0 didn't need to be rerun and all succeeded.
[INFO] Successfully configured kernel




4) 修改设备树

如下图
(注意原wiki链接少了一个s)

gedit project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi





在这里插入图片描述




system-user.dtsi修改后的内容为

/include/ "system-conf.dtsi"

&usb0 {
  status = "okay";
};

&dwc3_0 {
  status = "okay";
  dr_mode = "peripheral";
};




二、在petalinux下添加uvc-gadget测试程序

1) 创建一个空应用程序,并用hello world模板填充

这个命令会在project-spec/meta-user/recipes-apps/目录下生成一个uvc-gadget的文件夹,并创建对应的Makefile和空的c模板文件

petalinux-create -t apps -n uvc-gadget --enable

可以看到project-spec/meta-user/recipes-apps/uvc-gadget/files下自动生成了两个文件
在这里插入图片描述





Makefile文件如下


在这里插入图片描述


uvc-gadget.c如下


在这里插入图片描述

这两个文件是petalinux生成app模板的标准文件,它提供了一个可以编译通过的基本框架。只需要在这个基础上增加自己的业务代码,不需要再手工写Makefile。

我们这个例子比较特殊,因为源代码是github提供的开源代码,所以后续我们会直接删除这两个文件,用网上的源码替代

2) 把源代码clone到应用程序文件夹

uvv-gadget是一个uvc测试的小程序
具体可以看这个链接,作者是比利时的Laurent Pinchart
https://git.ideasonboard.org/uvc-gadget.git

我们把源码clone到uvc-gadget/files/目录,可能会提示files目录非空,这是git的问题。
直接先删除这个目录,git clone以后会自动重新生成

rm -rf project-spec/meta-user/recipes-apps/uvc-gadget/files
git clone https://github.com/wlhe/uvc-gadget.git  project-spec/meta-user/recipes-apps/uvc-gadget/files/

在这里插入图片描述

3) 编辑recipe文件,把应用加到petalinux最终生成的镜像中

这一步是petalinux独有的,目的是把生成的二进制文件加到rootfs的对应位置
这样不需要再手动把文件复制到rootfs

gedit project-spec/meta-user/recipes-apps/uvc-gadget/uvc-gadget.bb

原始文件
在这里插入图片描述

#
# This file is the uvc-gadget recipe.
#

SUMMARY = "Simple uvc-gadget application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://uvc-gadget.c \
	   file://Makefile \
		  "

S = "${WORKDIR}"

do_compile() {
	     oe_runmake
}

do_install() {
	     install -d ${D}${bindir}
	     install -m 0755 uvc-gadget ${D}${bindir}
}

修改后

SUMMARY = "Simple uvc-gadget application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://uvc-gadget.c \
file://uvc.h \
file://Makefile \
"
#INHIBIT_PACKAGE_STRIP = 1

S = "${WORKDIR}"

do_compile() {
	     oe_runmake
}

do_install() {
	     install -d ${D}${bindir}
	     install -m 0755 uvc-gadget ${D}${bindir}
}

4) 修改Makefile

github下载的源码是针对x86的,我们在嵌入式里面,需要修改对应 的Makefile文件

gedit project-spec/meta-user/recipes-apps/uvc-gadget/files/Makefile

原来的Makefile
https://github.com/wlhe/uvc-gadget/blob/master/Makefile

CROSS_COMPILE	?= 
ARCH		?= x86
KERNEL_DIR	?= /usr/src/linux

CC		:= $(CROSS_COMPILE)gcc
KERNEL_INCLUDE	:= -I$(KERNEL_DIR)/include -I$(KERNEL_DIR)/arch/$(ARCH)/include
CFLAGS		:= -W -Wall -g $(KERNEL_INCLUDE)
LDFLAGS		:= -g

all: uvc-gadget

uvc-gadget: uvc-gadget.o
	$(CC) $(LDFLAGS) -o $@ $^

clean:
	rm -f *.o
	rm -f uvc-gadget

修改后的Makefile

APP = uvc-gadget
APP_OBJS = uvc-gadget.o

all: $(APP)

$(APP): $(APP_OBJS)
	$(CC) $(LDFLAGS) -o $@ $(APP_OBJS) $(LDLIBS)

clean:
	-rm -f $(APP) *.elf *.gdb *.o

5) 编译Petalinux,生成镜像文件

依次运行以下命令编译并打包
如果要加快编译速度,一是在电源管理里面,设置为高性能,这样cpu才是全速
二是把虚拟机文件放在固态硬盘里面

time petalinux-build
cd images/linux
petalinux-package --boot --fsbl zynqmp_fsbl.elf --u-boot u-boot.elf --pmufw pmufw.elf --fpga system.bit --force

执行结果

[INFO] Sourcing buildtools
INFO: Getting system flash information...
INFO: File in BOOT BIN: "/opt/work/uvc-demo/xilinx-zcu104-2021.1/images/linux/zynqmp_fsbl.elf"
INFO: File in BOOT BIN: "/opt/work/uvc-demo/xilinx-zcu104-2021.1/images/linux/pmufw.elf"
INFO: File in BOOT BIN: "/opt/work/uvc-demo/xilinx-zcu104-2021.1/images/linux/system.bit"
INFO: File in BOOT BIN: "/opt/work/uvc-demo/xilinx-zcu104-2021.1/images/linux/bl31.elf"
INFO: File in BOOT BIN: "/opt/work/uvc-demo/xilinx-zcu104-2021.1/images/linux/system.dtb"
INFO: File in BOOT BIN: "/opt/work/uvc-demo/xilinx-zcu104-2021.1/images/linux/u-boot.elf"
INFO: Generating zynqmp binary package BOOT.BIN...


****** Xilinx Bootgen v2021.1
  **** Build date : May 28 2021-21:36:22
    ** Copyright 1986-2021 Xilinx, Inc. All Rights Reserved.


[INFO]   : Bootimage generated successfully

INFO: Binary is ready.

6) 对sd卡分区,并把文件复制到sd卡

参考这个链接,对sd卡进行分区
Petalinux快速入门向导 (14) 第十三章.制作带根文件分区的sd卡

然后把images/linux目录下的BOOT.BIN、image.ub、boot.scr复制到sd卡的分区1
/media/xlx/BOOT/是我挂载sd卡的目录,修改成你自己对应的目录

cp boot.scr /media/xlx/BOOT/
cp BOOT.BIN /media/xlx/BOOT/
cp image.ub /media/xlx/BOOT/

把rootfs复制到sd卡的分区2

sudo dd if=rootfs.ext4 of=/dev/sdc2

三、测试步骤

1) 在嵌入式Linux

登录系统,默认用户名和密码都是root

在控制台输入以下命令

modprobe usb_f_fs
modprobe g-webcam streaming_maxburst=15
modprobe vivid
uvc-gadget -u /dev/video0 -v /dev/video1 -t 15 -r 0 -n 2 &

执行结果如下,可以对照看输出是否正确

root@xilinx-zcu106-2019_2:~# modprobe g-webcam streaming_maxburst=15
[   59.365614] g_webcam gadget: uvc_function_bind
[   59.370191] g_webcam gadget: Webcam Video Gadget
[   59.374819] g_webcam gadget: g_webcam ready


root@xilinx-zcu106-2019_2:~# modprobe vivid
[   64.617618] vivid-000: using single planar format API
[   64.624545] vivid-000: CEC adapter cec0 registered for HDMI input 0
[   64.630924] vivid-000: V4L2 capture device registered as video1
[   64.636998] vivid-000: CEC adapter cec1 registered for HDMI output 0
[   64.643454] vivid-000: V4L2 output device registered as video2
[   64.649390] vivid-000: V4L2 capture device registered as vbi0, supports raw and sliced VBI
[   64.657768] vivid-000: V4L2 output device registered as vbi1, supports raw and sliced VBI
[   64.666043] vivid-000: V4L2 capture device registered as swradio0
[   64.672244] vivid-000: V4L2 receiver device registered as radio0
[   64.678347] vivid-000: V4L2 transmitter device registered as radio1


root@xilinx-zcu106-2019_2:~# uvc-gadget -u /dev/video0 -v /dev/video1 -t 15 -r 0 -n 2 &
[1] 2730
Requested Burst value = 15
Number of buffers requested = 2
V4L2 device is vivid on bus platform:vivid-000
V4L2: Getting current format: YUYV 640x360
V4L2: Setting format to: YUYV 640x360
V4L2: Getting current format: YUYV 640x360
v4l2 open succeeded, file descriptor = 3
uvc device is dwc3-gadget on bus gadget
uvc open succeeded, file descriptor = 4
V4L2: Buffer 0 mapped at address 0x7f9392b000.
V4L2: Buffer 1 mapped at address 0x7f938ba000.
V4L2: 2 buffers allocated.

2) 在主机Windows/Ubuntu输入以下命令

需要用到一根usb公对公的线,连接电脑和zcu104的usb口(J96)

在这里插入图片描述

在这里插入图片描述
打开设备管理器,可以看到在"照相机"下多了一个"UVC Camera"

安装potplayer
https://potplayer.daum.net/

ps

在2019.2中有可能报这个错

[ 10.690415] mmc0: Tuning failed, falling back to fixed sampling clock
[ 10.741866] mmc0: Tuning failed, falling back to fixed sampling clock

https://blog.csdn.net/weixin_31099291/article/details/113689988

&sdhci1 {
no-1-8-v;
};

Clean the device-tree sstate cache and rebuild the device-tree:

$ petalinux-build -c device-tree -x cleansstate
$ petalinux-build -c device-tree

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫采集框架——Scrapy初学入门

一、安装Scrapy依赖包 pip install Scrapy 二、创建Scrapy项目(tutorial) scrapy startproject tutorial 项目目录包含以下内容 tutorial/scrapy.cfg # deploy configuration filetutorial/ # projects Python module, youl…

Deformable Attention学习笔记

Deformable Attention学习笔记 Vision Transformer with Deformable Attention Abstract Transformer 最近在各种视觉任务中表现出卓越的表现。大的(有时甚至是全局的)接受域使Transformer模型比CNN模型具有更高的表示能力。然而,单纯扩大接受野也会引起一些问题…

Linux【进程间通信】

目录 一、什么是进程间通信 管道 管道的原理 匿名管道 1.简单写一个管道 2.总结管道的特点,理解以前的管道 3.扩展 如何写一个进程池? 创建Makefile文件 创建我们的任务头文件Task.cpp 创建我们的主程序文件 一、什么是进程间通信 进程的运…

java项目-第149期ssm师生交流平台_java毕业设计_计算机毕业设计

java项目-第149期ssm师生交流平台-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm师生交流平台》 该项目分为3个角色,管理员、学生和老师。 学生可以浏览前台查看教学资源、申请做作业、论坛信息、新闻资讯等信息查看。 同时可以跳转…

[MQ] 延迟队列/延迟插件下载

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

Linux基本指令3——文件操作

Linux内核:Centos 7.6 64位 find指令 按文件名查找文件的用法:find [路径] -name [文件名] 作用:可以查找目标文件 找到后用nano,通过绝对路径打开目标文件。目前只需要知道这种程度就行了。 grep指令 语法:gre…

浅谈非线性回归(non-linear regression)

文章目录浅谈非线性回归(non-linear regression)引言最小二乘多项式拟合非线性拟合Gauss–NewtonGauss–NewtonGauss–Newton算法[1]Levenberg–MarquardtLevenberg–MarquardtLevenberg–Marquardt算法[2]Quasi−NewtonQuasi-NewtonQuasi−Newton方法&a…

这样做框架结构图,让你的PPT更有创意!

已剪辑自: https://zhuanlan.zhihu.com/p/58834710 嗨,各位木友们好呀,我是小木。 昨天,有个跟我一样鸟人的鸟人让我帮忙做个框架结构图: 可惜当时我不在办公室,不然我真的一分钟就能把图做给他… ▼ 在文本框里输入…

RabbitMQ_交换机

简单理解交换机在RabbitMQ中扮演的角色 交换机在RabbitMQ中扮演消息系统中枢,将从生产者处收集的消息转发至对应的消息队列处,等待消费者消费 提前说明交换机 与 routing key 与 消息队列的关系 channel.queueBind(queueName, exchangeName, routingKey)…

git4:git整合IDEA和国内代码托管中心码云(自建代码托管平台)

1.配置忽略文件 IDE会生成.idea等无关项目实际功能的文件忽略这些文件配置.ignore 然后再讲此配置文件导入.gitconfig文件中idea中导入git程序 2.测试IDEA vcs 直接项目中 git add commit即可切换版本(提交第二版,修改会变成蓝色,然后提交…

血泪史!外包如何找到靠谱的兼职程序员?

好哥们公司上半年的重点项目,黄了。 公司是做线下项目起家的,受到各种不可抗力因素影响改为线上举办。这次的转型老板很看重,但由于整个公司都没有擅长这块的技术开发,于是托朋友找了个外包团队完成。 几十个W花进去,做…

进销存记账软件十大品牌合集,看看哪一款适合你

随着管理成本的提高,加上信息技术的发展,各行各业都要求应用专业的技术软件来提高管理效率,中小商户也不例外。 过往的手工记账已经满足不了需求,进销存记账软件应运而生。 进销存记账软件是时代的产物,也是中小商户…

带你Java入门(Java系列1)

目录 前言: 1.什么是Java 2.Java的语言特点 3.初识Java的main方法 4.注释 5.标识符 6.关键字 7.1基本数据类型 7.2引用数据类型 8.变量 8.1.整形变量 8.2.长整形变量 8.3浮点型变量 8.3.1单精度浮点型 8.3.2双精度浮点型 8.4字符型变量 8.5布尔型…

【计算机网络:自顶向下方法】(二)应用层

tm 【计算机网络:自顶向下方法】(二)应用层 文章目录应用层如何创建一个新的网络应用?2.1 应用层原理网络应用的体系结构对等模式(P2P:Peer To Peer)混合体:客户-服务器和对等体系结构进程通信分布式进程通信需要解决的问题问题1:进程…

CorelDRAW2023全新版功能及下载安装教程

CorelDraw2023是一款优秀的图形工具。有了它,不太专业的客户也可以做直观和简短的组成,由于其平滑和简单的用户界面。你可以一起做很多编辑工作。有了这个巨大的工具,你可以对你的图像、网站、商标和其他许多东西产生美丽而令人印象深刻的效果…

DJYOS驱动开发系列一:基于DJYOS的UART驱动编写指导手册

1.概述 DJYOS设计通用的串口驱动模型,在此模型的基础上,移植到不同硬件平台时,只需提供若干硬件操作函数,即可完成串口驱动开发,使开发工作变得简单而快速执行效率高。 DJYOS源代码都有特定的存放位置, 建…

DJYGUI系列文章五:GK显示器接口

1 GK显示器接口概述 显示器是图形显示的终端,图形的所有操作都会直接或间接的体现在显示器上面。DJYGUI支持多显示器、虚显示器和镜像显示器的功能。应用程序在调用API函数绘图前,需安装显示器,按照GK显示器标接口实现驱动函数。 GK的底层硬件…

DCS系统组态设计实验

太原理工大学控制仪表实验之DCS系统组态设计实验 DCS系统组态设计一.实验内容1.根据自己的理解,复述实验整体流程,并画出实验整体流程图。2.根据视频,写出DCS 信号通道接线关系表。即主控站DCS模块名称,模块型号,I/O模…

跟艾文学编程《Python基础》(5)Python的文件操作

作者: 艾文,计算机硕士学位,企业内训讲师和金牌面试官,公司资深算法专家,现就职BAT一线大厂。邮箱: 1121025745qq.com博客:https://wenjie.blog.csdn.net/内容:跟艾文学编程《Python…

linux网络编程epoll内核实现代码分析

1、linux内核epoll相关数据结构 1.1、epoll相关数据结构类图 1.2、关键数据结构说明 socket_wq结构体包含一个__wait_queue_head成员,__wait_queue_head用于连接wait_queue_t链表,对于epoll而言就是连接eppoll_entry; eppoll_entry包含一个e…