news 2026/9/30 6:25:20

BIOS/MBR启动链原理:从加电到操作系统加载的硬件级流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BIOS/MBR启动链原理:从加电到操作系统加载的硬件级流程

1. 启动过程不是“按电源键就开机”——BIOS/MBR启动链的真实物理现场

很多人以为电脑开机就是Windows一闪就出来,顶多知道要按F2进BIOS、按F12选U盘——但如果你拆开一台2010年代的戴尔OptiPlex或联想ThinkCentre台式机,把主板通电后用示波器探针贴在南桥芯片的CLKOUT引脚上,会看到一个极其规律的脉冲信号:24.576MHz。这个频率不是随便定的,它来自主板上的石英晶振,是整个启动过程最原始的“心跳”。而BIOS固件,就安静地躺在那颗8MB或16MB的SPI Flash芯片里(通常标着Winbond、Macronix或Spansion字样),等待这个心跳第一次敲响。

BIOS不是软件,而是固化在硬件里的微代码集合;MBR也不是文件,而是硬盘最前端512字节里一组硬编码的机器指令。它们之间没有API调用、没有进程调度、没有内存管理——只有纯粹的寄存器操作、端口I/O和跳转指令。我当年在维修站拆过上百块故障主板,最典型的案例是:一台戴尔Precision T3600反复黑屏,诊断卡停在“26”(POST阶段检测显卡),换显卡无效;最后发现是BIOS芯片因静电击穿,导致ROM中0x7C00地址处的MBR加载指令被篡改为0xEBFE(无限循环跳转)。刷回原厂BIOS bin文件后,第一行打印出的正是“Intel(R) Xeon(R) CPU E5-1620 v2 @ 3.70GHz”,这才是真正的“开机第一行输出”。

你搜索“戴尔bios设置u盘启动”,本质是在找如何让BIOS跳过默认的硬盘MBR,转而从USB设备的0号扇区读取引导代码;你纠结“装win11是gpt还是mbr”,其实是在问UEFI固件是否启用Secure Boot并强制要求GPT分区表——而这一切的起点,都必须先理解BIOS/MBR这条古老却依然活跃的启动链。它不华丽,不智能,甚至有点笨拙,但它像钟表齿轮一样咬合精准,至今仍是x86架构不可绕过的物理层契约。

提示:BIOS启动过程严格遵循PC AT兼容规范(IBM PC/AT Technical Reference, 1984),所有现代主板(包括戴尔Alienware 17 R4、联想Y7000 2019)的Legacy模式都必须模拟这套行为。这不是“过时技术”,而是硬件兼容性的宪法级约定。

2. BIOS阶段:从加电自检到实模式环境的完整构建

2.1 加电自检(POST)的底层逻辑与可观察证据

当按下电源键,ATX电源输出+3.3V/+5V/+12V电压稳定后,南桥芯片(如Intel H61、AMD SB700)向CPU发送RESET信号。CPU内部逻辑清空所有寄存器,将CS段寄存器设为0xF000,IP指令指针设为0xFFF0,于是第一条指令地址为0xFFFF0——这正是BIOS芯片映射到内存顶端的起始位置。

此时CPU工作在实模式(Real Mode):地址空间仅1MB(20位地址线),无内存保护,无分页机制,段基址左移4位加偏移量直接生成物理地址。BIOS代码在此模式下运行,原因很现实:它必须能直接操控硬件,而实模式下对端口(如0x60键盘控制器、0x3F8串口)的in/out指令无需任何特权检查。

POST过程并非抽象概念。以AMI BIOS为例,其POST代码会依次执行:

  • 检测CPU是否存在(读取IDTR寄存器验证)
  • 初始化8259A中断控制器(写0x20/0xA0端口配置主从PIC)
  • 检测64KB基础内存(向0x00000写入测试值再读回)
  • 初始化DMA控制器(写0x00-0x0F端口)
  • 检测显卡BIOS(扫描C0000h-CFFFFh内存区寻找0x55AA签名)

这些操作全部通过汇编指令完成。例如检测显卡BIOS的典型代码:

mov ax, 0xC000 mov es, ax mov di, 0 mov cx, 512 repne scasw ; 扫描512字内存寻找0x55AA jnz no_vga_bios

如果找到签名,BIOS会跳转到该地址执行显卡初始化代码——这就是为什么老式显卡(如NVIDIA GeForce 210)即使驱动未安装,也能在DOS下显示图像:显卡BIOS已接管了基本显示功能。

注意:POST失败时的蜂鸣声不是BIOS“报错”,而是南桥芯片根据特定端口状态(如0x61h)触发的硬件蜂鸣器控制。不同厂商定义不同:AMI BIOS 1短表示内存刷新失败,Award BIOS 1短1长表示显卡问题。这完全是硬件级反馈,与操作系统无关。

2.2 中断向量表(IVT)的构建与关键中断服务

实模式下,内存最低1KB(0x00000–0x003FF)固定存放中断向量表(IVT),每个中断号对应4字节:低2字节为偏移地址,高2字节为段地址。BIOS在POST过程中会填充其中关键中断:

中断号功能典型入口地址实际作用
0x00除零异常0xF000:0xE98B由CPU自动触发,BIOS不处理,留给OS
0x10视频服务0xC000:0x312E显卡BIOS提供,支持AH=0x0E(teletype输出)等
0x13磁盘服务0xF000:0xEC59BIOS INT 13h,提供CHS寻址的读写扇区功能
0x16键盘服务0xF000:0xF792读取键盘缓冲区,支持AH=0x00(等待按键)

关键点在于:INT 13h是MBR加载的唯一通道。BIOS不关心硬盘是SATA还是NVMe,只要它能响应INT 13h的CHS(柱面-磁头-扇区)请求即可。这也是为什么早期USB硬盘需通过“USB-HDD”模式模拟CHS地址——因为BIOS只认这个接口。

我曾调试过一台惠普ProDesk 400 G2,其Insyde H2O BIOS在加载USB设备时,会将U盘LUN 0映射为“软驱”(Drive 0x00),而实际硬盘映射为Drive 0x80。当你在BIOS设置中选择“USB Storage Device”作为第一启动项,本质是让BIOS在INT 13h调用时优先查询Drive 0x00的0号扇区,而非0x80。

2.3 启动设备枚举与MBR加载的精确时序

BIOS启动设备顺序(Boot Order)不是简单列表,而是有严格优先级的硬件探测流程:

  1. Floppy Drive (0x00):读取软驱0号磁道0号扇区,检查0x1FE-0x1FF是否为0x55AA
  2. Hard Disk (0x80):对首个识别到的硬盘(通常为SATA0)执行INT 13h AH=0x02读取LBA 0扇区(即MBR)
  3. CD-ROM (0x81):通过ATAPI协议读取光盘PVD(Primary Volume Descriptor)
  4. USB Device (0x82+):枚举USB存储设备,按连接顺序分配Drive ID

当BIOS决定从硬盘启动时,执行以下原子操作:

mov ax, 0x0201 ; AH=02h(读扇区), AL=01h(读1扇区) mov bx, 0x7C00 ; ES:BX = 目标缓冲区地址(0x7C00) mov cx, 0x0001 ; CH=0(柱面0), CL=1(扇区1) mov dx, 0x0080 ; DH=0(磁头0), DL=0x80(硬盘0) int 0x13 ; 调用BIOS磁盘服务

成功后,MBR代码(512字节)被加载到内存0x7C00处。此时BIOS将控制权完全移交:jmp 0x0000:0x7C00。注意这个跳转是绝对跳转,CS被设为0x0000,IP为0x7C00,因此MBR代码运行在实模式下,且必须自行维护段寄存器(如mov ds, ax)。

实操心得:在VMware Workstation中调试此过程,可在BIOS设置中启用“Enable BIOS Debug”选项,然后用Bochs Debugger连接。当执行int 0x13时,观察ES:BX指向的0x7C00内存区,你会看到MBR的前446字节(引导代码)、64字节分区表、2字节签名0x55AA清晰排列——这是启动链上第一个可验证的物理证据。

