ESP-IDF项目结构规范:分离SDK与应用代码
1. 工程结构规范化为什么必须将应用代码与 ESP-IDF SDK 分离在嵌入式开发实践中一个极易被忽视却直接影响项目可维护性、可升级性和团队协作效率的关键环节是工程目录结构的设计。尤其在使用 ESP-IDF 这类大型 SDK 的场景下开发者常因图一时之便直接在$IDF_PATH/examples或$IDF_PATH/components目录下修改示例代码或添加自定义组件——这种做法在单人快速验证阶段看似高效但一旦进入真实产品迭代周期其弊端会迅速暴露SDK 升级时所有混杂在 SDK 树中的业务逻辑将面临手动迁移、冲突解决、版本回溯等高风险操作多人协同时Git 仓库中 SDK 子模块与应用代码的混合提交将导致历史难以追溯、分支管理混乱CI/CD 流水线构建时无法对 SDK 和应用层进行独立缓存与并行编译显著拖慢交付节奏。ESP-IDF 官方文档明确将项目Project定义为一个独立于 SDK 的顶层工作空间其核心设计哲学是“SDK 提供能力Project 实现业务”。该结构天然支持 SDK 的版本化管理通过idf.py set-target和idf.py update确保不同项目可自由选用兼容的 SDK 版本而互不干扰。一个符合 ESP-IDF 最佳实践的项目其根目录下应仅包含以下关键元素-CMakeLists.txt项目的顶层构建入口负责初始化构建环境、声明 SDK 路径、注册子目录-main/主应用程序组件目录存放核心业务逻辑如app_main.c、硬件抽象层HAL封装及任务调度逻辑-components/可选存放项目私有组件例如自定义传感器驱动、通信协议栈适配层、UI 组件等-sdkconfig项目专属配置文件记录所有menuconfig中的选项-build/构建产物目录通常被.gitignore排除。这种结构强制实现了关注点分离SDK 负责芯片底层驱动、FreeRTOS 封装、TCP/IP 协议栈、Flash 操作等基础设施Project 负责业务逻辑组织、外设资源分配、任务划分与事件协调。当 SDK 升级至 v4.4 或 v5.0 时只需更新$IDF_PATH环境变量指向新路径并在项目根目录执行idf.py fullclean idf.py build即可完成无缝迁移——前提是你的应用代码从未侵入 SDK 的任何目录。2. 创建标准 ESP-IDF 项目从零构建01_blink工程创建一个符合规范的 ESP-IDF 项目本质是建立一个与 SDK 解耦的、自包含的构建上下文。该过程并非简单复制粘贴而是通过 ESP-IDF 提供的标准化工具链完成初始化确保 CMake 构建系统能正确定位 SDK 路径、识别组件依赖关系并生成正确的链接脚本与启动代码。2.1 初始化项目骨架在终端中切换至你规划的项目工作区例如~/esp_projects执行以下命令cd ~/esp_projects $IDF_PATH/tools/idf.py create-project 01_blink该命令由 ESP-IDF 自带的idf.py脚本驱动其内部逻辑会- 在当前目录下创建名为01_blink的子目录- 在该目录中生成标准的CMakeLists.txt文件其中包含set(EXTRA_COMPONENT_DIRS ${CMAKE_SOURCE_DIR}/components)等关键指令为后续添加私有组件预留接口- 创建main/目录并在其中放置一个最小化的CMakeLists.txt用于声明main组件和app_main.c包含空的app_main()函数- 自动生成.gitignore文件排除build/、sdkconfig.*等非源码文件。此时的目录结构应为01_blink/ ├── CMakeLists.txt # 项目顶层 CMake 文件 ├── main/ │ ├── CMakeLists.txt # main 组件的 CMake 文件 │ └── app_main.c # 应用入口点 ├── components/ # 空目录供后续扩展 └── sdkconfig # 尚未生成首次配置后出现此结构即为 ESP-IDF 官方认可的“单组件项目”模板。它不依赖于$IDF_PATH/examples中的任何示例是一个完全干净、可版本控制的起点。2.2 配置项目目标芯片与 SDK 路径ESP-IDF 支持多目标芯片ESP32、ESP32-S2、ESP32-C3、ESP32-H2 等每个目标对应不同的寄存器映射、时钟树配置和外设驱动。项目初始化后必须显式指定目标芯片以确保构建系统加载正确的工具链、链接脚本和头文件。在01_blink/目录下执行cd 01_blink idf.py set-target esp32c3该命令会- 在项目根目录生成sdkconfig文件若不存在- 将CONFIG_IDF_TARGETesp32c3写入sdkconfig- 更新build/目录下的构建缓存使其后续调用xtensa-esp32c3-elf-gcc编译器而非xtensa-esp32-elf-gcc。此时sdkconfig文件中已预置了 ESP32-C3 的默认配置包括 Flash 启动模式、分区表类型、FreeRTOS 参数等。但有一个关键参数需手动确认——Flash 大小。2.3 精确配置 Flash 容量CNF4 模块的 4MB 适配ESP32-C3 常见的模组型号如安信可 ESP32-C3-DevKitM-1其 Flash 容量存在 2MB 与 4MB 两种物理规格。CNF4 是安信可对该系列 4MB Flash 模组的型号标识。若项目配置的 Flash 大小与实际硬件不符将导致严重后果- 配置为 2MB但烧录超过 2MB 的固件烧录过程可能成功但设备启动时因分区表越界或固件校验失败而无法运行- 配置为 4MB但硬件仅有 2MB烧录工具esptool.py会在写入超出物理容量的地址时抛出Invalid head of flash data错误或导致 Flash 数据损坏。因此在idf.py menuconfig中必须导航至Serial flasher config→Flash size选项将其设置为4MB。该选项最终影响partition_table/partition-table.bin的生成一个 4MB Flash 的默认分区表会将factoryapp 分区起始地址设为0x10000总大小设为0x300000约 3MB为 OTA、NVS、PHY 等保留分区留出足够空间。此外还需检查Partition Table子菜单中的Partition Table选项确保其为Default partition table。该默认表已为 ESP32-C3 的 4MB Flash 进行过优化无需手动编辑partitions_singleapp.csv文件除非有特殊需求如增加多个 OTA 分区。2.4 验证环境变量IDF_PATH的正确性IDF_PATH环境变量是整个 ESP-IDF 构建系统的基石它告诉idf.py和 CMake“SDK 的根目录在哪里”。若该变量指向错误路径如旧版 SDK 或一个不完整的克隆则idf.py set-target和idf.py build将无法找到components/、tools/等必需目录报错Failed to find IDF_PATH或Could not find toolchain。在 VS Code 中若使用 ESP-IDF 扩展其环境变量通常由扩展自动注入。但为确保万无一失应在终端中手动验证echo $IDF_PATH # 正确输出应类似/home/username/esp/esp-idf ls -l $IDF_PATH/components/freertos # 应能看到 freertos 组件的完整目录结构若IDF_PATH未设置或指向错误需在 shell 配置文件如~/.bashrc或~/.zshrc中添加export IDF_PATH/path/to/your/esp-idf export PATH$IDF_PATH/tools:$PATH然后执行source ~/.bashrc生效。切勿在项目CMakeLists.txt中硬编码set(IDF_PATH /wrong/path)这会破坏项目的可移植性。3. 迁移 Blink 应用代码组件化思维与main组件职责将上一讲中在examples/get-started/blink下直接修改的 LED 闪烁代码迁移到新建的01_blink项目中不是简单的文件拷贝而是一次对 ESP-IDF 组件模型Component Model的实践。理解main组件的特殊地位及其与 SDK 其他组件的交互方式是写出健壮应用的前提。3.1main组件的本质应用逻辑的唯一入口在 ESP-IDF 中main/目录被赋予了特殊语义它是项目启动后FreeRTOS 内核首先执行的用户代码所在。app_main()函数是整个应用的起点其执行时机在freertos组件完成内核初始化、driver组件完成基础外设注册之后但在tcpip_adapter、nvs_flash等高级组件初始化之前。因此main组件的职责非常清晰-硬件初始化配置 GPIO、UART、I2C 等外设引脚这是最底层的硬件操作-FreeRTOS 资源创建创建任务xTaskCreate、队列xQueueCreate、信号量xSemaphoreCreateBinary等为并发逻辑提供基础-应用逻辑启动启动主任务循环协调各子系统工作。它不应承担以下职责- 封装复杂的业务算法应提取为独立components/algorithm- 实现网络协议解析应交由components/http_server或components/mqtt_client- 管理持久化存储细节nvs_flash_init应在app_main()中调用但读写键值对的逻辑应封装在components/storage中。3.2 迁移blink代码从示例到生产就绪假设原examples/get-started/blink中的app_main.c包含如下核心逻辑#include freertos/FreeRTOS.h #include freertos/task.h #include driver/gpio.h #define BLINK_GPIO GPIO_NUM_2 void app_main(void) { gpio_reset_pin(BLINK_GPIO); gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); while(1) { gpio_set_level(BLINK_GPIO, 0); vTaskDelay(1000 / portTICK_PERIOD_MS); gpio_set_level(BLINK_GPIO, 1); vTaskDelay(1000 / portTICK_PERIOD_MS); } }将其迁移到01_blink/main/app_main.c时需进行两项关键增强以符合生产环境要求第一添加错误处理与日志输出裸写的gpio_reset_pin和gpio_set_direction若失败如引脚被复用为其他功能将静默失败。应利用 ESP-IDF 的日志系统进行诊断#include esp_log.h static const char *TAG blink; void app_main(void) { esp_err_t ret gpio_reset_pin(BLINK_GPIO); if (ret ! ESP_OK) { ESP_LOGE(TAG, GPIO reset failed: %s, esp_err_to_name(ret)); return; } ret gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); if (ret ! ESP_OK) { ESP_LOGE(TAG, GPIO direction set failed: %s, esp_err_to_name(ret)); return; } ESP_LOGI(TAG, Blink started on GPIO %d, BLINK_GPIO); // ... 后续循环逻辑 }第二将阻塞式循环重构为 FreeRTOS 任务while(1)循环会独占app_main所在的任务即IDF_TASK导致无法并行执行其他逻辑如 UART 日志输出、Wi-Fi 连接。正确做法是创建一个独立任务static void blink_task(void *pvParameter) { while(1) { gpio_set_level(BLINK_GPIO, 0); vTaskDelay(1000 / portTICK_PERIOD_MS); gpio_set_level(BLINK_GPIO, 1); vTaskDelay(1000 / portTICK_PERIOD_MS); } } void app_main(void) { // ... GPIO 初始化代码含错误检查 xTaskCreate(blink_task, blink_task, configMINIMAL_STACK_SIZE, NULL, 5, NULL); }此处configMINIMAL_STACK_SIZE通常为 2048 字节对简单 GPIO 操作已足够优先级5高于默认的IDF_TASK优先级1确保 LED 闪烁不受其他低优先级任务干扰。xTaskCreate返回pdPASS或errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY生产代码中应检查返回值。3.3main组件的 CMakeLists.txt声明依赖关系main/CMakeLists.txt不仅是一个构建指令文件更是组件间依赖关系的声明书。当app_main.c使用了freertos和driver组件的 API 时必须显式告知构建系统# The following five lines of boilerplate have to be in your projects # CMakeLists.txt file in order to build the component. cmake_minimum_required(VERSION 3.16.0) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(main) # Declare that this component depends on freertos and driver set(COMPONENT_REQUIRES freertos driver)COMPONENT_REQUIRES指令至关重要。它告诉 CMake在编译main组件前必须先编译freertos和driver组件并将它们的头文件路径$IDF_PATH/components/freertos/include、$IDF_PATH/components/driver/include加入main的-I编译选项。若遗漏此行编译器将报错fatal error: freertos/FreeRTOS.h: No such file or directory。4. 构建、烧录与调试全流程验证与常见陷阱完成代码迁移与配置后整个流程进入验证阶段。此阶段不仅是功能测试更是对工程结构、配置参数、构建环境的一次综合体检。一个成功的idf.py build idf.py -p /dev/ttyUSB0 flash流程背后涉及多个子系统的精密协作。4.1 构建过程解析从源码到二进制镜像执行idf.py build时CMake 构建系统会按以下顺序工作1.配置阶段Configure读取sdkconfig生成build/config/sdkconfig.h将配置项转为 C 宏并扫描main/和components/目录下的所有CMakeLists.txt2.生成阶段Generate根据依赖关系生成build/compile_commands.json和build/Makefile3.编译阶段Build调用xtensa-esp32c3-elf-gcc编译所有.c文件生成.o目标文件4.链接阶段Link调用xtensa-esp32c3-elf-gcc -T linker.lf将所有.o文件、SDK 的静态库libfreertos.a,libdriver.a按linker.lf链接脚本合并生成build/01_blink.elf可执行文件5.镜像生成Image Generation调用esptool.py elf2image将.elf转换为build/01_blink.bin应用固件和build/partition_table/partition-table.bin分区表。若构建耗时异常长如超过 5 分钟常见原因有-IDF_PATH指向一个未执行过git submodule update --init的 SDK 仓库导致components/下大量子模块缺失CMake 在首次构建时需逐个克隆-build/目录残留了旧 SDK 版本的中间文件执行idf.py fullclean可彻底清除- 启用了CONFIG_COMPILER_OPTIMIZATION_SIZE-Os以外的优化级别如 -O3导致编译器优化时间激增。4.2 烧录前的端口与权限确认idf.py -p /dev/ttyUSB0 flash命令依赖esptool.py与串口芯片如 CP2102、CH340通信。在 Linux/macOS 上常见失败原因并非代码问题而是权限与设备识别问题权限不足普通用户默认无权访问/dev/ttyUSB*。解决方案是将用户加入dialout组bash sudo usermod -a -G dialout $USER # 注销并重新登录生效设备未识别执行ls /dev/tty*确认设备名。某些 USB 转串口芯片在 macOS 上显示为/dev/cu.usbserial-*需用-p /dev/cu.usbserial-*指定端口被占用其他终端如screen /dev/ttyUSB0 115200或 IDE 的串口监视器正在使用该端口需先退出。烧录过程中esptool.py会输出详细的进度条例如Chip is ESP32-C3 Features: WiFi Crystal is 40MHz MAC: 7c:df:a1:xx:xx:xx Uploading stub... Running stub... Stub running... Changing baud rate to 921600 Changed. Configuring flash size... Auto-detected Flash size: 4MB ... Writing at 0x00010000... (100 %)其中Auto-detected Flash size: 4MB行是关键验证点——它表明sdkconfig中设置的 Flash 大小与 esptool.py 读取到的硬件信息一致。若此处显示2MB则说明硬件与配置不匹配必须重新检查 CNF4 模组型号并修正sdkconfig。4.3 复位与日志观察确认固件正确运行烧录完成后设备不会自动复位。需手动按下开发板上的ENReset按键或执行idf.py -p /dev/ttyUSB0 monitor启动串口监视器再按CtrlT CtrlR发送复位指令。在idf.py monitor中应看到类似输出I (0) cpu_start: Starting scheduler on PRO CPU. I (0) cpu_start: Starting scheduler on APP CPU. I (28) blink: Blink started on GPIO 2I前缀表示ESP_LOGI级别日志cpu_start表明双核 FreeRTOS 已启动blink日志证明app_main()成功执行。此时开发板上的 LED 应开始以 1 秒为周期闪烁。若无任何日志输出可能原因有-UART 引脚配置错误ESP32-C3 默认 UART0 TX 为 GPIO20RX 为 GPIO21。若开发板将 UART0 引脚复用为其他功能如 LED 控制需在menuconfig中Component config→Common ESP-related→UART peripheral下修改UART0 pins-日志等级过低menuconfig中Component config→Log output→Default log verbosity设置为Error将过滤掉Info级日志。应设为Info或Debug-Flash 启动模式异常menuconfig中Serial flasher config→Bootloader log verbosity设为Info可查看 bootloader 是否成功加载应用。5. 工程结构演进从01_blink到可扩展物联网项目01_blink项目的价值不仅在于实现 LED 闪烁更在于它确立了一个可无限扩展的工程骨架。当项目从单功能演示迈向复杂物联网产品时该结构将展现出强大的适应性。5.1 添加私有组件解耦硬件与业务逻辑假设需要接入一个 DHT22 温湿度传感器最佳实践是创建一个独立的components/dht22目录01_blink/ ├── components/ │ └── dht22/ │ ├── CMakeLists.txt │ ├── dht22.c │ └── dht22.hcomponents/dht22/CMakeLists.txt声明其依赖driver用于 GPIO 操作和freertosset(COMPONENT_SRCS dht22.c) set(COMPONENT_ADD_INCLUDEDIRS .) set(COMPONENT_REQUIRES driver freertos) register_component()main/app_main.c中只需#include dht22.h并调用dht22_read_data()无需关心其内部是用gpio_set_level还是rmt_driver_install实现的时序。这种组件化设计使得传感器驱动可被02_sensor_hub、03_weather_station等多个项目复用且dht22组件自身的单元测试也可独立进行。5.2 多配置管理应对不同硬件变体同一份应用代码可能需适配 CNF44MB Flash和 CNF22MB Flash两种模组。此时不应修改sdkconfig而应使用 ESP-IDF 的多配置文件机制- 在项目根目录创建sdkconfig.defaults通用配置- 创建sdkconfig.cnf4CNF4 专用配置含CONFIG_ESPTOOLPY_FLASHSIZE_4MBy- 创建sdkconfig.cnf2CNF2 专用配置含CONFIG_ESPTOOLPY_FLASHSIZE_2MBy- 构建时指定idf.py -DSDKCONFIG_DEFAULTSsdkconfig.defaults;sdkconfig.cnf4 build。这种方式将硬件差异完全隔离在配置层应用代码保持纯净。5.3 CI/CD 集成自动化构建与测试一个成熟的01_blink结构天然适配 CI/CD。在 GitHub Actions 中可定义如下工作流name: Build ESP32-C3 Project on: [push, pull_request] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Setup ESP-IDF uses: espressif/esp-idf-ci-actionv1 with: idf_version: release/v4.3 target: esp32c3 - name: Build Project run: idf.py build - name: Run Unit Tests (if any) run: idf.py -T unit-test test该工作流每次推送代码都会在干净的 Ubuntu 环境中拉取 v4.3 SDK、构建项目并运行测试确保工程结构的稳定性与可重复性。我曾在一款工业网关项目中将01_blink的结构作为基线逐步叠加了 LoRaWAN 协议栈、Modbus RTU 主站、Web 配置界面三个核心组件。当客户临时要求将 Flash 从 4MB 升级到 8MB 以容纳更大 OTA 分区时仅需在sdkconfig中修改一行并更新分区表 CSV 文件整个项目在 15 分钟内完成适配并回归测试通过。这种敏捷响应能力正是源于对工程结构规范性的坚守。

