Linux PCI总线-PCI空间

  • 2. PCI 总线地址空间映射
    • 2.1 X86平台地址空间映射
    • 2.2 龙芯平台地址空间映射
    • 2.3 X86配置空间寄存器
    • 2.4 龙芯平台配置空间寄存器
  • 3. PCI 配置空间头部寄存器
    • 3.1 PCI 设备配置空间
    • 3.2 PCI桥设备
  • 参考

如图所示,在基于 PCI总线的系统中,有多个存储器实体,挂连在Host桥上的主存储器、各级PCI总线上PCI设备中的存储器及ISA 总线上ISA 设备中的存储器。各级总线上的存储器实体在物理位置上尽管分布于各处,但在系统中是组织成一个整体的,这个整体的存储器空间为各级主设备所共有,这里称为系统存储器空间。

各存储器实体与系统存储器空间的映射关系,也就是各实体在系统存储器空间中所占的位置,是由Host桥和扩展总线桥中的一些配置寄存器共同确定的。下图粗略地给出了这种映射关系,图中以处理器和PCI主设备都采用32位存储器地址为例,故系统存储器空间为4GB。主桥内有关主存管理的配置寄存器将主存映射于低地址空间,并可设定主存顶(即主存大小)。

另外PCI总线具有32位数据/地址复用总线,所以其存储地址空间为2的32次方=4GB。也就是PCI上的所有设备共同映射到这4GB上,每个PCI设备占用唯一的一段PCI地址,以便于PCI总线统一寻址。每个PCI设备通过PCI寄存器中的基地址寄存器来指定映射的首地址。

系统IO 空 间 也 类 似,分 布 在 Host桥、PCI设备、PCI/ISA桥及ISA设备中的IO寄存器组织成系统IO 空 间,其 中 HOST桥 内 的IO 寄 存 器 固 定 占0XCF8h~0XCFFh 地址;PCI/ISA 桥和ISA 设备内IO寄存器的地址也是固定 的,与 PC/AT 结 构 微 机 兼容,多数分布在0~1KB 内;其余为PCI设备占用。

2. PCI 总线地址空间映射

2.1 X86平台地址空间映射

  • PCI 有 3 种地址空间:PCI I/O 空间PCI 内存地址空间PCI 配置空间。PCI地址空间在系统空间中的位置及映射关系如上图所示,CPU 可以访问所有的地址空间,其中 PCI I/O 空间和 PCI 内存地址空间由设备驱动程序使用。PCI 支持自动配置设备,与旧的 ISA 驱动程序不一样,PCI 驱动程序不需要实现复杂的检测逻辑。由于PCI支持即插即用,所以PCI设备不是占用固定的内存地址空间或I/O地址空间,而是可以由操作系统决定其映射的基址。

    • PCI 内存地址空间:针对32bit 寻址,⽀持4G 的地址空间,针对64bit 寻址,⽀持16EB 的地址空间;
    • PCI I/O 空间:PCI 最⼤⽀持4G 的IO 空间,但受限于x86 处理器的IO 空间(16bits 带宽),很多平台将PCI 的IO 地址空间限定在64KB ;
    • PCI 配置空间:每个PCI 功能最多可以有256 字节的配置空间;PCI 总线在进⾏配置的时候,采⽤ID译码⽅式,使⽤设备的ID号,包括 Bus NumberDevice NumberFunction NumberRegister Number ,每个系统⽀持256 条总线,每条总线⽀持32 个设备,每个设备⽀持8个功能,由于每个功能最多有256 字节的配置空间,因此总的配置空间⼤⼩为:256B * 8 * 32 * 256 = 16M ;配置空间只能由处理器通过 Host桥来访问。CPU能访问存储器或IO 地址空间,但不支持直接访问配置地址空间。PCI规范规定了CPU间接访问 PCI配置空间的方法,通过 Host桥中映射为IO 的一个地址端口和一个数据端口来索引和访问。
  • 启动时,BIOS 或内核自身会遍历 PCI 总线并分配资源,如中断优先级和 I/O 基址。设备驱动程序通过 PCI 配置空间来找到资源分配情况。所以,所有的PCI设备必须实现配置空间,从而能够实现参数的自动配置,实现真正的即插即用。

  • PCI总线规范定义的配置空间总长度为256个字节,配置信息按一定的顺序和大小依次存放。前64个字节的配置空间称为配置头,对于所有的设备都一样,配置头的主要功能是用来识别设备、定义主机访问PCI卡的方式(I/O访问或者存储器访问,还有中断信息)。其余的192个字节称为本地配置空间(设备有关区),主要定义卡上局部总线的特性、本地空间基地址及范围等。

  • PCI/PCIe设备有自己的独立地址空间,这部分空间会映射到整个系统的地址空间。

    映射地址在BIOS/UEFI下指定(如果有的话,对于使用非BIOS启动的OS,不清楚),它有两种类型,一种是MMIO,一种是IO。对于MMIO的访问,跟访问内存的方式一样,它从称为PCIEXBAR的基地址开始,有很大的一段空间,这个PCIEXBAR的值根据不同的平台可能不同,大致可能值有0xC00000000xE0000000等,关于这个值是怎么使用的后面的章节会讲到;对于IO,它是一种比较老的访问PCI/PCIe设备的方式,而且占有的空间相比MMIO非常小,好像只有64K的空间。

    PCI/PCIe设备使用的空间也有两个部分,一部分称为配置空间(通过MMIO);另一部分通过配置空间的BAR寄存器指定,是设备实现功能所需要用到的地址空间(有MMIO也有IO, 不过IO用的比较少了)。

