news 2026/9/27 6:42:12

GD32烧录全攻略:从工具选型到芯片解锁避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GD32烧录全攻略:从工具选型到芯片解锁避坑指南

GD32这几年在国产MCU里热度一直很高,指令集兼容STM32的F1/F2/F3/F4等系列,换过来基本不用大改代码,采购成本和供货稳定性又比进口芯片省心,所以越来越多项目直接拿它当主控。我做嵌入式开发这些年,从STM32切到GD32之后,发现很多朋友卡住的第一个点不是写代码,反而是烧录。Keil里编译完一按下载,要么提示找不到芯片,要么连接超时,要么芯片直接锁死,问题五花八门。与其一个一个回答,不如把GD32烧录这件事从头到尾讲透,从工具选型、驱动安装、接线方式,到固件下载、Keil集成、VSCode扩展,再到解锁和避坑,一篇全捋清楚。

这篇文章主要面向两类人:一是刚开始用GD32、照着STM32习惯折腾烧录结果频频翻车的新手;二是已经上板调试,遇到“芯片读保护”“连接失败”“驱动装不上”等实际问题,想快速找到解决办法的工程师。内容以GD-Link Utility这个官方工具为主,配套GD32官方固件库的资源获取方式,同时补充J-Link、OpenOCD、串口ISP等替代方案,方便你根据手头的调试器灵活选择。

1. 动手之前,先搞清楚烧录的底层逻辑

1.1 烧录的本质:把程序写进Flash,并且让芯片知道你写了什么

很多刚从51单片机转过来的朋友,对“烧录”的理解就是“把hex文件塞进芯片”,但到了ARM Cortex-M架构的GD32上,整个过程远不止复制文件这么简单。

GD32芯片内部的Flash区域不仅存你写的程序,还存着中断向量表、选项字节(Option Byte)、读保护等级等信息。烧录器通过SWD或JTAG接口连上芯片后,要做的是:

  • 擦除指定扇区,保证Flash处于全0xFF状态;
  • 把编译生成的hex或bin文件按地址逐段写入;
  • 校验写入的数据是否与文件一致;
  • 必要时配置选项字节,比如读保护等级、看门狗配置、BOOT启动方式等。

这就像往仓库里搬货,你得先知道每个货架(扇区)的编号和承重,然后按位置码放,最后还要盘点一遍。GD-Link Utility做的事情就是把这套流程封装成了图形化界面,让你点几下鼠标就能完成。

1.2 GD-Link Utility在GD32开发中的定位

GD-Link Utility是兆易创新官方提供的烧录软件,免费、不需要注册、界面简洁,专门配合GD-Link调试器或者板载GD-Link使用。它对应的地位相当于ST家的STM32CubeProgrammer,但体积更小,操作更直接。

实际工作中我用它主要干这几件事:

  • 烧录hex/bin文件到GD32全系列芯片;
  • 读取、修改、验证选项字节;
  • 查看Flash内容,读取芯片信息;
  • 解除芯片的读保护(解决“芯片锁死”问题);
  • 擦除整片Flash,恢复到出厂干净状态。

对量产和研发来说,这几乎是一站式工具。特别要说的是,GD-Link Utility的芯片支持列表覆盖了GD32F1/F2/F3/F4/E1等主流系列,以及最新的GD32F5、GD32C1等型号,所以“全系列”这个词不是宣传话术,而是它真的能通吃。

2. 环境准备:驱动、软件、硬件一个都不能少

2.1 下载与安装GD-Link Utility软件

先说软件怎么来。GD32的官网地址是www.gd32mcu.com,进入“GD32 MCU”页面后,找“工具与软件”或者“开发工具”分类。GD-Link Utility的下载链接通常放在“GDLINK”“调试器”或“工具软件”栏目下。我第一次找的时候也绕了点弯路,因为页面上英文名有时候写的是“GD32 MCU ISP Programmer”或者“GD-Link Programmer”,注意认准“GD-Link Utility”这个全称。

