深入解析Marvell MV88E6390交换机MDIO协议:Clause 22与Clause 45的实战应用
1. 从零开始为什么MV88E6390的MDIO协议这么重要最近在折腾Marvell的MV88E6390交换机芯片做驱动开发的时候我被它的MDIO接口搞晕了。一开始我以为不就是个管理接口嘛照着文档读写寄存器就完了。结果上手才发现光是MDIO协议就有两种主要“方言”Clause 22和Clause 45而且在MV88E6390里它们还能玩出直接寻址和间接寻址两种花样。这感觉就像你学开车以为会踩油门刹车就行结果发现这车还有手动挡、自动挡甚至还有序列式变速箱不搞清楚根本开不走。MDIO全称是Management Data Input/Output你可以把它想象成交换机的“神经系统”。CPU或者叫管理控制器通过MDIO这根“神经”去读取交换芯片各个端口的状态、配置VLAN、设置速率、管理PHY等等。如果这个“神经”信号传错了或者协议没对上那交换机就“瘫痪”了什么数据也转发不了。所以搞懂MDIO是驱动开发的第一步也是最基础、最关键的一步。MV88E6390作为一款高性能的企业级交换芯片功能非常复杂内部的寄存器数量庞大地址空间也远超传统5位地址的限制。这就决定了它不能只依赖老旧的Clause 22协议必须引入更强大的Clause 45协议并且通过间接寻址机制来灵活访问所有资源。如果你正在为这款芯片写驱动或者在做相关硬件设计、调试那么彻底吃透这两种MDIO协议的实现方式就是你绕不开的“必修课”。别担心这篇文章就是我踩了无数坑、看了无数文档、调试了无数次代码后总结出来的实战心得我会用最直白的话和你能直接抄的代码带你搞定它。2. 基础扫盲Clause 22与Clause 45到底有什么区别在深入MV88E6390的具体实现之前我们必须先把Clause 22和Clause 45这两个协议本身掰扯清楚。你可以把它们看作是两代不同的“通信语言”。Clause 22是IEEE 802.3标准里定义的最早的MDIO协议历史比较悠久。它的寻址空间非常有限设备地址PHY Address5个比特。这意味着一条MDIO总线上最多只能挂32个设备PHY或其它管理对象。寄存器地址Register Address5个比特。每个设备内部最多只能定义32个16位的寄存器。 这种设计在早期网络设备简单、PHY功能单一的时代是够用的。但到了现在动辄几十个端口、功能复杂的交换芯片32个寄存器哪里够用这就催生了Clause 45。Clause 45可以看作是Clause 22的“增强版”或“升级版”它专门为了解决地址空间不足的问题而生。它的核心变化是引入了“两阶段”寻址和更大的地址空间设备类型Device Type5个比特。用于区分不同类型的被管理设备比如PHY、PMA、PCS等。设备地址PHY Address5个比特。和Clause 22一样。寄存器地址MMD Address16个比特这是革命性的变化。每个设备类型下可以寻址高达65536个寄存器。操作类型Clause 45的帧结构里明确包含了是“地址”操作写入寄存器地址还是“数据”操作读写数据这使得协议更规范。简单做个对比表格一目了然特性Clause 22Clause 45标准出处IEEE 802.3 Clause 22IEEE 802.3 Clause 45主要目的管理简单的PHY管理复杂的PHY及多技术端口如10G以上地址空间5位设备地址 5位寄存器地址5位设备类型 5位设备地址 16位寄存器地址单次操作直接读写数据先进行“地址”阶段写寄存器地址再进行“数据”阶段读写数据复杂度简单时序单一较复杂需分两步操作适用场景百兆、千兆等传统以太网PHY万兆、四万兆及以上高速以太网及复杂交换芯片内部管理所以对于MV88E6390这种集成了高速SerDes和复杂交换逻辑的芯片其内部很多高级功能模块比如MACsec、时间同步等的寄存器都必须通过Clause 45协议来访问。而一些基础的、兼容性要求高的配置可能仍然支持Clause 22。理解这个区别是选择正确访问方式的前提。3. MV88E6390的MDIO访问“三重奏”直接与间接寻址好了知道了有两种“语言”我们再来看看MV88E6390是怎么“说话”的。根据我的实践和官方资料这颗芯片提供了三种MDIO访问路径我称之为“三重奏”。理解这三种方式你才能在看代码、写驱动时心里有数。第一种直接寻址基于Clause 22这是最传统、最直接的方式。你的CPU通过MDIO控制器直接发出Clause 22格式的帧帧里包含了5位的PHY地址和5位的寄存器地址MV88E6390芯片的MDIO接口识别到这个帧并直接对目标PHY的指定寄存器进行操作。这种方式速度最快延迟最低但只能访问那些映射在传统Clause 22地址空间里的寄存器。在驱动里这通常对应最基础的PHY状态读取和配置。第二种间接寻址基于Clause 22这是MV88E6390的一个特色设计也是容易让人困惑的点。为什么有了直接寻址还要搞个间接的Clause 22关键在于“间接”二字。 在这种模式下你的CPU并不是直接对目标PHY发起MDIO操作。相反CPU是通过MDIO去读写MV88E6390芯片内部的一个“代理”或“邮差”——通常是全局寄存器比如GLOBAL2中的SMI_OP和SMI_DATA寄存器。你告诉这个“邮差”“请帮我去读PHY 3的寄存器0x01”然后“邮差”芯片内部再通过自己的SMISerial Management Interface总线去完成这个操作最后把结果放回数据寄存器给你读取。 这样做的好处是统一了访问入口。无论你的CPU外部MDIO总线是何种实现你只需要通过固定的几个寄存器就能管理芯片内部所有的PHY和模块驱动编写更统一。同时这也为访问那些不支持直接Clause 22访问的内部模块提供了途径。第三种间接寻址基于Clause 45这是功能最强大的方式也是访问MV88E6390绝大多数高级功能寄存器的唯一途径。它的流程和间接Clause 22类似也是通过写全局寄存器来发起操作。但关键区别在于你写入SMI_OP寄存器的命令字格式是遵循Clause 45协议规范的。这个命令字里包含了设备类型MMD、设备地址、16位的寄存器地址以及具体的操作码读地址、写地址、读数据、写数据。 因为Clause 45本身就需要“地址”和“数据”两个阶段所以在间接模式下你需要先发起一个“写地址”操作将16位的目标寄存器地址写入然后再发起“读数据”或“写数据”操作来完成真正的读写。这个过程比Clause 22间接寻址稍显繁琐但换来了访问海量寄存器空间的能力。简单总结一下直接Clause 22是“点对点直呼”快但功能有限间接Clause 22是“通过前台转接内线电话”统一但仍是传统功能间接Clause 45是“通过前台转接并能呼叫公司内任何分机哪怕有上万分机号”功能全面是管理复杂芯片的必备技能。4. 代码实战亲手实现三种访问方式理论说再多不如一行代码。下面我就结合我在驱动开发中实际使用的代码基于Linux内核风格并做了简化讲解带你看看这三种方式具体怎么实现。我会把关键点拆开揉碎了讲保证你能看懂、能复用。4.1 直接寻址Clause 22的实现这种方式通常由SoC或CPU的MDIO控制器硬件来完成在驱动层面我们往往调用现成的mdiobus_read/write函数。但为了理解本质我们看看它的底层逻辑。假设我们有一个非常底层的mdio_direct_read函数它负责构造Clause 22帧并发送。/** * 模拟MDIO总线直接读取 - Clause 22 * bus: MDIO总线指针 * phy_addr: PHY地址 (5位) * reg_num: 寄存器号 (5位) * return: 读取到的16位数据或错误码 */ int mdio_direct_read_clause22(struct mii_bus *bus, int phy_addr, int reg_num) { u16 frame; int ret; /* 1. 构造Clause 22读帧 ST(01) OP(10) PHYAD(5) REGAD(5) TA(10) DATA(16) */ /* 起始操作码PHY地址寄存器地址 */ frame (0x01 14) | (0x02 12) | ((phy_addr 0x1F) 7) | ((reg_num 0x1F) 2); /* 2. 通过GPIO模拟或硬件控制器发送帧前32位控制部分 */ ret send_mdio_frame(bus, frame, 16); // 发送前16位 if (ret 0) return ret; /* 3. 切换方向读取后续的16位数据TA DATA */ ret receive_mdio_frame(bus, frame, 16); if (ret 0) return ret; /* 4. 解析返回数据低16位即为寄存器值 */ return frame 0xFFFF; }在实际的MV88E6390驱动中我们很少需要自己实现这个因为内核的phylib和mdio-bitbang等框架已经封装好了。你更多会看到像phy_read(phydev, regnum)这样的调用底层就是走的这个流程。它的特点是简单直接但只能用于访问符合Clause 22规范的、地址在0-31之间的寄存器。4.2 间接寻址Clause 22的驱动代码解析这才是MV88E6390驱动里的重头戏。我们通过芯片的全局寄存器来“间接”操作。让我们仔细分析一下原始文章里给出的那两个函数我加上详细的注释。/** * 通过MV88E6390间接方式读取 - 基于Clause 22 * ps: 芯片私有状态结构体包含寄存器访问方法 * addr: 目标PHY地址 (注意这里可能是芯片内部逻辑地址) * regnum: 目标寄存器号 */ static int mv88e6xxx_mdio_read_indirect_cls22(struct mv88e6xxx_priv_state *ps, int addr, int regnum) { int ret; u16 op_cmd; /* 步骤1构造并发送操作命令到SMI_OP寄存器。 * GLOBAL2_SMI_OP是命令寄存器。 * GLOBAL2_SMI_OP_22_READ 是“间接Clause22读”的操作码。 * (addr 5) | regnum 将PHY地址和寄存器号拼接到命令字中。 * 这里有个关键点addr是芯片内部逻辑地址它可能和外部MDIO的PHY地址不同。 * 芯片硬件看到这个命令就知道要去执行一次Clause 22读操作。 */ op_cmd GLOBAL2_SMI_OP_22_READ | ((addr 0x1F) 5) | (regnum 0x1F); ret _mv88e6xxx_reg_write(ps, REG_GLOBAL2, GLOBAL2_SMI_OP, op_cmd); if (ret 0) return ret; // 命令发送失败 /* 步骤2等待操作完成。 * 芯片需要时间去执行内部SMI访问。mv88e6xxx_mdio_wait函数会轮询 * SMI_OP寄存器的忙标志位直到操作完成或超时。 */ ret mv88e6xxx_mdio_wait(ps); if (ret 0) return ret; // 操作超时或失败 /* 步骤3从SMI_DATA寄存器读取结果。 * 芯片完成读操作后会把读到的16位数据放到GLOBAL2_SMI_DATA寄存器中。 */ ret _mv88e6xxx_reg_read(ps, REG_GLOBAL2, GLOBAL2_SMI_DATA); return ret; // 返回读到的数据 }写操作mv88e6xxx_mdio_write_indirect_cls22也是类似的逻辑但顺序稍有不同需要先将要写的数据写入SMI_DATA寄存器然后再发送写命令。这是因为写操作需要携带数据。这一点顺序千万不能错否则数据就会写飞。static int mv88e6xxx_mdio_write_indirect_cls22(struct mv88e6xxx_priv_state *ps, int addr, int regnum, u16 val) { int ret; /* 先写数据 */ ret _mv88e6xxx_reg_write(ps, REG_GLOBAL2, GLOBAL2_SMI_DATA, val); if (ret 0) return ret; /* 再发写命令 */ ret _mv88e6xxx_reg_write(ps, REG_GLOBAL2, GLOBAL2_SMI_OP, GLOBAL2_SMI_OP_22_WRITE | ((addr 0x1F) 5) | (regnum 0x1F)); if (ret 0) return ret; /* 等待命令执行完毕 */ return mv88e6xxx_mdio_wait(ps); }这里我踩过一个坑有一次调试时发现写配置不生效排查了半天才发现是把写数据和写命令的顺序搞反了。芯片设计逻辑是收到写命令时会立刻将当前SMI_DATA寄存器的值写入目标地址。如果你后写数据那命令执行时数据寄存器里还是旧值或者随机值自然就写错了。4.3 间接寻址Clause 45的驱动代码与位操作详解Clause 45的间接寻址最复杂但也最强大。它需要两个步骤并且命令字cmd_data的构造是理解的关键。我们结合代码和寄存器位定义来看。首先我们需要知道GLOBAL2_SMI_OP寄存器里各个位的含义根据Marvell数据手册MV_SMIBUSY_OFFSET忙标志位。软件写1启动操作硬件完成后清0。MV_SMIFUNC_OFFSET功能位。通常置0表示是MDIO/SMI操作1可能用于其他总线。MV_SMIMODE_OFFSET模式位。0表示Clause 221表示Clause 45。我们这里必须设为1。MV_SMIOP_OFFSET操作码位。2位宽表示具体操作00: Clause 45 写地址Address01: Clause 45 写数据Write10: Clause 45 读后读增量地址Post-read increment11: Clause 45 读数据ReadMV_DEVAD_OFFSET设备类型MMD地址位。5位宽来自addr的高5位。MV_REGAD_OFFSET寄存器地址位。5位宽来自addr的低5位。注意在Clause 45间接模式下这个字段在“地址阶段”用于存放16位寄存器地址的高5位不这里需要仔细看。在MV88E6390的实现中addr参数是一个组合值其高5位是MMD号低5位是寄存器地址的一部分吗从原始代码((addr5) MV_DEVAD_MASK)和(addr MV_REGAD_MASK)来看它把addr这个32位整数的高位当作MMD低位当作一个5位的“子地址”。但Clause 45的寄存器地址是16位的这怎么够奥秘在于16位的寄存器地址是分两次传入的先通过SMI_DATA寄存器传入完整的16位地址然后SMI_OP命令字中的MV_REGAD_OFFSET字段可能被用于其他目的或者在Clause 45模式下被忽略。根据我的调试经验和对其他驱动代码的参考更常见的做法是将要访问的16位寄存器地址写入SMI_DATA。构造命令字其中MV_SMIOP_OFFSET设为00写地址MV_DEVAD_OFFSET设为MMD号然后执行。再进行数据读写操作。原始文章中的代码略显晦涩我们以一个更清晰、更常见的实现逻辑来重写Clause 45的读操作/** * 通过MV88E6390间接方式读取 - 基于Clause 45 * ps: 芯片私有状态 * mmd: 设备类型 (MMD Number, 如1 for PHY, 3 for MAC等) * devad: 设备地址 (PHY Address) * regnum: 16位寄存器地址 */ static int mv88e6xxx_mdio_read_indirect_cls45(struct mv88e6xxx_priv_state *ps, int mmd, int devad, u16 regnum) { int ret; u16 cmd_data; /* ---------- 阶段一地址阶段 (Address) ---------- */ /* 1. 将16位的目标寄存器地址写入SMI_DATA寄存器 */ ret _mv88e6xxx_reg_write(ps, REG_GLOBAL2, GLOBAL2_SMI_DATA, regnum); if (ret 0) return ret; /* 2. 构造“写地址”命令并触发。 * 设置忙位1启动模式位1Clause45操作码00写地址。 * 将MMD号和设备地址填入对应字段。 */ cmd_data (1 MV_SMIBUSY_OFFSET) | (0 MV_SMIFUNC_OFFSET) | (1 MV_SMIMODE_OFFSET) | // Clause 45 模式 (0 MV_SMIOP_OFFSET) | // 操作码00: 写地址 ((mmd 0x1F) MV_DEVAD_OFFSET) | ((devad 0x1F) MV_REGAD_OFFSET); // 注意此时REGAD字段可能用于放devad ret _mv88e6xxx_reg_write(ps, REG_GLOBAL2, GLOBAL2_SMI_OP, cmd_data); if (ret 0) return ret; /* 3. 等待地址写入操作完成 */ ret mv88e6xxx_mdio_wait(ps); if (ret 0) return ret; /* ---------- 阶段二数据阶段 (Read Data) ---------- */ /* 4. 构造“读数据”命令并触发。 * 同样设置忙位1模式位1操作码11读数据。 * MMD和devad字段需要与阶段一保持一致。 */ cmd_data (1 MV_SMIBUSY_OFFSET) | (0 MV_SMIFUNC_OFFSET) | (1 MV_SMIMODE_OFFSET) | // Clause 45 模式 (3 MV_SMIOP_OFFSET) | // 操作码11: 读数据 ((mmd 0x1F) MV_DEVAD_OFFSET) | ((devad 0x1F) MV_REGAD_OFFSET); ret _mv88e6xxx_reg_write(ps, REG_GLOBAL2, GLOBAL2_SMI_OP, cmd_data); if (ret 0) return ret; /* 5. 等待读数据操作完成 */ ret mv88e6xxx_mdio_wait(ps); if (ret 0) return ret; /* 6. 从SMI_DATA寄存器读取数据 */ ret _mv88e6xxx_reg_read(ps, REG_GLOBAL2, GLOBAL2_SMI_DATA); return ret; }写操作mv88e6xxx_mdio_write_indirect_cls45也是类似的“地址阶段”“数据阶段”流程只是在数据阶段操作码改为01写数据并且需要提前把要写入的val放到SMI_DATA寄存器中。这里再强调一个顺序Clause 45的写操作也是先完成“地址阶段”告诉芯片要写哪个寄存器然后在“数据阶段”之前把数据写入SMI_DATA最后触发写数据命令。5. 调试心得与常见“坑点”排查理论懂了代码也有了但真正调试起来还是可能一头包。我把自己在调试MV88E6390 MDIO时遇到的几个典型问题和排查思路分享给你希望能帮你节省时间。问题一读写毫无反应返回值一直是错误或超时。首先检查硬件连接MDC时钟和MDIO数据这两根线是否接对上拉电阻加了没有用示波器或逻辑分析仪抓一下波形看看有没有时钟和数据信号。MDIO是双向开漏的必须要有上拉。检查芯片供电和复位MV88E6390的各个电源轨是否稳定复位信号是否已经释放芯片的配置引脚比如EEPROM接口是否处于正确状态确保芯片是从内部默认寄存器启动而不是卡在了错误的配置里。确认访问的寄存器地址和模式你用的是直接寻址还是间接寻址对于间接寻址你访问的是GLOBAL2这个全局寄存器空间吗你的CPU能否正确读写芯片的其他基础配置寄存器比如芯片ID寄存器如果基础寄存器都读不到那可能是总线访问层如SPI、I2C转换MDIO的问题。问题二直接Clause 22读写正常但间接方式失败。重点检查GLOBAL2_SMI_OP命令字的构造这是最容易出错的地方。每个位字段是否对齐正确操作码、模式位、忙位是否设置对了对于Clause 22间接模式模式位MV_SMIMODE_OFFSET应该设为0。对于Clause 45必须设为1。检查等待函数mv88e6xxx_mdio_wait这个函数实现是否正确它应该在循环中读取SMI_OP寄存器检查忙位是否清零。超时时间设置是否合理太短可能等不到操作完成太长会影响驱动性能。我一般设置几十毫秒的超时。确认PHY/设备地址间接寻址时使用的addr参数是芯片内部的SMI设备地址这个地址可能和外部MDIO总线上的PHY地址不一样一定要查数据手册中对应端口的“SMI Address”章节。问题三Clause 45操作能执行但读回来的数据不对或者写不进去。严格遵循两阶段操作你是否漏掉了“地址阶段”对于Clause 45每次读写操作前必须先执行一次“写地址”操作操作码00将16位寄存器地址设置进去。之后的数据读写操作操作码01或11才能针对这个地址进行。很多错误都是因为想“偷懒”复用之前的地址导致的。稳妥起见每次操作都完整走一遍两阶段流程。注意命令字中的MMD号不同的功能模块对应不同的MMDManagement Data Interface Device编号。例如通用PHY控制寄存器可能在MMD 1而MACsec的寄存器在MMD 7。读错MMD访问的自然是错误的寄存器空间。数据手册里每个寄存器描述都会注明其所属的MMD。验证SMI_DATA寄存器的使用时机在“地址阶段”SMI_DATA存放的是16位寄存器地址。在“写数据阶段”之前SMI_DATA需要被写入要写的数据。在“读数据阶段”之后SMI_DATA里存放的是读回来的数据。时序千万不能乱。调试时最有效的工具是逻辑分析仪。抓取MDC和MDIO线上的波形对照IEEE 802.3标准中Clause 22和Clause 45的帧格式图一个比特一个比特地比对很容易就能发现是帧格式错了还是时序不对或者是芯片根本没有响应。另外在驱动代码里多增加一些调试打印把每次发送的命令字、数据、返回结果都打印出来对于分析问题也至关重要。6. 进阶思考在驱动框架中如何优雅集成当我们理解了底层原理后最终目标是要将其集成到Linux内核的MDIO/PHY驱动框架中让内核的其他部分如网络子系统能够无缝地使用这些接口。这里分享一下我的集成思路。对于直接Clause 22访问这最简单。MV88E6390的每个端口都可能对应一个PHY我们需要为每个端口实现一个struct phy_device并将其bus指向正确的MDIO总线。内核的phylib会自动通过标准的mdiobus_read/write来操作它们这些调用最终会走到CPU的MDIO控制器驱动发出标准的Clause 22帧。对于间接访问我们需要“创造”一个虚拟的MDIO总线。这是因为内核的PHY驱动模型假定PHY是挂在一条MDIO总线上的。我们可以实现一个struct mii_bus并实现其read和write函数。在这两个函数内部根据传入的PHY地址和寄存器地址决定是调用mv88e6xxx_mdio_read_indirect_cls22还是mv88e6xxx_mdio_read_indirect_cls45。static int mv88e6390_mii_bus_read(struct mii_bus *bus, int phy_addr, int regnum) { struct mv88e6xxx_chip *chip bus-priv; int mmd, devad, ret; /* 判断是Clause22空间还是Clause45空间 */ if (regnum MII_CNTL) { // 假设MII_CNTL是标准MII寄存器的边界 /* 使用间接Clause 22访问 */ ret mv88e6xxx_mdio_read_indirect_cls22(chip-priv, phy_addr, regnum); } else { /* 解析出MMD和16位寄存器地址。 * 这里需要一个映射表将phy_addrregnum映射到具体的MMD和16位地址。 * 例如我们可以约定regnum的高4位表示MMD低16位表示寄存器地址。 */ mmd (regnum 16) 0x1F; devad phy_addr; // 设备地址可能就用phy_addr u16 mmd_regnum regnum 0xFFFF; ret mv88e6xxx_mdio_read_indirect_cls45(chip-priv, mmd, devad, mmd_regnum); } return ret; }这样上层驱动就可以用统一的phy_read和phy_write接口来访问所有寄存器底层复杂的Clause 22/45选择和间接寻址都被隐藏了起来。这种设计使得驱动结构清晰易于维护和扩展。最后我想说搞懂MV88E6390的MDIO协议就像是拿到了管理这座“交换芯片大厦”的总钥匙。从简单的状态查询到复杂的功能配置都离不开它。虽然一开始会觉得有点绕特别是间接寻址和Clause 45的两阶段操作但一旦你亲手调试通过几次就会形成深刻的肌肉记忆。以后遇到其他Marvell的交换机芯片或者需要调试复杂的PHY芯片这套思路和方法都是完全通用的。希望我这些踩坑总结和代码分析能让你在开发路上走得更顺畅一些。

相关新闻

DIY智能家居中枢——433M无线信号解码器实战(模块化方案)

DIY智能家居中枢——433M无线信号解码器实战(模块化方案)

1. 为什么你需要一个433M无线信号解码器? 如果你正在捣鼓智能家居,尤其是想用一些价格便宜、功能简单的无线开关、门磁传感器或者温湿度计,那你大概率会碰到一个叫“433MHz”的玩意儿。这东西在智能家居的“上古时代”特别流行,很…

2026/7/4 22:36:59 阅读更多 →
无代码开发企业级应用:Dify工作流可视化编程指南

无代码开发企业级应用:Dify工作流可视化编程指南

无代码开发企业级应用:Dify工作流可视化编程指南 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify-Workf…

2026/7/5 9:08:19 阅读更多 →
如何通过G-Helper实现华硕笔记本性能与续航的完美平衡

如何通过G-Helper实现华硕笔记本性能与续航的完美平衡

如何通过G-Helper实现华硕笔记本性能与续航的完美平衡 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: https://…

2026/7/4 5:08:44 阅读更多 →

最新新闻

热红外视觉下的车辆/船舶重识别新方法:Vc-fes

热红外视觉下的车辆/船舶重识别新方法:Vc-fes

在监控与海事安防等场景中,如何在**热红外图像**(灰度、无色彩、纹理弱)中准确识别同一辆车或同一艘船,是一个长期悬而未决的难题。近期发表于《International Journal of Machine Learning and Cybernetics》(2026年)的论文《Vc-fes: viewpoint-conditioned feature selection…

2026/7/5 9:10:34 阅读更多 →
本地AI完全指南①:我把ChatGPT退了,一年省2400——为什么越来越多人把大模型搬回家

本地AI完全指南①:我把ChatGPT退了,一年省2400——为什么越来越多人把大模型搬回家

title: 本地AI完全指南①:我把ChatGPT退了,一年省2400——为什么越来越多人把大模型搬回家? tags: 本地AI,私有大模型,Ollama,DeepSeek,大模型部署,AI隐私,离线AI,本地部署大模型,DeepSeek本地部署 category: 人工智能 本地AI完全指南①&…

2026/7/5 9:10:34 阅读更多 →
同一个模型,三个平台:OpenRouter - SiliconFlow - DeepInfra 实测对比

同一个模型,三个平台:OpenRouter - SiliconFlow - DeepInfra 实测对比

前面几期测的都是模型官方 API。但你实际用的时候,大概率走的不是官方——而是通过某个聚合平台。 为什么?几个现实原因: 不想每个模型绑一张信用卡公司采购要求统一结算官方 API 在某些地区不稳定想用一个 API Key 调所有模型 所以这期我不测…

2026/7/5 9:10:34 阅读更多 →
GRPO训练燃料:把Hermes Agent Feedback变成强化学习信号

GRPO训练燃料:把Hermes Agent Feedback变成强化学习信号

GRPO训练燃料:把Agent Feedback变成强化学习信号 「Hermes Agent自进化智能体深度解析」系列 | 模块十六 第3篇 你的Agent积累了1000条执行轨迹。500条成功,500条失败。成功的路径有的快、有的慢,失败的失败方式各不相同。你盯着这些数据&a…

2026/7/5 9:08:34 阅读更多 →
艾尔登法环mod下载法魂Modv3.0安装指南

艾尔登法环mod下载法魂Modv3.0安装指南

法魂Mod是一款热度突破680万、持续更新超过三年的《艾尔登法环》大型大修模组。3.0版本带来了全新宝珠系统、大量原创武器与法术、DLC区域地图重置等重大更新,并兼容无缝联机与光荣商人等主流功能性模组。以下为完整安装流程与多Mod共存配置方法。 版本核心更新内容…

2026/7/5 9:08:34 阅读更多 →
x64dbg:Windows 逆向分析的开源调试器

x64dbg:Windows 逆向分析的开源调试器

文章目录x64dbg:Windows 逆向分析的开源调试器它能干什么为什么逆向圈都在用1. 填补了工具断层2. 插件生态起来了3. 真正的开源底层技术栈实际体验我的建议x64dbg:Windows 逆向分析的开源调试器 搞逆向工程的人都知道,调试器是吃饭的家伙。I…

2026/7/5 9:06:34 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