2.2 龙芯平台地址空间映射

作为 HT 接口的桥片,桥片内部支持 40 位的地址空间。在不使用 SWIOTLB 的情况下,龙芯3 号处理器+桥片最大支持 1TB 的内存地址空间。为了支持多处理器系统,我们将桥片内部地址的某几位(最多 4 位)作为桥片内部设备 DMA 访问的目的结点号使用。也就是说,桥片最多可以支持 16 个结点的处理器系统。考虑到,实际应用中龙芯最大使用 4 个结点的系统,因此,本节以最大支持 4 个结点进行说明。对于 4 个结点的系统来说,单个处理器结点的地址空间大小为 256GB。

从 CPU 的视角——即 CPU 可访问的设备地址空间——来看,桥片的地址空间包括 3 部分:配置空间PCI I/O 空间PCI MEM 空间。桥片的地址空间与 PCI 定义的地址空间形式相同。

  1. 配置空间:该地址空间用来访问桥片内部设备(包括通过 PCIE 总线扩展的设备)的配置头,其地址组成符合 PCI 配置访问的地址组织形式;
  2. I/O 空间:该地址空间用于访问 PCI 协议定义的 I/O 地址空间。在桥片中只有 PCIE 有这段地址空间,用于通过 I/O 类型的请求访问 PCIE 控制器的下游设备。
  3. MEM 空间:除了以上两种地址空间之外的所有地址空间为 MEM 空间。
  • 桥片的配置空间对应于 HT 总线的 HT 总线配置空间,大小为 32MB
  • 桥片的 PCI I/O 空间对应于 HT 总线 I/O 空间,大小为 32MB
  • 桥片的 PCI MEM 空间对应于 HT 总线的 MEM 空间,大小为 1012GB
  • PCI MEM 空间用来访问桥片内部 PCIE 设备的 MEM 空间和除 PCIE 设备外的其他设备的 MEM 和 IO 空间,以及桥片的配置寄存器空间。

后两种地址空间(PCI I/O 空间和 PCI MEM 空间)是整个处理器地址空间的一部分,系统软件可以将它们分配到 0 ~ 1TB 的任意位置*,软件在访问时,需要通过处理器的一级 XBAR 将它们映射到 HT1 的地址空间段内或者直接添加 HT1 的地址空间偏移到该访问地址上。
PS:除了地址段 0x0f000000~0x0fffffff。这段地址不可用作桥片设备地址空间。

从 DMA 访问的视角——即桥片内部设备主动发起的访存地址空间——来看,可使用的地址空间包括:处理器的内存空间和桥片的显存空间。处理器的内存空间大小根据系统的结点个数而不同,总的 DMA 地址空间的大小为 1TB。对于 4 个结点的系统,DMA 的地址空间必须位于结点地址空间的低 256GB 以内,这样桥片可以直接访问最多 4 个结点的内存。桥片内部可以发起 DMA 操作的设备包括:GPU、DC、PCIE、USB、SATA、GMAC、HDA 和 AC97。

上述两类地址(桥片的地址空间和处理器的地址空间)采用统一编址的方式,即处理器的内存空间、处理器的配置空间、桥片的配置访问空间、I/O 空间和 MEM 空间,都位于同一地址空间内,且互不重合。对于单个结点系统来说,这个地址空间的大小最大为 1TB