下载下来是个exe安装包,直接双击安装,一路Next即可。装完后桌面会出现快捷图标,打开后界面主要有四个区域:

  • 菜单栏和工具栏:文件加载、连接、烧录、擦除、选项字节等操作入口;
  • 芯片信息区:显示当前连接的芯片型号、ID、Flash大小、读保护状态;
  • 脚本/日志区:显示连接、擦除、写Flash的详细日志,排查问题主要看这里;
  • Flash编程区:显示文件地址、目标地址、擦除方式等设置项。

安装过程中有个细节:它会自动安装GD-Link的USB驱动,但如果你电脑上之前装过其他调试器驱动,有概率会出现驱动冲突。安装完建议把调试器拔了重新插一次,让系统重新枚举设备。

2.2 GDLINK驱动装不上的解法

驱动是烧录环节里最容易出问题的点,没有之一。插上GD-Link后,打开设备管理器(Win+X,然后选“设备管理器”),正常情况会看到“GigaDevice”系列设备,比如:

  • GigaDevice GD-Link ARM Debugger
  • GigaDevice GD-Link CMSIS-DAP

如果看到黄色感叹号,说明驱动没装好。处理方法有几种:

  1. 用驱动精灵或360驱动大师扫描修复,这是最省事的,但注意别让它连其他硬件驱动也乱更新;
  2. 手动指定驱动路径:右键设备→更新驱动程序→浏览我的电脑→从GD-Link Utility安装目录里选驱动文件夹,一般在C:\Program Files (x86)\GigaDevice\GD-Link Utility\Driver或类似路径下;
  3. 如果系统提示“无法验证发布者”,按F8进入高级启动选项,禁用驱动程序强制签名后再装,这个在Win10/Win11上偶尔会遇到。

我自己的经验是,如果装完驱动怎么都不识别,先怀疑USB线。GD-Link调试器对线材要求不低,有些只能充电的线用不了,换根带数据传输的短线,大概率就好了。

2.3 硬件接线:SWD四根线看懂就够

GD-Link与目标板的连接,标准方案是SWD接口,只需要四根线:

信号作用接目标板位置
SWDIO数据输入输出芯片的SWDIO引脚(PA13)
SWCLK时钟信号芯片的SWCLK引脚(PA14)
GND地线,必须同地目标板GND
3V3供电目标板VDD或者外部供电

有些调试器还引出了RST引脚,用来复位目标芯片,但SWD方式不是必须的。我个人习惯在SWDIO和SWCLK各串一个0欧电阻,平时烧录正常,万一程序把引脚复用成普通IO了,直接断开电阻还能救回来。

注意接线长度不要太长。SWD虽然抗干扰比JTAG强,但线长超过20cm就容易在高速模式下翻车。GD-Link上有个频率选择,如果遇到连接不稳定,先把速度降低,比如从10MHz降到1MHz,这是最土但最有效的解法。

3. 手把手烧录:GD-Link Utility完整操作流程

3.1 建立连接:芯片选择是第一步

打开GD-Link Utility后,首先在工具栏找到“Target”下拉框,选择你当前用的芯片型号。这个步骤很多人会忽略,但芯片型号选错,后面的连接和烧录大概率出错。

选择型号的要点:GD32F103系列和STM32F103系列引脚兼容,但GD-Link Utility识别芯片是靠芯片内部的Device ID来校验的。你选了GD32F103RCT6,工具会自动读取硬件上的ID Code,两边对不上就会报错。所以,别想着“我用的GD32,但里面拿STM32型号来选行不行”,工具不会认。

选好型号后,点“Connect”或者“Target→Connect”,正常情况下日志区会打印类似:

Connecting to target... Target device ID: 0x410 Device: GD32F103C8T6 Flash size: 64 KB Connection established.

这时芯片信息区会显示具体的型号、Flash容量、读保护等级。如果连接失败,优先检查接线、供电、芯片是否进入低功耗模式,以及SWD引脚有没有被程序占用。

3.2 载入固件文件:hex和bin的处理方式

连接成功后,点击“File→Open”或工具栏上的文件夹图标,选择你的固件文件。

  • hex文件:Intel hex格式,自带地址信息,工具会自动识别每条数据记录对应的Flash地址,你不需要手动设偏移;
  • bin文件:裸二进制数据,没有地址信息,需要你手动填写“Download Address”,比如GD32F103的Flash起始地址是0x08000000。