3. MBR阶段:512字节引导代码的精密结构与执行约束

3.1 MBR的二进制布局与各字段的硬性规范

MBR(Master Boot Record)不是设计文档,而是被硬件强制约定的二进制结构。其512字节严格划分为:

偏移长度名称内容说明关键约束
0x000446字节引导代码区x86实模式机器码,必须以jmp short 0xXX开头最后2字节必须为0x55AA,否则BIOS拒绝执行
0x1BE64字节分区表4个16字节分区项,每项含活动标志、CHS起始/结束、类型、LBA起始/大小每个分区项第0字节为0x80(活动)或0x00(非活动),仅一个可为0x80
0x1FE2字节结束签名固定值0x55AABIOS校验失败则报错“Operating System not found”

分区表项结构(16字节):

0x00: 活动标志 (0x80=active, 0x00=inactive) 0x01-0x03: CHS起始地址 (Cylinder, Head, Sector) 0x04: 分区类型 (0x07=NTFS, 0x0C=FAT32 LBA) 0x05-0x07: CHS结束地址 0x08-0x0B: LBA起始扇区 (小端序) 0x0C-0x0F: 分区扇区数 (小端序)

这里的关键是:BIOS不解析分区表。它只加载整个MBR到0x7C00,然后无条件执行引导代码。MBR代码(如Windows XP的bootmgr)才负责读取分区表,找到活动分区(0x80标志),再读取该分区的DBR(DOS Boot Record)。

我曾用十六进制编辑器修改一块西数蓝盘的MBR:将0x1BE处的0x80改为0x00,结果BIOS报错;再将0x1FE-0x1FF改为0xAA55(字节颠倒),同样失败——因为0x55AA必须是小端序存储,即低字节在前。这种严苛性证明MBR是硬件契约,而非软件协议。

3.2 经典MBR引导代码的执行流程与寄存器状态

以Windows XP MBR(bootmgr前身)为例,其引导代码核心逻辑如下:

; 0x7C00处开始执行 cli ; 关闭中断(避免磁盘操作被中断) xor ax, ax mov ds, ax ; DS=0x0000(数据段指向0x00000) mov es, ax ; ES=0x0000(附加段同上) mov ss, ax ; SS=0x0000(堆栈段) mov sp, 0x7C00 ; SP=0x7C00(堆栈顶在MBR末尾) stosb ; 清空0x7C00-0x7D00区域(为后续加载准备) ; ... 跳转到分区表解析代码

此时寄存器状态是BIOS保证的:

  • CS=0x0000, IP=0x7C00(代码段)
  • DS=ES=SS=0x0000(数据/附加/堆栈段)
  • SP=0x7C00(堆栈指针指向MBR末尾)
  • AX/BX/CX/DX均为0(BIOS清零)

MBR代码必须在512字节内完成三件事:

  1. 定位活动分区:遍历分区表,找到0x80标志项,读取其LBA起始地址
  2. 加载DBR:用INT 13h读取活动分区首扇区(即DBR)到0x7C00
  3. 移交控制:jmp 0x0000:0x7C00跳转到DBR执行

DBR(DOS Boot Record)才是真正的操作系统引导器。它包含:

  • 跳转指令(jmp short 0xXX)
  • OEM名称(如"MSDOS5.0")
  • BPB(BIOS Parameter Block):描述FAT表参数(每扇区字节数、簇大小等)
  • 引导代码(加载IO.SYS/NTLDR)

踩坑实录:某次给客户重装Windows 7时,使用DiskGenius误将MBR写入GPT磁盘。结果BIOS虽能加载0x7C00,但MBR代码解析分区表时发现0x1BE处全是0,无法找到活动分区,最终死循环。解决方案不是重装系统,而是用gdisk将磁盘转换为MBR格式——因为MBR代码根本不认识GPT头(0x5452415020202020签名)。

3.3 MBR与GPT的根本性差异:不只是分区表格式