相关新闻

工业级RFID读写器CK-LR08-E00与汇川PLC的以太网TCP/IP通讯实战:从配置到数据交互

工业级RFID读写器CK-LR08-E00与汇川PLC的以太网TCP/IP通讯实战:从配置到数据交互

1. 项目背景与设备初识:当RFID遇上汇川PLC 大家好,我是老张,在工业自动化这行摸爬滚打了十几年,从早期的条码到现在的RFID,各种数据采集方案都折腾过。今天想和大家聊聊一个非常实用,但在实际落地时又容易让…

2026/5/17 8:03:50 阅读更多 →
电商企业如何用WMS系统优化仓储流程?从入库到出库的实战经验分享

电商企业如何用WMS系统优化仓储流程?从入库到出库的实战经验分享

电商仓储的“中枢神经”:用WMS系统重塑从入库到出库的实战效能 如果你经营着一家电商公司,每天被“爆单”的幸福和“发不出货”的焦虑反复拉扯,仓库里永远是一团乱麻——找货靠喊,盘点靠猜,错发漏发是家常便饭。那么&a…

2026/7/3 7:59:43 阅读更多 →
YOLO12模型压缩实战:如何减小模型体积保持高精度

YOLO12模型压缩实战:如何减小模型体积保持高精度

YOLO12模型压缩实战:如何减小模型体积保持高精度 1. 引言 目标检测模型在移动端和边缘设备上的部署一直面临着一个核心矛盾:高精度往往意味着大模型体积,而小模型又难以保证检测准确率。YOLO12作为最新的目标检测模型,虽然引入了…