这里有个坑要提醒:Keil默认编译输出的是axf文件,想要hex或bin,需要额外勾选配置。Keil里的操作是:

  1. 打开“Options for Target”;
  2. 切到“Output”选项卡;
  3. 勾选“Create HEX File”。

bin文件生成需要在“User”选项卡的After Build/Rebuild里加一条指令:

fromelf --bin --output="$(ProjectDir)\Objects\@L.bin" "#L"

实操中我一般优先用hex文件,因为地址信息自带,少操心。

3.3 执行烧录与校验

载入文件后,确认Flash编程区域的配置:

  • Erase Type:擦除方式,建议选“Full Chip”,省事且干净。缺点是全片擦除比较慢,如果只是小改动,也可以选“Sector Erase”只擦除涉及扇区;
  • Program @:目标起始地址,用hex文件时自动填充,用bin时需要手动指定;
  • Verify After Programming:强烈建议勾选。程序烧完工具会把Flash内容再读一遍和文件对比,确认没有写入异常。

点“Program”或“Download”按钮后,日志区会显示类似内容:

Erasing sectors... Programming at address 0x08000000... Programming done. Verifying... Verification OK.

看到“Verify OK”或者“Download successful”才是真正烧录成功。烧完后一般还要断电重启板子,或者点“Reset Run”让芯片复位运行。

3.4 选项字节的读取、修改与坑

GD-Link Utility的“Option Bytes”功能,是实际项目里最容易踩坑的地方。

GP32和几乎所有Cortex-M MCU一样,选项字节里存着读保护等级(RDP)、硬件看门狗、BOOT模式等关键配置。默认情况下,出厂值一般是:

  • RDP等级:0xAA(Level 0,无读保护);
  • WDG_SW:硬件看门狗选择软件模式,方便调试;
  • BOOT_MODE:从主Flash启动或从系统存储启动。

我遇到过不少朋友,在开发调试阶段,程序里不小心把读保护等级改成了Level 1(0xBB)或Level 2(0xCC),结果芯片直接连不上调试器,Keil报“RDDI-DAP Error”或者“Cannot access target”。这种症状就是大家常说的“芯片锁死”。

解除锁死的方法很简单:

  1. 打开GD-Link Utility,连接目标芯片;
  2. 点“Option Bytes”—“Read”读取当前配置;
  3. 把RDP等级改回Level 0(0xAA);
  4. 点“Apply”,工具会先擦除整片Flash再写入新的选项字节。

注意:解除读保护的过程会强制擦除整个Flash,不管你之前写了什么都会没掉。所以,片子“锁死”不等于变砖,只是Flash被保护了,数据也带不出来了。

4. 烧录失败、芯片异常?排查思路和解决方案

4.1 常见报错速查表

下面这张表是我整理的真实项目里最高频的报错和应对方法,建议收藏。

报错/现象可能原因快速解法
No target connected接线错误/目标板没供电检查SWD四线,确认3V3和GND连接
Target ID mismatch芯片型号选错在Target里重新选择正确的GD32型号
Cannot connect to target芯片已启用读保护/引脚被复用按住复位键同时点Connect,等方法见下文
RDDI-DAP ErrorKeil连接失败降低SWD频率,检查驱动,关闭其它占用调试器的软件
Programming failed at addressFlash写入异常/电压不稳换短线,降低SWD速率,检查目标板供电电压
Verify error at address...烧录途中突然掉电或线松重新插接线,重新烧录
No Flash Device found驱动异常/芯片进入DFU模式重装驱动,看设备管理器是否识别

4.2 按住复位键点连接,80%的救砖场景能用这招

如果你遇到“芯片已被程序搞死”,比如你在代码里初始化了SWD引脚、把时钟配置错了导致芯片跑飞,或者不小心启用了读保护,常规的连接方式可能一直失败。

这时候有个老朋友级别的技巧:按住目标板上的复位键,然后在GD-Link Utility里点Connect,同时在释放复位键的瞬间观察连接日志。原理是:芯片复位的极短时间内,调试接口仍然可用,工具抓住这个窗口期建立连接,然后在该时间段内执行全片擦除,把故障程序清掉。

