仓库里的四本账、开业流程与对账用「快递站」比喻讲透交换芯片的表项、初始化与对账一句话简介前两篇讲了快递站怎么收发货数据面、总部怎么指挥分站控制面。这一篇钻进仓库内部讲清楚仓库里的四本账FDB/VLAN/L3/ACL、仓库开业时先干什么后干什么初始化时序与错误恢复、以及账本对不上时怎么修软硬件对账。项目内容适合读者接触交换机驱动、想理解芯片表项与初始化流程的工程师前置知识前两篇的快递站比喻、基本以太网/VLAN/路由概念阅读时长约 30 分钟关键词FDB、VLAN、L3、ACL、TCAM、初始化时序、错误恢复、软硬件对账目录引子前两篇讲了“怎么干活”这一篇讲“账怎么记”第一部分仓库里的四本账——FDB / VLAN / L3 / ACL总览四本账的查找流水线1. FDB工位通讯录——“目的 MAC 在哪个门”2. VLAN分组名册——“哪些门是一个组”3. L3跨组路由表 邻居表——“跨组怎么走”4. ACL门卫规则——“什么货不能进、不能出”四本账的关系总结第二部分仓库开业——初始化时序与错误恢复初始化时序八步点火错误恢复开业失败怎么收场第三部分软硬件对账——账本对不上怎么办对账的基本流程三种对账策略对账的难点硬件表不一定“读得回来”全景串联一个包裹、一次开业、一轮对账常见坑速查自检清单一句话总结引子前两篇讲了“怎么干活”这一篇讲“账怎么记”第一篇包裹怎么从货车进仓库、怎么装纸箱、怎么交给客户数据面。第二篇总部怎么下命令、分站怎么碰仓库控制面。这一篇仓库内部有四本账决定“什么货该送到哪”仓库开业时按什么顺序点火以及账本和实际货架对不上时怎么修。延续比喻驱动 分站交换芯片 仓库表项 仓库里的账本初始化 仓库开业前的点火流程对账 定期盘点发现账实不符就修第一部分仓库里的四本账——FDB / VLAN / L3 / ACL仓库要决定“一个包裹往哪送”不是拍脑袋而是翻四本账。四本账有先后顺序像流水线一样一本本查。总览四本账的查找流水线包裹从 3 号门进来 │ ▼ ┌─────────────────────────────────────────────┐ │ 第一本账ACL门卫规则 │ │ “这个包裹允许进吗要不要直接丢掉/转走” │ │ 命中规则 → 按规则动作丢弃/重定向/放行 │ └──────────────────┬──────────────────────────┘ │ 放行 ▼ ┌─────────────────────────────────────────────┐ │ 第二本账VLAN分组名册 │ │ “3 号门属于哪个组这个包裹该进哪个组” │ │ 决定加不加 VLAN 标签、能泛洪到哪些门 │ └──────────────────┬──────────────────────────┘ │ 确定组 ▼ ┌─────────────────────────────────────────────┐ │ 第三本账FDB工位通讯录 │ │ “目的 MAC 在哪个门” │ │ 查到 → 直接送那个门查不到 → 泛洪 │ └──────────────────┬──────────────────────────┘ │ 需要跨组/跨网段 ▼ ┌─────────────────────────────────────────────┐ │ 第四本账L3跨组路由表 邻居表 │ │ “目的 IP 走哪个下一跳下一跳的 MAC 是谁” │ │ 决定改 MAC 头、减 TTL、从哪个门送出 │ └─────────────────────────────────────────────┘一句话记ACL 先拦VLAN 分组FDB 找人L3 跨组。四本账按这个顺序查任何一本命中就可能提前结束。1. FDB工位通讯录——“目的 MAC 在哪个门”FDBForwarding Database就是仓库的工位通讯录记着“某个 MAC 地址在哪个门后面”。FDB 账本长这样 ┌──────────────┬────────┬────────┬──────────┐ │ MAC 地址 │ VLAN │ 哪个门 │ 状态 │ ├──────────────┼────────┼────────┼──────────┤ │ AA:BB:CC:... │ 10 │ 3 号门 │ 已生效 │ │ DD:EE:FF:... │ 10 │ 5 号门 │ 已生效 │ │ 11:22:33:... │ 20 │ 7 号门 │ 老化中 │ └──────────────┴────────┴────────┴──────────┘三种来源来源怎么来的特点动态学习包裹从 3 号门进来源 MAC 自动记到 3 号门会老化一段时间没流量就删静态配置管理员手动指定“这个 MAC 永远在 5 号门”不老化重启也在控制面下发路由/邻居协议算出来后写进来随协议状态变化查找结果只有三种目的 MAC 查 FDB │ ┌────┴────┬────────────┐ 查到 查不到 查到但状态是“老化中” │ │ │ ▼ ▼ ▼ 直接送 泛洪 按实现决定 那个门 除入口外 送 触发重新学习 所有同组门卡点动态学习是硬件自动做的驱动只收到“学习到了”的通知notifier。如果驱动在通知里做慢活比如查数据库会拖慢整个学习路径。学习通知要快进快出慢活丢工作队列。2. VLAN分组名册——“哪些门是一个组”VLAN 就是仓库的分组名册把几十个门分成若干组组内可以互相送组间默认隔离。VLAN 账本长这样 ┌────────┬─────────────────────┬──────────────┐ │ VLAN │ 成员门 │ 标签处理 │ ├────────┼─────────────────────┼──────────────┤ │ 10 │ 1, 2, 3 号门 │ 3 号门出口打标签│ │ 20 │ 5, 6, 7 号门 │ 不打标签untag│ │ 30 │ 1, 5 号门跨组 │ 按配置 │ └────────┴─────────────────────┴──────────────┘每个门有三个关键属性属性大白话作用PVID这个门的“默认组号”进来的无标签包裹归到这个组成员关系这个门属于哪些组决定包裹能往哪些门送Tag/Untag出口要不要贴组标签贴标签给交换机看不贴给终端看收包时的 VLAN 处理包裹从 3 号门进来 │ ▼ 包裹上有没有 VLAN 标签 │ ┌────┴────┐ 有 没有 │ │ ▼ ▼ 按标签的组 按 3 号门的 PVID │ │ └─────┬─────┘ ▼ 查 VLAN 账本这个组允许 3 号门进吗 │ ┌────┴────┐ 允许 不允许 │ │ ▼ ▼ 继续查 FDB 丢弃记一笔“VLAN 违规”卡点VLAN 成员关系是全局表不是每个门私有的。驱动收到“把 3 号门加入 VLAN 10”时要改的是芯片的全局 VLAN 表不是 3 号门的私有状态。改错了要么 3 号门进不了组要么整个组的成员关系乱掉。3. L3跨组路由表 邻居表——“跨组怎么走”FDB 只管同一个组内“找人”。如果包裹要跨组、跨网段就得查 L3 的两本账L3 账本分两本 ┌─────────────────────────────────────────────┐ │ 路由表去哪个方向 │ │ 目的网段 10.0.2.0/24 → 下一跳 10.0.1.1 │ │ 目的网段 10.0.3.0/24 → 直接连直连路由 │ └──────────────────┬──────────────────────────┘ │ 知道下一跳 IP ▼ ┌─────────────────────────────────────────────┐ │ 邻居表下一跳的 MAC 是谁 │ │ IP 10.0.1.1 → MAC AA:BB:CC:... │ │ 由 ARP/ND 协议填进来 │ └──────────────────┬──────────────────────────┘ │ 知道下一跳 MAC ▼ 改包裹的 MAC 头目的 MAC 换成下一跳的 减 TTL 从 FDB 查“下一跳 MAC 在哪个门” 送出去完整跨组转发流程包裹目的 IP 10.0.2.5从 3 号门进来 │ ▼ 查路由表10.0.2.0/24 → 下一跳 10.0.1.1 │ ▼ 查邻居表10.0.1.1 → MAC AA:BB:CC │ ▼ 改包裹 · 目的 MAC 改成 AA:BB:CC · 源 MAC 改成仓库自己的 MAC · TTL 减 1 │ ▼ 拿 AA:BB:CC 查 FDB → 在 5 号门 │ ▼ 从 5 号门送出卡点L3 转发依赖邻居表有货。如果邻居表里没有下一跳的 MAC包裹会被“挂起”等 ARP/ND 解析完再发。驱动要保证挂起的包裹有超时和上限否则邻居表一直不解析包裹会无限堆积把内存吃光。4. ACL门卫规则——“什么货不能进、不能出”ACL 就是仓库的门卫规则按“源/目的 MAC、IP、端口号、VLAN”等条件匹配命中就执行动作。ACL 账本长这样TCAM 表 ┌────┬──────────────────────────────┬──────────────┐ │优先级│ 匹配条件 │ 动作 │ ├────┼──────────────────────────────┼──────────────┤ │ 1 │ 目的 MAC XX:XX, VLAN 10 │ 丢弃 │ │ 2 │ 源 IP 10.0.0.5, 端口 80 │ 重定向到 7 号门│ │ 3 │ 协议 TCP, 目的端口 22 │ 限速 1Mbps │ │ 4 │ 其他所有 │ 放行 │ └────┴──────────────────────────────┴──────────────┘ACL 的特殊性TCAM 是“三态”的普通账本只能记“0 或 1”。ACL 的账本TCAM能记“0、1、不关心”三种状态所以能做掩码匹配普通内存 1010 → 只能匹配 1010 TCAM 10XX → 能匹配 1000、1001、1010、1011 ↑↑ 这两位“不关心”ACL 下发的难点用户配置了一条 ACL │ ▼ 驱动要把它编译成 TCAM 表项 · 选哪些字段做 keyMAC/IP/端口/VLAN · 每个字段多宽、掩码怎么设 · 放在 TCAM 的哪个位置优先级 │ ▼ 写入 TCAM │ ┌────┴────┐ 成功 失败TCAM 满了 / 字段不支持 / 优先级冲突 │ │ ▼ ▼ 生效 返回错误告诉用户“这条规则下不了”卡点TCAM 容量有限不是想加多少加多少。驱动要在下发前检查容量满了要返回明确错误不能默默丢弃。优先级顺序有讲究。两条规则冲突时谁先匹配谁生效。驱动要保证“用户配的优先级”和“TCAM 里的物理顺序”一致。字段支持有限。不是所有芯片都支持“按 TCP 端口号匹配”驱动要提前检查能力不支持就报错。四本账的关系总结┌─────────────────────────────────────────────┐ │ ACL先拦一道决定“进不进、要不要转走” │ └──────────────────┬──────────────────────────┘ ▼ ┌─────────────────────────────────────────────┐ │ VLAN分组决定“能去哪些门” │ └──────────────────┬──────────────────────────┘ ▼ ┌─────────────────────────────────────────────┐ │ FDB同组内找人决定“具体送哪个门” │ └──────────────────┬──────────────────────────┘ ▼ ┌─────────────────────────────────────────────┐ │ L3跨组时改头、换 MAC、减 TTL再回 FDB 查门 │ └─────────────────────────────────────────────┘记忆口诀ACL 拦VLAN 分FDB 找L3 跨。第二部分仓库开业——初始化时序与错误恢复仓库不是一通电就能用的。它得像飞机起飞一样按检查单一步步来任何一步失败都要能安全回滚。初始化时序八步点火① 全局复位 └─ 把芯片所有寄存器、表项、队列清到已知状态 │ ▼ ② 时钟与 PLL 锁定 └─ 等时钟稳定PLL 锁定等不到就报错退出 │ ▼ ③ SerDes 训练 └─ 高速接口的收发均衡、时钟恢复让链路误码率达标 │ ▼ ④ SRAM / 表项内存初始化 └─ 清空 FDB/VLAN/L3/ACL 表设置默认值 │ ▼ ⑤ DMA 环建立 └─ 分配描述符环告诉硬件“CPU 端口的收发缓冲区在哪” │ ▼ ⑥ 中断注册 └─ 申请 MSI-X 向量绑定 NAPI │ ▼ ⑦ 默认策略加载 └─ ACL 默认放行、VLAN 默认配置、QoS 默认队列 │ ▼ ⑧ 使能端口、启动交换引擎 └─ 最后一个门打开硬件开始转发为什么顺序不能乱如果先开端口⑧再初始化表项④ 端口一开包裹进来 表项还是空的/脏的 → 包裹被泛洪、被错误丢弃、甚至踩坏内存 如果先建 DMA 环⑤再等 PLL 锁定② DMA 环建好了但时钟还没稳 → 硬件读写描述符时序错乱读到垃圾每一步都要有超时和回滚每一步的模板 开始这一步 │ ▼ 等硬件确认带超时 │ ┌────┴────┐ 成功 超时/失败 │ │ ▼ ▼ 下一步 回滚到上一步的干净状态 上报错误 退出 probe错误恢复开业失败怎么收场初始化失败不可怕可怕的是失败后留下一地鸡毛。驱动的错误恢复要遵守两条原则原则一哪一步失败就从哪一步往回拆第 ⑤ 步DMA 环失败 │ ▼ 拆 ⑤ 已分配的部分 拆 ④ 已初始化的表项可选复位会清 拆 ③ SerDes关掉 拆 ② PLL关掉 拆 ① 复位保持复位状态 │ ▼ 返回错误probe 失败原则二运行中出错能局部恢复就不整体重启运行中某次表项下发超时 │ ▼ 只回滚这一条表项状态机回滚 不影响其他表项 记一笔错误日志 │ ▼ 如果连续多次超时 / 寄存器读回全 F │ ▼ 触发通道复位只复位出问题的模块 │ ▼ 如果复位也救不回来 │ ▼ 上报“硬件故障”停止该端口/该模块常见错误与处理错误症状处理思路PCIe link down寄存器读回全 F停止访问上报等待热插拔/重启寄存器超时轮询 ack 一直不置位带超时返回错误不无限等SerDes 训练失败端口链路起不来重试 N 次失败则标记端口不可用TCAM 满ACL 下发返回“资源不足”返回明确错误让用户删规则DMA 环错误描述符 own 位异常、数据错乱停止队列、复位 DMA 通道、重建环表项下发失败影子表是“已生效”但硬件没有回滚影子表状态重试或上报卡点错误恢复本身不能成为新的错误源。比如复位通道时如果还拿着总线锁可能死锁回滚表项时如果状态机没设计好可能把“已生效”的表项误删。第三部分软硬件对账——账本对不上怎么办即使初始化正确、下发流程严谨运行久了账本还是会“对不上”硬件自己老化了一条 FDB驱动没收到通知控制面下发失败但影子表已标记“已生效”硬件复位后表项全丢驱动不知道并发操作导致某条表项只写了一半。对账就是定期或触发时对比影子账本和硬件账本发现差异就修。对账的基本流程触发对账定时 / 收到错误 / 人工命令 │ ▼ 逐条读硬件表项或读统计/校验和 │ ▼ 和影子账本对比 │ ┌────┴────┬────────────┬────────────┐ 硬件多了 硬件少了 值不对 │ │ │ ▼ ▼ ▼ 删掉 补上 改成影子账本的值 可能是 可能是 可能是并发 老化没通知下发失败 写坏了 │ ▼ 记录差异日志谁、哪条、怎么修的三种对账策略策略怎么做优点缺点全量对账定期把整张硬件表读一遍逐条对比最彻底慢大表可能几秒钟期间影响转发增量对账只对比最近变更过的表项快漏掉“悄悄变化”的表项事件驱动对账收到硬件错误/复位事件时触发对账及时依赖事件通知可靠实际做法通常是组合日常用增量对账 事件驱动低峰期做全量对账。对账的难点硬件表不一定“读得回来”有些芯片的 TCAM、哈希表不支持逐条读回只能读“表项数量”统计和影子账本数量对比读“校验和”或“哈希摘要”和影子账本算出来的对比用“探测包”验证某条表项是否真的生效发一个匹配的包看它走不走。不支持读回的表的对账方法 ① 数量对账 硬件统计“当前 FDB 条数” vs 影子账本条数 不一致 → 触发全量重建清空硬件表按影子账本重写 ② 行为对账 构造一个匹配某条 ACL 的探测包 看它是否被丢弃/重定向 和影子账本预期对比卡点对账本身要和正常下发互斥。对账读硬件表时如果有新表项正在下发可能读到“半成品”。所以对账通常要暂停表项下发或加读写锁对完再放开。全景串联一个包裹、一次开业、一轮对账【包裹转发】 3 号门进来 → ACL 拦放行 → VLAN 分组VLAN 10 → FDB 找人目的 MAC 在 5 号门 → 从 5 号门送出 跨组时多查 L3路由表 邻居表改 MAC、减 TTL再回 FDB 【仓库开业】 复位 → PLL → SerDes → 表项初始化 → DMA 环 → 中断 → 默认策略 → 开端口 每一步带超时失败就回滚到上一步 【定期对账】 读硬件表 / 统计 / 行为验证 → 和影子账本对比 → 多了删、少了补、错了改 → 记日志 对账期间暂停下发避免读到半成品常见坑速查坑生活比喻后果正确做法VLAN 成员关系当私有状态改改的是工位自己的小本本不是车间名册整个组的成员关系乱掉VLAN 是全局表改全局表L3 挂起包裹没上限邻居表不解析包裹无限堆积内存吃光挂起队列有超时和上限TCAM 满了默默丢规则门卫规则写不进去也不说用户以为规则生效了下发前检查容量满了报错初始化顺序颠倒先开门再摆货架包裹进来踩坏内存严格按八步顺序每步带超时错误恢复时还拿着锁复位通道时死锁系统卡死恢复前释放锁恢复用独立路径对账和下发并发读到半成品表项误判差异、误删表项对账期间暂停下发或加读写锁不支持读回的表硬读读回全 F 当成“表空了”误删所有表项用数量/行为对账不硬读自检清单能用自己的话答上来这部分就算过关。四本账FDB、VLAN、L3、ACL 四本账的查找顺序是什么哪本可能提前结束FDB 的三种来源分别是什么动态学习由谁做VLAN 的 PVID、成员关系、Tag/Untag 分别管什么L3 转发为什么要查“路由表 邻居表”两本邻居表没货时包裹怎么办TCAM 的“三态”是什么意思ACL 下发失败常见原因有哪些初始化初始化八步的顺序是什么为什么不能先开端口再初始化表项每一步失败后怎么回滚运行中出错和 probe 失败的处理有什么不同错误恢复时为什么要先释放锁对账对账的三种触发方式是什么各有什么优缺点硬件表不支持读回时怎么对账对账为什么要和正常下发互斥一句话总结仓库四本账ACL 拦、VLAN 分、FDB 找、L3 跨开业八步走每步带超时、失败往回拆账本对不上就定期盘多了删、少了补、错了改盘点时别让人同时改账。这三件事做好了交换机才“转得对、起得来、错能修”做不好就是“表项时有时无、端口起不来、复位后全乱”这类最让人头疼的问题。版权说明本文为原创技术笔记欢迎转载转载请注明出处。文中比喻仅用于降低理解门槛具体实现请以对应芯片手册和内核版本源码为准。
企业数字化 ERP 产品动态
相关推荐
数控系统电池维护规范:避免参数丢失的正确做法 数控系统数据丢失是令许多企业头疼的问题,而电池失效是首要原因。西门子840D等高端数控系统依赖电池维持SRAM中的关键数据,一旦电池耗尽,机床参数、加工程序、刀具数据将全部丢失,恢复成本极高。本文系统介绍数控系统电池维护的正… · 2026/11/5 9:09:00
量变与质变的底层本质| 赵杰 | 量子哲学 作者:赵杰清华大学硕士、微美全息云科技(NASDAQ:WIMI)董事长、微算法科技(NASDAQ:MLGO)董事长、育杰奖学金创始人一、爱子论核心公理(一切变化的量子本体基础)1. 爱子定义… · 2026/11/5 9:09:00
RHCSA快速复习总结 RHCSA 重点总结RHCSA 是红帽认证的入门级,核心是 Linux 系统基础管理。本文按「系统入门 → 文件与文本 → 用户权限 → 网络软件 → 进程磁盘」的顺序提炼重点,方便快速复习。一、系统入门与安装Linux 由内核统一管理硬件,上层通过系统调用对… · 2026/11/5 9:07:59
EtherCAT从入门到精通(4) 接前一篇文章:EtherCAT从入门到精通(3) 本文内容参考:
EtherCAT 协议详细解析_ethercat通讯协议-CSDN博客
特此致谢! 二、认识
2. EtherCAT核心技术原理
(4)同步机制:分布式时钟… · 2026/11/5 9:12:03
AllData基于开源项目DataCap构建数据中枢平台,完成JDBC组件拖拽式数据集成多源数据互通,开箱即用 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 9:12:03
什么是加密货币凭证? /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 9:12:03
2026生活服务业小程序开发哪家强?门店商家选型参考 2026生活服务业小程序开发哪家强?门店商家选型参考据商务部公开数据,我国现有超3200万零售个体户,全国一刻钟便民生活圈试点已覆盖195.4万个商业网点,服务居民1.68亿人;QuestMobile《2026全景生态流量春季报告》显示&a… · 2026/11/5 9:12:03
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38