首页 > 其他分享 >Intel710驱动代码分析-i40e_driver

Intel710驱动代码分析-i40e_driver

时间:2023-12-06 17:01:54浏览次数:28  
标签:Intel710 I40E driver DEV PCI i40e ID INTEL

由于研究学习的需要,要对intel XL710网卡的驱动代码进行分析,主要分析其VF的相关代码,整个代码量相当大,有数万行。当然我也是从头开始学,一点一点分析并记录在51cto的博客中,如果大家在阅读过程中发现有错误,请及时提出,另外我会专门开一个专栏,用来记录对每个函数的分析,有些可能会对每行代码进行分析。


代码在github上有共享链接在这:i40e 大家如有需要可自行下载。

那么今天就从i40e的驱动中i40e_driver的这个结构体出发,一点一点抽丝剥茧来看来分析。


首先一个设备的驱动程序,一般来说都有一个接口,因为一个硬件插入到主机当中,一定是要通过驱动来讲这个设备注册到系统里,通过初始化模块来注册,基本每个驱动都会包含这样一个结构体:

在驱动i40e_main.c函数中的大致18386行的位置。也可以搜索这个名字找到。

Intel710驱动代码分析-i40e_driver_pci_driver

上图是710代码中的i40e驱动,其中包含了name、probe、 remove(移除设备)、shutdown(关闭设备) 等等还有一些是不同驱动的不同特性,这个结构体的主要作用就是用来想操作系统注册该设备。

我们在这段代码中主要关心两个一个是i40e_probe,这是个函数,用以对驱动中模块的初始化。

还有个是sriov_configure,sriov就是虚拟化,也就是vf。这个定义是由pcie标准中提出的。简单理解就是像操作系统中有虚拟机一样,给网卡设备也增加了类似虚拟机的功能,称之为VF,他们相互隔离,共用一个硬件设备。提高网卡的性能。

大概的介绍完毕了,我们来具体的看一看这个结构体:

首先

.name     = i40e_driver_name,

其中的name是驱动设备的名称

i40e_driver_name

我们可以点进去。是一个char类型的数组:

char i40e_driver_name[] = "i40e";

也就是驱动程序的名称:i40e。

紧接着第二个:

.id_table = i40e_pci_tbl,

id_table指的是PCI设备的ID表,指向i40e_pci_tbl,用于匹配驱动程序和PCI设备。

详细内容如下:

static const struct pci_device_id i40e_pci_tbl[] = {
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_SFP_XL710), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_QEMU), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_KX_B), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_KX_C), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_QSFP_A), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_QSFP_B), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_QSFP_C), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_5G_BASE_T_BC), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_10G_BASE_T), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_10G_BASE_T4), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_10G_BASE_T_BC), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_10G_SFP), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_10G_B), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_20G_KR2), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_20G_KR2_A), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_X710_N3000), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_XXV710_N3000), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_KX_X722), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_QSFP_X722), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_SFP_X722), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_1G_BASE_T_X722), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_10G_BASE_T_X722), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_SFP_I_X722), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_25G_B), 0},
	{PCI_VDEVICE(INTEL, I40E_DEV_ID_25G_SFP28), 0},
	/* required last entry */
	{0, }
};

第三个:设备的探针(探测函数)

.probe    = i40e_probe,

用于pci设备被发现时调用。

第四个:设备移除函数

.remove   = i40e_remove,

指向了i40e_remove函数,用于从操作系统中移除该驱动程序。

其中有个宏:

#ifdef HAVE_CONFIG_HOTPLUG
	.remove   = __devexit_p(i40e_remove),
#else
	.remove   = i40e_remove,
#endif

该宏指的是是否支持热插拔,根据宏判断选择执行哪个移除函数。

第五个:关机函数

.shutdown = i40e_shutdown,

指向设备关机函数 i40e_shutdown,在系统关机时调用。

第六个:错误处理函数

.err_handler = &i40e_err_handler,

如果系统支持 PCI 错误恢复(PCI Error Recovery System),则指向错误处理函数 i40e_err_handler。

第七个:虚拟化配置

.sriov_configure = i40e_pci_sriov_configure,

如果系统支持 SR-IOV(Single Root I/O Virtualization),则指向 SR-IOV 配置函数 i40e_pci_sriov_configure。

其中还有个COFIG_PM,这个是电源管理

#ifdef CONFIG_PM
#ifdef USE_LEGACY_PM_SUPPORT
	.suspend  = i40e_legacy_suspend,
	.resume   = i40e_legacy_resume,
#else /* USE_LEGACY_PM_SUPPORT */
	.driver   = {
		.pm = &i40e_pm_ops,
	},
#endif /* !USE_LEGACY_PM_SUPPORT */
#endif /* CONFIG_PM */

如果系统支持电源管理(CONFIG_PM 定义),则指向电源管理操作结构 i40e_pm_ops。这是用于支持设备的挂起和恢复操作。

suspend 和 resume:如果系统不使用遗留的电源管理支持,而是使用新的 PM runtime 框架,那么会使用这两个回调函数。

最后有两个:

#ifdef HAVE_RHEL6_SRIOV_CONFIGURE
	.rh_reserved = &i40e_driver_rh,
#endif
#ifdef HAVE_RHEL7_PCI_DRIVER_RH
	.pci_driver_rh = &i40e_driver_rh,
#endif