操作步骤:

  1. 按住目标板复位键不放;
  2. 在工具里点Connect;
  3. 出现“Connecting...”字样时,瞬间释放复位键;
  4. 如果运气好,连接成功并读取到芯片ID;
  5. 立刻执行擦除整片Flash。

这招在单片机救砖圈是通用的,GD32、STM32都适用。如果一次不成功,可以多试几次,或者用GD-Link Utility的“Under Reset”模式(部分版本支持),效果类似。

4.3 GD32芯片锁死与解锁的完整操作

解锁操作在上一节已经提过,但这里我想补充两个细节:

第一,Level 2读保护是“永久保护”,一旦设置成0xCC,芯片将无法再通过调试接口做任何操作,连擦除都不行。所以GD32官方文档明确写Level 2是不可逆的,相当于把芯片物理封死。研发阶段千万别碰这个选项,除非你要批量出货且彻底不需要调试了。

第二,有些客户反馈“我烧录的时候提示读保护,怎么都连不上”,有时候不是读保护等级的问题,而是固件里调用了库函数nvic_irq_enable之类,把调试接口给关了。这种属于代码层面问题,解锁思路同上,按住复位键抢连接窗口,擦除后重新烧一个干净程序即可。

4.4 DFU模式:GD32的另一条烧录通道

除了SWD调试器,GD32还支持DFU模式烧录。DFU全称Device Firmware Upgrade,本质是芯片出厂固化的Bootloader里提供的一套USB升级协议。很多GD32芯片自带USB模块,把BOOT0引脚拉高后上电,芯片就会进入系统存储区运行Bootloader,通过USB连接电脑,可以被识别为一个DFU设备。

DFU模式和SWD烧录的关系是互补的:

  • SWD适合开发调试,连接稳定,速度快,能在线仿真;
  • DFU适合量产或现场升级,不需要额外的调试器,一根USB线就能烧。

GD32进入DFU模式的操作一般是:

  1. 把BOOT0跳到1(或用跳线帽短接);
  2. 用USB线连接GD32开发板的USB口和电脑;
  3. 上电复位;
  4. 电脑设备管理器出现“GD32 DFU Device”。

然后借助官方工具或第三方工具(如DfuSeDemo、GD32 MCU DFU Tool)来加载固件。

在网上搜“GD32 DFU驱动”时经常看到有人问装不上。原因是Win10/Win11系统默认不自动加载GD32的DFU驱动,需要手动安装,驱动文件一般在官方工具包或SDK的Utilities目录下。同样注意,安装时可能需要禁用驱动签名。

5. 不止烧录:固件库下载与工程搭建指南

5.1 官方固件库的下载渠道与版本选择

烧录这件事本身不难,但“能烧录的程序”得先从固件库开始。GD32官方固件库的获取途径主要有两个:

  1. 官方网站:www.gd32mcu.com,在“GD32 MCU”栏目下按芯片系列进入,找到“资料下载”或“技术文档”,部分系列会提供“固件库”压缩包;
  2. GitHub:兆易创新官方维护了GigaDevice组织,里面有各系列的固件库仓库。

以GD32F30x为例,固件库压缩包解压后的目录结构大致如下:

GD32F30x_Firmware_Library/ ├── Board // 板级驱动示例 ├── Examples // 外设例程,枚举很全 ├── Firmware │ ├── CMSIS // 内核相关头文件和启动文件 │ └── GD32F30x_standard_peripheral │ ├── inc // 标准外设头文件 │ └── source // 标准外设源文件 ├── Projects // 标准工程模板,含MDK/EWARM等 └── Utilities // 常用工具和调试辅助代码

固件库分两种风格:标准外设库和HAL库。GD32官网对F1/F2/F3/F4等主流系列都提供标准外设库,它和STM32的StdPeriph风格类似,函数名稍有不同比如gpio_init()对应STM32的HAL_GPIO_Init()。GD32H7等新系列则开始推广HAL风格。如果你是ST老用户,转过来会感觉很亲切。

5.2 从固件库建立标准工程模板