桥片内部设备的访问地址(PCI I/O 空间和 PCI MEM 空间)采用软件可配置设计,支持 PCI体系架构的设备发现与管理。桥片内部的每个设备(设备块)都包含一个PCI配置头。软件通过访问配置头可以获得该设备的类型、支持的地址空间大小等信息,并通过配置该设备的BAR 寄存器设置该设备的地址空间。该方式与 780E 一致。

龙芯 3A+桥片片的一种地址空间划分方式如图所示:

PS:图中地址为低位地址,不包含结点号和高位地址。

  • 0x0000,0000 ~ 0x0fff,ffff 为系统的低 256MB 内存空间。
  • 0x1000,0000 ~ 0x17ff,ffff 为桥片的固定设备地址空间,这些设备包括中断控制器、HPET、confbus、MISC 低速设备以及 LPC。这段地址通过一级 XBAR 的配置窗口映射到0xe00,1000,0000 ~ 0xe00,17ff,ffff(HT1 的 MEM 空间)
  • 0x1800,0000 ~ 0x19ff,ffff 为桥片的 PCI I/O 空间,软件可以将桥片内 PCIE 设备的 I/O 空间分配到这段地址空间内,这段地址通过一级 XBAR 的配置窗口映射到 0xefd,fc00,0000 ~0xefd,fdff,ffff(HT1 的 I/O 空间)。
  • 0x1a00,0000 ~ 0x1bff,ffff 为桥片的配置空间,用来访问桥片内部设备的配置头,访问方式与PCI 协议兼容,地址位的 bit[23:8]依次对应 bus 号、设备号、func 号,这段地址通过一级 XBAR的配置窗口映射到 0xefd,fe00,0000 ~ 0xefd,ffff,ffff(HT1 的总线配置空间)。
  • 0x1c00,0000 ~ 0x1dff,ffff 为 3A 的 LPC MEM 地址空间。
  • 0x1f00,0000 ~ 0x1fff,ffff 为 3A 的低速设备空间。
  • 0x2000,0000 ~ 0x2fff,ffff 为处理器的保留空间。
  • 0x3000,0000 ~ 0x3fff,ffff 为 3A 的配置空间。
  • 0x4000,0000 ~ 0x7fff,ffff 为桥片的 PCI MEM 空间,这段地址通过一级 XBAR 的配置窗口映射到 0xe00,4000,0000~0xe00,7fff,ffff(HT1 的 MEM 空间)。
  • 0x8000,0000 ~ MEM_UP_LIMIT 为 3A 的高内存地址空间。
  • MEM_UP_LIMIT ~ 0xfc,ffff,ffff 为桥片的 PCI MEM 空间,这段地址通过一级 XBAR 的配置窗口映射到 0xe00,0000,0000+MEM_UP_LIMIT ~ 0xefc,ffff,ffff(HT1 的 MEM 空间)。

2.3 X86配置空间寄存器

之前说过,PCI的配置空间通过Host桥,映射位一个IO 的一个地址端口和一个数据端口来索引和访问,其中地址端口位于IO地址0XCF8h~0XCFBh ,数据端口映射到0XCFCh~0XCFFh 。可通过访问0xCF8h0xCFCh端口来实现访问配置空间。

0xCF8h: CONFIG_ADDRESS /*PCI配置空间地址端口*/
0xCFCh: CONFIG_DATA /*PCI配置空间数据端口*/

CONFIG_ADDRESS寄存器格式:

31 位: Enabled位。
23:16 位: 总线编号。
15:11 位: 设备编号。
10: 8 位:功能编号。
7: 2 位:配置空间寄存器编号。
1: 0 位:恒为“00”。这是因为CF8h、CFCh端口是32位端口。

PCIe规范在PCI规范的基础上,将配置空间扩展到4KB。原来的CF8/CFC方法仍然可以访问所有PCIe设备配置空间的头255B,但是该方法访问不了剩下的(4K-255)配置空间。怎么办呢?Intel提供了另外一种PCIe配置空间访问方法:通过将配置空间映射到Memory map IO(MMIO)空间,对PCIe配置空间可以像对内存一样进行读写访问了。如图

这样再加上PCI板子上的RAM或者ROM,整个PCIe Device空间如下图:

MMIO这段空间有256MB,因为按照PCIe规范,支持最多256个buses,每个Bus支持最多32个PCI devices,每个device支持最多8个function,也就是说:占用内存的最大值为:256 * 32 * 8 * 4K = 256MB。在台式机上我们很多时候觉得占用256MB空间太浪费(造成4G以下memory可用空间变少,虽然实际memory可以映射到4G以上,但对32位OS影响很大),PCI Bus也没有那么多,所以可以设置成最低64MB,即最多64个Bus。那么这个256MB的MMIO空间在在哪里呢?我们以Intel的Haswell平台为例:

其中PCIEXBAR就是这个MMIO的起始位置,在4G下面占据64MB/128MB/256MB空间(4G以上部分不在本文范围内,我们今后会详细介绍固件中的内存布局),其具体位置可以由平台进行设置,设置寄存器一般在Root complex(下文简称RC)中。

现在有个难题——CF8hCFCh端口是32位端口,可像Turbo C之类的16位C语言编译器都不支持32位端口访问。怎么办?我们可以使用**_ _ emit _ 在程序中插入机器码。每次都 _ emit _ _一下肯定很麻烦,所以我们应该将它封装成函数。代码如下(注意66h是32位指令前缀)**:

/* 读32位端口 */
DWORD inpd(int portid)
{DWORD dwRet;asm mov dx, portid;asm lea bx, dwRet;__emit__(0x66, 0x50,       // push EAX0x66, 0xED,        // in EAX,DX0x66, 0x89, 0x07,  // mov [BX],EAX0x66, 0x58);       // pop EAXreturn dwRet;
}
/* 写32位端口 */
void outpd(int portid, DWORD dwVal)
{asm mov dx, portid;asm lea bx, dwVal;__emit__(0x66, 0x50,       // push EAX0x66, 0x8B, 0x07,  // mov EAX,[BX]0x66, 0xEF,        // out DX,EAX0x66, 0x58);       // pop EAXreturn;
}

2.4 龙芯平台配置空间寄存器

龙芯平台的7A桥片中的 PCIE 控制器内有标准的 PCIE 配置头,因此 PCIE 控制器的内部寄存器以及其下游设备的地址空间都通过其配置头的信息来管理。配置头中地址相关的寄存器在 PCI 设备扫描时确定。

因为桥片的 PCIE 控制器仅可以工作在 RC 模式下,所以其配置头为 TYPE1 类型。

每个 PCIE 端口作为桥片中的独立设备,每个端口都包含一个 PCIE 配置头。当 PCIE 工作在
X4 模式时,其他 X1 的端口软件不可见,只有当 PCIE 工作在 X1 模式时才可以访问其他 X1
端口。
对于每一个 PCIE 端口,其地址空间可以分为以下几部分:

配置头地址空间:该部分空间对应 PCIE 的配置头,通过配置请求来访问,最大 4KB。若要访问256字节,可以查看下文。

配置访问地址空间:该部分地址空间用于通过配置请求访问 PCIE 控制器的下游设备配置头信息。根据下游设备的 Bus 号,由 PCIE 控制器决定发送 TYPE0 类型还是 TYPE1 类型的配置访问。

以上两个地址空间的地址由配置地址空间基地址、BUS 号、设备号、功能号以及寄存器偏移地址计算得出,访问以字为单位。

PCIE 控制器内部寄存器空间:该部分地址空间用于访问 PCIE 控制器的内部寄存器。这些寄存器用于控制 PCIE 控制器的行为和特性,与 PCIE 配置头空间属于两个地址空间。该地址空间为 MEM 类型,64 位地址空间,大小为 4KB,基地址等于 64 位 BAR0 的值,该值在初始化时由 PCI 扫描软件分配。

MEM 地址空间:该部分地址空间包含了 PCIE 控制器下游设备的所有 MEM 地址空间。对于32 位地址空间,由 PCIE 配置头的 memory base 和 memory limit 决定;对于 64 位地址空间,由 PCIE 配置头的 prefetchable memory base(组合 upper 32bits)和 prefetchable memory limit(组合 upper 32bits)决定。该段地址空间由 PCIE 配置头的 command 寄存器 bit1 位来使能控制。

I/O 地址空间:该部分地址空间包含了 PCIE 控制器下游设备的所有 I/O 地址空间。由 PCIE 配置头的 IO base(组合 upper 16bits)和 IO limit(组合 upper 16bits)决定。该段地址空间由PCIE 配置头的 command 寄存器 bit0 位来使能控制。

对于 MEM 地址空间和 I/O 地址空间来说,如果在 X1 工作模式下,某个 X1 端口下游没有连接设备,通过设置 command 寄存器的 bit0 和 bit1 为 0 即可禁用其 MEM 和 I/O 地址空间。

处理器可以通过两个地址空间来访问桥片的配置空间。一个是 HT 定义的标准配置访问空间(0xFD_FE00_0000 –0xFD_FFFF_FFFF),另一个是 HT 的保留地址空间(0xFE_0000_0000 –0xFE_1FFF_FFFF)。通过 HT 标准配置访问空间访问的每个桥片设备的配置空间大小为 256字节;通过保留地址空间访问的每个桥片设备的配置空间大小为 4K 字节。

当使用 HT 定义的标准配置访问空间(0xFD_FE00_0000–0xFD_FFFF_FFFF)来访问桥片时,每个设备的最大配置空间大小为 256 字节。其中,地址的[39:24]决定配置头类型(0xFDFEType00xFDFFType1);[23:16]表示总线号(Bus Number);[15:11]表示设备号(Device Number);[10:8]表示功能号(Function Number); [7:0]表示偏移(offset)。

CPU使用 HT 标准配置访问空间访问 PCI 配置空间的地址段含义示意图如图所示:

当使用 HT 的保留地址空间(0xFE_0000_0000 – 0xFE_1FFF_FFFF)来访问桥片时,每个设备的最大配置空间大小为 4K 字节。其中,地址的[39:28]决定配置头类型(0xFE0Type00xFE1Type1);[23:16]表示总线号(Bus Number);[15:11]表示设备号(Device Number);[10:8]表示功能号(Function Number);[27:24][7:0]组合起来表示偏移(offset)。下图是 CPU使用 HT 保留地址空间访问 PCI 配置空间的地址段含义示意图。

在一般情况下,推荐使用 HT 标准配置访问空间(0xFD_FE00_0000–0xFD_FFFF_FFFF)来进行 PCI 配置头访问。

3. PCI 配置空间头部寄存器

每个功能256Byte ,前边64Byte 是Header ,剩余的192Byte ⽀持可选功能。PCI 规范定义了 3 种类型的 PCI 配置空间头部,有两种说法,一种说法是: type 0 用于标准的 PCI 设备,type 1 用于 PCI 桥,type 2 用于 PCI CardBus 桥。另外一种说法是 type 0 用于标准的 PCI 设备,type 1 用于 PCI 桥。本文只进行第二种的介绍。

3.1 PCI 设备配置空间

标准的 PCI 设备配置空间如图所示:


Vendor IDDevice ID:标记了一个设备的生产厂商和具体的设备,比如Intel的设备Vendor ID通常是0x8086Device ID就需要厂家自定义了,总之能够识别到具体是哪个设备就可以了。

Status:设备状态字,具体每个BIT的意义见下图:

Command:设备状态字:

Base Address Registers:也就是 BAR空间 ,当PCI设备的配置空间被初始化后,该设备在PCI总线上就会拥有⼀个独⽴的PCI总线地址空间,这个空间就是 BAR空间 , BAR空间决定PCI/PCIe设备空间映射到系统空间具体位置的寄存器,映射方式有两种,分别是IO和Memory映射:


处理器系统资源分为IO资源和MMIO资源两种,因此PCI/PCIe空间地址对应也有两种。

3.2 PCI桥设备

下面是Bridge的配置空间,它的类型被称为Type 01h:


配置空间中最重要的有:

Vendor ID:厂商ID。知名的设备厂商的ID。FFFFh是一个非法厂商ID,可它来判断PCI设备是否存在。
Device ID:设备ID。某厂商生产的设备的ID。操作系统就是凭着 Vendor ID和Device ID 找到对应驱动程序的。
Class Code:类代码。共三字节,分别是 类代码、子类代码、编程接口。类代码不仅用于区分设备类型,还是编程接口的规范,这就是为什么会有通用驱动程序。
IRQ Line:IRQ编号。PC机以前是靠两片8259芯片来管理16个硬件中断。现在为了支持对称多处理器,有了APIC(高级可编程中断控制器),它支持管理24个中断。
IRQ Pin:中断引脚。PCI有4个中断引脚,该寄存器表明该设备连接的是哪个引脚。

参考

  1. PCIe扫盲——BDF与配置空间/配置空间的读写机制/Type0 & Type1 型配置请求
  2. PCI配置空间简介

Linux PCI总线-PCI空间相关推荐

  1. PCI总线---PCI设备扫描过程

    8.2 PCI设备扫描过程 Linux内核具备多种PCI的扫描方式,它们之间大同小异. 本节使用传统的扫描方式 执行 pci_legacy_init函数,定义在legacy.c 文件中 : stati ...

  2. linux设备驱动之PCI总线概述

    文章目录 总线概念 PCI总线 PCI总线体系结构 PCI设备寻址 PCI寻址 配置寄存器 总线概念 总线是一种传输信号的信道:总线是连接一个或多个半导体的电气连线.总线由电气接口和编程接口组成,对于 ...

  3. PCI总线的桥与配置(二)

    PCI桥与PCI设备的配置空间 PCI设备都有独立的配置空间,HOST主桥通过配置读写总线事务访问这段空间.PCI总线规定了三种类型的PCI配置空间,分别是PCI Agent设备使用的配置空间,PCI ...

  4. PCI——第1章——PCI总线的基本知识

    摘要:对PCI 总线基本知识的整理,建议看完三章内容后再来进行总结或者阅读 目录 1.PCI基础知识 1. 1 PCI 总线的组成结构 HOST主桥 PCI 总线 PCI 设备 HOST处理器 PCI ...

  5. linux下看pcie的设备id,linux lspci查看pci总线设备信息

    linux lspci查看pci总线设备信息 linux中lspci是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具,比如查看网卡.存储等信息. 参数 -v 使得 lspci 以 ...

  6. Linux源码阅读——PCI总线驱动代码(一)整体框架

    目录 一.前言 二.概述 三.整体流程 四.PCI相关入口函数 4.1 pcibus_class_init 4.2 pci_driver_init 4.3 pci_arch_init 4.4 pci_ ...

  7. Linux指令:lspci显示PCI总线设备信息

    lspci:显示所有的PCI总线设备信息. 下面试lspci的全部功能介绍: $ lspci - Usage: lspci [<switches>]Basic display modes: ...

  8. Linux源码阅读——PCI总线驱动代码(三)PCI设备枚举过程

    目录 前言 1.枚举过程 1.1 acpi_pci_root_add 1.2 pci_acpi_scan_root(枚举开始) 1.3 acpi_pci_root_create 1.4 pci_sca ...

  9. Linux 命令之 lspci -- 显示当前设备所有PCI总线信息

    文章目录 命令介绍 常用选项 命令示例 (一)罗列 PCI 设备 命令介绍 lspci命令用于显示当前主机的所有PCI总线信息,以及所有已连接的PCI设备信息. 现在主流设备如网卡储存等都采用PCI总 ...

最新文章

  1. 【Qt】在Qlayout中Qlabel::setScaledContents(true);失效
  2. 03 Django REST Framework 视图和路由
  3. php接收flutter,来自Flutter中的PHP的API流(非Firebase)
  4. golang--sync.WaitGroup使用示例
  5. AI和深度学习正在席卷医疗保健行业
  6. 高性能的MySQL(2)慢查询
  7. python与办公自动化专业就业方向_Python最好的几大就业方向与岗位技能要求【行业风向】...
  8. 字体系统之字体粗细(CSS、HTML)
  9. [转载] java 捕获异常还是抛出异常
  10. 9.template -- basic concepts
  11. 进入第一个Android应用界面
  12. 图像识别与软件自动化测试
  13. Java-POI生成Excel表格模板部分样式
  14. DHTMLX Grid Crack
  15. FEKO学习:偶极子天线仿真
  16. Nail对话伍鸣:Conflux 香港概念下有何新叙事?
  17. Unity中鼠标的锁定与解锁
  18. 服务器网卡网速慢怎么维护,网速慢怎么办我通过某单位内部的局域网上互联网,最近一段时间网速巨 爱问知识人...
  19. 【I/O管理】和【磁盘调度】
  20. MT4白标升级MT5 用户信息

热门文章

  1. 股票期权交易接口数据为什么要使用Spring来定义函数?
  2. NBT封面:水稻NRT1.1B基因调控根系微生物组参与氮利用(作者解读, 端午水稻专题)...
  3. springboot+jsp高校科研项目管理系统java
  4. 用51单片机设计一款记忆力测试小游戏
  5. L2-032 彩虹瓶(测试点一以及段错误)
  6. 华为OD机试用Python实现 -【几何平均值最大子数组】| 2023年3月被抽中
  7. htc+e8+android+6.0,2014年度诚意之作 HTC One时尚版评测
  8. 一周企业财报 | 安踏、易车、药明康德、贝塔斯曼等23家企业发布业绩
  9. 电脑通过usb共享网络给手机上网
  10. CocosCreator 音效管理