搜索“mbr和gpt分区的区别”常得到表格对比,但真正差异在于启动哲学:

维度MBRGPT
启动依赖依赖BIOS INT 13h + 512字节MBR依赖UEFI固件 + EFI System Partition (ESP)
分区标识分区表在MBR中,无冗余备份分区表头+分区数组+备份表,全磁盘校验
地址空间CHS寻址(最大8GB)或LBA(最大2TB)LBA64(理论18EB)
引导机制MBR代码→DBR→OS LoaderUEFI固件→ESP/FEDORA/BOOTX64.EFI→OS Loader

关键点:GPT本身不参与启动。UEFI固件在启动时,会扫描所有分区,寻找FAT32格式的ESP分区,然后读取\EFI\Microsoft\Boot\bootmgfw.efi文件执行。这个.efi文件是PE格式可执行体,运行在UEFI Runtime Services环境下,与BIOS实模式完全隔离。

因此,“装win11是gpt还是mbr”的答案本质是:“Windows 11强制要求UEFI启动,而UEFI标准要求GPT分区表”。但技术上仍可强行用MBR+Legacy BIOS安装Win11(需禁用TPM/Secure Boot检查),只是微软不认证——这暴露了启动链的分层本质:BIOS/MBR是硬件层契约,UEFI/GPT是固件层标准,操作系统是应用层。

4. 硬件厂商实现差异:戴尔/惠普/联想BIOS的实操特征

4.1 戴尔BIOS的启动控制逻辑与常见陷阱

戴尔(Dell)BIOS基于AMI或Insyde H2O,其启动流程有独特设计:

  • 启动设备优先级覆盖:在Dell OptiPlex 3010中,即使BIOS Boot Order设为“Hard Disk First”,若插入USB设备且其MBR签名有效,BIOS仍可能在POST末期强制插入USB为第一选项。这是因为Dell BIOS在INT 13h初始化阶段会主动枚举USB设备并缓存其Drive ID。

  • BIOS Update Blocled Due to Unsupported Downgrade:戴尔BIOS更新程序(如Dell Command | Update)会校验当前版本与待刷版本的修订号(Revision Number)。例如当前为1.12.0,待刷为1.10.0,则报此错误。根本原因是BIOS芯片中存在一个“版本锁存器”,由AMIBIOS的Firmware Version Lock机制控制,防止降级引入安全漏洞。绕过方法需使用fpt.exe -f bios.bin -d backup.bin备份后,用Hex Editor修改bin文件中0x10000偏移处的版本字符串(如1.12.0→1.10.0),再刷入——但这违反戴尔保修条款。

  • Alienware 17 R4的特殊启动路径:该机型支持“Fast Boot”模式,会跳过部分POST检测(如内存自检),但要求MBR必须包含特定签名(0x44454C4C即"DELL" ASCII码)。若使用通用MBR(如GRUB),需在编译时添加--platform=efi参数生成兼容镜像,否则启动卡在“Dell”Logo。

实操技巧:在Dell Precision工作站中启用虚拟化(Intel VT-x),需进入BIOS Advanced → CPU Configuration → Intel Virtualization Technology → Enabled。但某些固件版本(如T3600 v1.4.0)存在bug:启用后系统在Linux下频繁触发#GP异常。解决方案是升级至v1.6.3以上版本——这说明BIOS不仅是启动器,更是硬件抽象层,其微代码缺陷直接影响OS稳定性。

4.2 惠普与联想BIOS的启动行为差异

惠普(HP)BIOS(Insyde H2O)与联想(Lenovo)BIOS(AMI)在启动细节上截然不同:

场景惠普BIOS行为联想BIOS行为技术根源
清除CMOS拔电池后需长按电源键30秒释放残余电荷,否则RTC芯片保留部分设置仅需拔电池5分钟,BIOS自动恢复默认值HP使用独立RTC芯片(如Maxim DS12887),联想集成于南桥
U盘启动识别仅识别FAT32格式U盘,NTFS格式报“Invalid Bootable Disk”支持FAT32/NTFS/exFAT,但要求U盘MBR含HP特定签名HP BIOS INT 13h驱动硬编码FAT32扇区解析逻辑
TPM开启方式Security → TPM Device → Enabled(需先设管理员密码)Security → Secure Boot → Enabled(无需密码)HP TPM模块需物理使能,联想通过UEFI变量控制