很多新手一开始最迷茫的就是“库下载下来不会建工程”。我建议直接拿官方“Projects”里的现有模板改。

比如GD32F103系列,固件库的Projects/01_GPIO_Running_Led就是最常见的跑马灯例程。用Keil打开后,你会看到一致的工程结构:

  • 启动文件:startup_gd32f10x_hd.s(根据Flash容量选择ld、md、hd等);
  • CMSIS系统文件:system_gd32f10x.c和system_gd32f10x.h;
  • 标准外设库源文件:gd32f10x_gpio.c、gd32f10x_rcu.c、gd32f10x_usart.c等;
  • 主程序:main.c和gd32f10x_it.c中断处理。

修改工程模板时有几个关键点:

  1. 芯片型号必须选择“GigaDevice”下的具体型号,Keil如果没识别到,需要先安装GD32的Device Pack;
  2. C/C++宏定义里要加对应型号的宏,比如GD32F10X_HD或GD32F30X_HD,这决定了启动文件和代码里条件编译走哪一段;
  3. 把标准外设库的include路径全部加进工程,漏掉就会报找不到头文件。

5.3 Keil、VSCode、Embedded Builder:工具链怎么组合

GD32开发最主流的IDE还是Keil MDK。跟STM32一样,GD32在Keil里需要安装Device Pack才能看到芯片型号。Pack安装方式:

  1. 打开Keil MDK的Pack Installer;
  2. 点右上角“齿轮”图标,从本地安装GD32的pack文件;
  3. pack文件可以从官网或GitHub下载,通常叫GigaDevice.GD32F10x_DFP.xxx.pack。

装完pack后,新建工程里选Target,就能看到“GigaDevice”厂牌和对应的GD32芯片型号。选芯片后,启动文件、Flash算法都会自动匹配好,连烧录算法(FLM文件)都不用手动添加,这步很省心。

如果你不想用Keil,现在也有两个越来越流行的玩法:

  • VSCode + EIDE插件:EIDE是VSCode里的一个嵌入式开发插件,支持GD32工程管理、编译、烧录。网上热词里提到的“vscode的eide插件开发gd32”,确实是一条很顺的路。EIDE的好处是免费、轻量、跨平台,用Keil的GCC或ARM Compiler都能翻编译。烧录时还可以调用外部工具链。
  • GD32 Embedded Builder:兆易创新推出的免费IDE,基于Eclipse+GCC,内置了GD32的工程向导,选完芯片型号自动生成模板,省去手动搬运固件库的麻烦。但它对调试器支持度略逊于Keil,如果你主要用J-Link搭配,可能还是建议Keil或VSCode。

5.4 用J-Link、OpenOCD烧GD32:替代方案经验

有些朋友手头没有GD-Link,只有J-Link或者ST-Link。能不能用来烧GD32?能。

用J-Link烧GD32:

J-Link的Segger工具包本身就支持几乎所有Cortex-M内核芯片。打开J-Flash软件:

  1. 新建工程,芯片型号选择时选“Cortex-M3/M4”对应内核,或者手动填GD32型号;
  2. 设置SWD连接模式;
  3. 加载hex/bin文件,点Program。

有时候J-Flash的芯片库会提示GD32型号ID码不识别,这种情况直接选相同内核的通用Cortex-M3/M4选项即可。GD32F10x是Cortex-M3内核,GD32F30x/F4xx是Cortex-M4F,选对应的就行。

用OpenOCD烧GD32:

OpenOCD是一款开源调试工具,支持众多MCU和调试器。接线方式与GD-Link完全一致。命令行传入脚本,比如:

openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c "program output.hex verify reset exit"

GD32F10x的内核和寄存器基本兼容STM32F10x,所以很多现成的STM32 target配置文件能直接跑。如果你用的调试器是CMSIS-DAP,那GDLINK本质上也是一个CMSIS-DAP设备,直接复用cmsis-dap.cfg接口脚本。

用ST-Link烧GD32:

ST-Link识别GD32需要一点技巧,因为ST-Link官方驱动对非ST芯片会校验IDCODE。常见做法是:

  1. 用STM32CubeProgrammer连接GD32,需要手动加“DEV_ID”到芯片列表或者用“Under Reset”模式;
  2. 或者用OpenOCD时,interface选stlink.cfg,target选stm32f1x.cfg,OpenOCD不做ID校验,能正常连接。