2026/5/17 0:33:05 阅读更多 →

最新新闻

Perlite研究应用:学术笔记管理与分享系统的终极指南

Perlite研究应用:学术笔记管理与分享系统的终极指南

Perlite研究应用:学术笔记管理与分享系统的终极指南 【免费下载链接】Perlite A web-based markdown viewer optimized for Obsidian 项目地址: https://gitcode.com/GitHub_Trending/pe/Perlite Perlite是一个基于Web的Markdown查看器,专为Obsid…

2026/7/5 15:50:40 阅读更多 →
MetaCodable宏编程入门:快速掌握Swift Codable高级用法

MetaCodable宏编程入门:快速掌握Swift Codable高级用法

MetaCodable宏编程入门:快速掌握Swift Codable高级用法 【免费下载链接】MetaCodable Supercharge Swifts Codable implementations with macros meta-programming. 项目地址: https://gitcode.com/gh_mirrors/me/MetaCodable 想要提升Swift开发效率&#xf…

2026/7/5 15:48:39 阅读更多 →
【信息科学与工程学】【数据中心】【容灾备份】第三十一篇 云数据中心各类CPU计算型业务跨数据中心容灾设计方案

【信息科学与工程学】【数据中心】【容灾备份】第三十一篇 云数据中心各类CPU计算型业务跨数据中心容灾设计方案