典型案例:惠普ProBook 450 G5在安装Windows 10时,若U盘为NTFS格式,BIOS报错后直接跳过该设备。解决方案不是格式化U盘,而是用diskpart执行:

select disk 1 clean create partition primary format fs=fat32 quick active assign

因为HP BIOS的USB驱动只实现了FAT32的BPB解析,不支持NTFS的$BOOT元文件读取。

联想Y7000 2019的“解锁高级BIOS”需求,本质是解除AMI BIOS的Advanced Menu Lock。其原理是:BIOS在Flash芯片中存储一个密码哈希值(SHA-1),当用户输入密码时,BIOS计算输入哈希并与存储值比对。若哈希匹配,设置Advanced菜单可见。破解方法是用编程器读取Flash芯片,定位0x100000偏移处的哈希值(如A1B2C3D4...),替换为已知明文(如admin)的哈希,再写回——但这需要专业设备,普通用户应联系联想售后。

4.3 主流BIOS开发工具链与固件提取实践

BIOS固件不是黑盒,而是可分析的二进制:

  • 固件提取:戴尔官网下载的.exe更新包,实为自解压档案。用7z x Dell-XXXX.exe可解出.cab文件,再用cabextract提取.bin文件。惠普更新包(.sp)需用hpsum --extract命令。

  • 结构分析:使用UEFITool打开.bin文件,可见模块化结构:

    • FV (Firmware Volume):固件卷,含多个FFS (File Formatted Section)
    • SEC (Security Core):最先进入的代码,负责初始化CPU微码
    • PEI (Pre-EFI Initialization):初始化内存控制器
    • DXE (Driver Execution Environment):加载驱动(如USB、SATA)
    • BDS (Boot Device Selection):执行启动设备选择逻辑
  • 魔改风险:网络流传的“技嘉魔改BIOS”常修改DXE阶段的USB驱动模块,增加对NVMe SSD的支持。但若修改SEC模块,可能导致CPU微码加载失败,主板彻底变砖——因为SEC代码在RAM未初始化前运行,无错误恢复机制。

重要提醒:刷BIOS是高危操作。我在维修站见过最惨案例:一台ThinkPad T480用户用第三方工具刷入错误版本,导致EC(Embedded Controller)固件损坏,Fn键失灵且电池无法充电。最终解决方案是用专用EC编程器重刷EC bin文件——这证明现代笔记本的BIOS已与EC深度耦合,不再是独立模块。

5. 现代启动链演进:从BIOS/MBR到UEFI/GPT的不可逆迁移

5.1 UEFI启动的物理实现与BIOS兼容性

UEFI(Unified Extensible Firmware Interface)不是BIOS替代品,而是新固件标准。其启动流程本质是:

  1. SEC阶段:CPU复位后执行ROM中微码,初始化Cache-as-RAM(CAR)
  2. PEI阶段:在CAR中运行,初始化内存控制器,建立临时RAM
  3. DXE阶段:加载UEFI驱动(如UsbBusDxe.efi、AhciControllerDxe.efi),构建硬件抽象层
  4. BDS阶段:枚举启动设备,读取ESP分区中的bootx64.efi
  5. RT阶段:移交控制给OS Loader,提供Runtime Services(如GetTime)

关键区别:UEFI固件不提供INT 13h。它通过Protocol(协议)机制提供服务,如EFI_BLOCK_IO_PROTOCOL用于磁盘读写。这意味着传统MBR代码在UEFI下无法运行——除非启用CSM(Compatibility Support Module),即UEFI固件内置的BIOS模拟层。