rh_reserved、pci_driver_rh:这些属性可能与 Red Hat Enterprise Linux 特定的配置有关,用于指定一些特殊的配置或回调。这两个我们不作关系。

总体而言,这个结构体描述了 i40e 驱动程序的一些基本信息和操作回调函数,用于注册到 PCI 子系统中,方便后续驱动的执行。


这个结构体一般是用在以下这个函数中:

static int __init i40e_init_module(void)
{
	pr_info("%s: %s - version %s\n", i40e_driver_name,

		i40e_driver_string, i40e_driver_version_str);
	pr_info("%s: %s\n", i40e_driver_name, i40e_copyright);


	i40e_wq = alloc_workqueue("%s", 0, 0, i40e_driver_name);
	if (!i40e_wq) {
		pr_err("%s: Failed to create workqueue\n", i40e_driver_name);
		return -ENOMEM;
	}
#ifdef HAVE_RHEL7_PCI_DRIVER_RH
#endif
	i40e_dbg_init();
	return pci_register_driver(&i40e_driver);
}
module_init(i40e_init_module);

其中module_init是个linux内核函数,用来加载模块,加载的模块就是上面 i40e_init_module,这个函数实际意义就是要执行上面的那个结构体。通过调用pci_register_driver来执行。

那么以上就是i40e_driver的一些基本内容分析以及模块注册。

后续我会继续分析710这个驱动,当然主要是跟虚拟化VF有关的代码。


标签:Intel710,I40E,driver,DEV,PCI,i40e,ID,INTEL
From: https://blog.51cto.com/u_16160587/8707024

相关文章

  • xv6 device driver
    Interruptsanddevicedrivers驱动程序是操作系统中管理特定设备的代码:它配置设备硬件,告诉设备执行操作,处理由此产生的中断,并与可能等待设备I/O的进程进行交互。驱动程序需要与它所管理的设备并发执行并且必须理解设备的硬件接口,编写代码可能很棘手。设备通常可以产生中断,内核......
  • docker故障:driver failed programming external connectivity on endpoint
    故障现象Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpointjenkins(ffdc7c9cda72c575d6b045574d1432b256603a3d986a05da319ab7f3af233755):(iptablesfailed:iptables--wait-tnat-ADOCKER-ptcp-d0/0--dport50000-jDN......
  • applicationMaster和driver有啥区别
    在ApacheHadoop和ApacheSpark等分布式计算框架中,有两个重要的概念,即ApplicationMaster(应用程序主管)和Driver(驱动程序)。它们在不同的框架中可能有一些细微的差异,下面是它们的一般定义和区别:ApplicationMaster(应用程序主管):概念:ApplicationMaster是在HadoopYARN和类似框......
  • # yyds干货盘点 # chrome老更新的话 driver怎么才能保持更新呢?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【鶏啊鶏。】问了一个selenium驱动器的问题,一起来看看吧。问题描述:有没有selenium用的比较多的大佬 想问问一些selenium的定时任务 关于chrome老更新的话 driver怎么才能保持更新呢二、实现过程后来【瑜亮老师】给了一......
  • chrome老更新的话 driver怎么才能保持更新呢?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【鶏啊鶏。】问了一个selenium驱动器的问题,一起来看看吧。问题描述:有没有selenium用的比较多的大佬 想问问一些selenium的定时任务 关于chrome老更新的话 driver怎么才能保持更新呢二、实现过程后来【瑜亮老师】给......
  • docker使用--gpus all报错: docker: Error response from daemon: could not select d
    报错信息:docker:Errorresponsefromdaemon:couldnotselectdevicedriver""withcapabilities:[[gpu]].解决方法:1,任意路径下创建nvidia-container-runtime-script.sh文件vimnvidia-container-runtime-script.sh拷贝下方内容到nvidia-container-runtime-script.......
  • 2.5 Windows驱动开发:DRIVER_OBJECT对象结构
    在Windows内核中,每个设备驱动程序都需要一个DRIVER_OBJECT对象,该对象由系统创建并传递给驱动程序的DriverEntry函数。驱动程序使用此对象来注册与设备对象和其他系统对象的交互,并在操作系统需要与驱动程序进行交互时使用此对象。DRIVER_OBJECT对象还包含了与驱动程序所管理的设备......
  • selenium报错result.webdriverValue.value
    1.示例代码fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get('http://124.223.30.31:xxx/forum.php')driver.find_element('id','ls_username').send_keys('admin')端口我匿了这个代码是没有问题的,任意其他代码在当前的环境下都是会出现这个错......
  • 如何查虚拟机中的文件在哪个路径(eg:ChromeDriver)
     要查找虚拟机中ChromeDriver的路径,您可以使用which命令或find命令。以下是两种方法:使用which命令。在终端中输入以下命令:whichchromedriver如果ChromeDriver已经在系统的PATH环境变量中,该命令将返回ChromeDriver的完整路径。否则,将返回空值。使用find命令。在终端中......
  • 分享一个神器,可以永远告别chromedriver和chrome浏览器版本不匹配、爬虫无法运行的问题
    一、下载地址:介绍地址:https://pypi.org/project/chromedriver-py/ 下载安装:pipinstallchromedriver-py二、介绍chromedriver-py是一个Python包,提供了一个简单的接口,用于在Python项目中下载和使用GoogleChromeWebDrive(chromedriver)。通过使用chromedriver-py,开发人员可......