一、云数据中心各类CPU计算型业务跨数据中心指标 1. Web应用服务 设计领域 设计子类 特征/函数 参数/指标 用途说明 数据中心内设计 数据中心间设计 网络设计​ 数据中心内网络 1. 负载均衡网络 2. 应用层网络 3. 数据库网络 4. 缓存网络 5. 管理网络 1. 带宽:>…

2026/7/5 15:44:38 阅读更多 →
K-Means 聚类的目标函数:簇内误差平方和

K-Means 聚类的目标函数:簇内误差平方和

1. 什么是 K-Means? K-Means 是一种无监督、迭代式的聚类算法: 给定数据集 {x₁, x₂, …, xₙ} 与预设簇数 K,算法把样本划分为 K 个不相交的簇 C₁, C₂, …, Cₖ,使得同一簇内样本尽可能相似,不同簇间样本尽可能远离…

2026/7/5 15:44:38 阅读更多 →
【信息科学与工程学】计算机科学与自动化——第三十八篇 质量工程 02 云数据中心质量工程

【信息科学与工程学】计算机科学与自动化——第三十八篇 质量工程 02 云数据中心质量工程

云数据中心质量工程体系(规划-评估-测试-验证-交付) 编码 阶段 层级 核心领域 子领域 质量属性/活动 关键交付物/指标 核心方法/工具 评估标准 挑战与风险 1 核心理念 战略层 质量哲学 可靠性即产品 将数据中心可靠性、性能、安全作为可销售、可承诺的服务产品…

2026/7/5 15:42:38 阅读更多 →
net 跨平台也是一句谎言

net 跨平台也是一句谎言

以前很热炒跨平台,主要是由于硅谷挑战微软霸主地位的热情,但是冷静下来后,跨平台往往不是那么一回事。假设你有个软件,所谓的跨平台,你只需要为第二个平台上重新编译一次就行了,这样很难么? c语…

2026/7/5 15:40: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 阅读更多 →

周新闻

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 阅读更多 →

月新闻