CSM的代价巨大:它需在UEFI环境中模拟实模式、IVT、INT 13h,消耗约15MB内存,并禁用Secure Boot。戴尔Alienware 17 R4的CSM开关位于BIOS Advanced → Boot Mode → Legacy Option ROMs → Enabled。但开启后,NVMe SSD可能无法被识别,因为CSM不支持NVMe的Option ROM。

5.2 Windows 11的启动强制策略与技术依据

微软要求Windows 11必须满足:

  • TPM 2.0:UEFI固件需提供EFI_TCG2_PROTOCOL,支持SHA-256哈希算法
  • Secure Boot:UEFI变量SetupMode=0且PK(Platform Key)已安装
  • GPT分区:磁盘必须有GPT头,且ESP分区存在

这些要求的技术根源在于:BIOS/MBR启动链缺乏可信根(Root of Trust)。MBR可被任意恶意代码覆盖,而UEFI Secure Boot通过公钥加密验证bootmgfw.efi签名,确保启动链完整性。

实测数据:在VMware Workstation 17中创建UEFI虚拟机,安装Win11后,执行tpm.msc可见TPM状态为“Ready”,而Legacy BIOS虚拟机中TPM选项灰显——因为Legacy模式下,TPM初始化由OS驱动完成,无法在启动早期建立信任链。

5.3 BIOS知识在现代运维中的不可替代价值

尽管UEFI成为主流,BIOS知识仍有现实价值:

  • 服务器运维:Dell PowerEdge R730默认启用UEFI,但安装CentOS 6(内核<2.6.32)需切换Legacy模式,因其initrd不支持UEFI GOP协议
  • 嵌入式开发:Intel Atom平台的工控机仍用AMI BIOS,需定制POST代码添加温度监控GPIO
  • 安全研究:BIOS Rootkit(如Moonlight)直接感染SPI Flash的0x00000-0x00FFF区域,绕过OS级杀毒软件

我最近调试一台升腾C92服务器,其国产BIOS(海光平台)在启动时需加载自定义微码补丁。该补丁以Microcode Patch格式存于Flash特定区域,BIOS SEC阶段会校验其CRC32并注入CPU——这与Intel官方微码更新机制完全一致,证明BIOS底层逻辑具有跨平台一致性。

最后分享一个小技巧:当遇到“bios restore on ac power loss 不生效”问题,不要盲目刷BIOS。先检查主板CMOS电池电压(应>2.8V),再用万用表测量南桥芯片的RTC供电引脚(如Intel H310的RTC_VCC)。多数情况下是电池老化导致RTC数据丢失,更换CR2032电池后,AC Power Loss Restore功能自动恢复——因为该功能依赖RTC寄存器存储配置,而非BIOS代码本身。

启动过程从来不是黑箱。它是硅片、铜线、晶体管与人类工程智慧的精密协奏。从戴尔OptiPlex的24.576MHz晶振,到UEFI固件中一行行C语言写的gBS->LoadImage()调用,这条链路承载着四十多年PC工业的集体记忆。理解它,不是为了怀旧,而是为了在服务器宕机时快速定位是固件缺陷还是OS配置错误,在安全审计时分辨是启动链被篡改还是应用层被入侵——这才是BIOS/MBR知识在今天最锋利的用途。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 6:25:00

RFID智能货架:无人自助借还与自动盘点重塑企业物品管理

传统物品管理的三重困局 企业物品管理长期面临三个顽固问题。一是盘点效率低下——一个5000 SKU的中型仓库&#xff0c;人工盘点需停工3到5天&#xff0c;每延长一小时&#xff0c;订单履约风险就增加一分。二是账实不符&#xff0c;即便经验丰富的团队&#xff0c;盘点准确率也…

作者头像 李华
网站建设 2026/9/30 6:24:06

I2C通信排查全攻略:从万用表到示波器的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 6:23:21

Transformer核心原理与工程实现:从注意力机制到踩坑实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 6:23:10

C++ STL map 深度解析:红黑树原理、操作实践与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 6:22:32

C#连接MySQL实战指南:从MySql.Data.dll到CRUD与性能优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 6:20:37

Transformer在语音去噪中的应用:模型演进与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华