不过体验下来,稳定性不如GD-Link原生支持,建议有条件还是配一个GD-Link或J-Link。

6. 烧录之外的经验补充

最后聊几个开发过程中和烧录强相关的小经验。

关于烧录这件事本身,GD32系列在SWD接口的性能上表现不错,SWD最高能跑到几十MHz,但实际调试我并不会一直顶着上限用。原因很简单:接线质量、目标板布局、供电纹波都会影响稳定性。与其在高速模式下频繁掉线,不如稍微降低一点频率换安心。很多“烧录失败”问题,追根到底是低速就稳、高速就崩的接触问题。

我在实际项目里有一个习惯:给每个用到SWD的板子预留一组4P或10P的调试接口座,同时在板上加一个100nF的退耦电容靠近SWD接口供电脚。别看一个电容不起眼,它能消掉不少高频干扰,尤其是配合GD-Link这类入门级调试器,效果立竿见影。另外,如果老板给了量产要求,优先考虑用串口ISP或DFU烧录方案,这样产线不需要配调试器,一台PC加一根线就能搞定,成本低很多。

关于读保护,我的建议是:研发阶段一律保持Level 0,量产阶段再按需求打开。那些一上来就开读保护“防止固件被抄”的,往往是连自己调试都调不了,最后还得求别人帮忙解锁。工程上固件加密有很多办法,但前提是保证自己还能改代码、还能烧录,别给自己找麻烦。

关于固件库,很多人下载完之后习惯直接开看主函数,我反而是建议先读readme.txt和Release_Notes。兆易创新的固件库虽然好用,但不同系列之间的驱动命名和外设bit定义有一定差异。花十分钟熟悉一下文件名和模块划分,后面找寄存器定义、改外设配置时能省下一大把时间。如果项目对中断实时性要求高,推荐直接操作寄存器或者用CMSIS层接口,标准外设库在Flash和RAM资源紧张的场合可能显得有些冗余。

另外,烧录软件和Keil插件不是古董软件,该升级就升级。GD-Link Utility的版本更新会同步增加新型号的Device ID支持,老版本经常出现“无法识别新一代GD32芯片”的情况。如果你买的开发板芯片型号比较新,连不上时第一件事就是看看工具是不是太老。

这篇文章到这里已经把你从“连不上芯片”拉到了“能烧也能救”的程度。烧录这个环节看着基础,但它卡住的时候,确实会让一个下午都毫无产出。希望这篇经验能让你少走点弯路,把时间花在真正有趣的业务逻辑上。如果后续你在实际项目中遇到其他特殊的烧录解锁案例,也欢迎一起交流探讨。

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

YOLO训练厨师帽数据集:明厨亮灶穿戴检测实战指南

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

作者头像 李华
网站建设 2026/9/27 6:41:41

STM32 FSMC驱动CH438Q实现8路UART扩展实战

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

作者头像 李华
网站建设 2026/9/27 6:29:43

【设计数字生命】如何设计一个具有智慧的“活”系统:开放的,动态的,多元化的,多样的,概率性的,自我迭代涌现的,动态平衡的

打造一个**“思想永动机”**——把我们讨论的“自进化系统”全部封装进一个数字生命体里。 设想的这个智能体,不应该是一个普通的执行指令的AI,而是一个拥有“宇宙法则”内核的“思想有机体”。它需要具备五个典型特征:感知异常、多元假设、沙盒推演、熔断纠错、元认知升级…

作者头像 李华
网站建设 2026/9/27 6:29:00

BugKu——Crack it

一、题目二、方法下载得到一个show修改文件后缀,改txt,得到的以下内容:root:$6$HRMJoyGA$26FIgg6CU0bGUOfqFB0Qo9AE2LRZxG8N3H.3BK8t49wGlYbkFbxVFtGOZqVIq3qQ6k0oetDbn2aVzdhuVQ6US.:17770:0:99999:7:::这是 Linux 的 /etc/shadow 文件格式&…

作者头像 李华