全志T507sdk结构梳理及开发步骤总结

结构梳理

1、基本结构

sdk涵盖了从 Boot0U-BootKernelRootFS → 打包工具 → 测试例程 的所有环节。开发者只需在这个 SDK 里改代码/配置,就能编译出一个完整的可烧录镜像(.img / .fex),烧到板子上跑起来。

​ 结构图如下:
#mermaid-svg-RnXZANhCuqTZk0kN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RnXZANhCuqTZk0kN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RnXZANhCuqTZk0kN .error-icon{fill:#552222;}#mermaid-svg-RnXZANhCuqTZk0kN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RnXZANhCuqTZk0kN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RnXZANhCuqTZk0kN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RnXZANhCuqTZk0kN .marker.cross{stroke:#333333;}#mermaid-svg-RnXZANhCuqTZk0kN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RnXZANhCuqTZk0kN p{margin:0;}#mermaid-svg-RnXZANhCuqTZk0kN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-RnXZANhCuqTZk0kN .cluster-label text{fill:#333;}#mermaid-svg-RnXZANhCuqTZk0kN .cluster-label span{color:#333;}#mermaid-svg-RnXZANhCuqTZk0kN .cluster-label span p{background-color:transparent;}#mermaid-svg-RnXZANhCuqTZk0kN .label text,#mermaid-svg-RnXZANhCuqTZk0kN span{fill:#333;color:#333;}#mermaid-svg-RnXZANhCuqTZk0kN .node rect,#mermaid-svg-RnXZANhCuqTZk0kN .node circle,#mermaid-svg-RnXZANhCuqTZk0kN .node ellipse,#mermaid-svg-RnXZANhCuqTZk0kN .node polygon,#mermaid-svg-RnXZANhCuqTZk0kN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RnXZANhCuqTZk0kN .rough-node .label text,#mermaid-svg-RnXZANhCuqTZk0kN .node .label text,#mermaid-svg-RnXZANhCuqTZk0kN .image-shape .label,#mermaid-svg-RnXZANhCuqTZk0kN .icon-shape .label{text-anchor:middle;}#mermaid-svg-RnXZANhCuqTZk0kN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RnXZANhCuqTZk0kN .rough-node .label,#mermaid-svg-RnXZANhCuqTZk0kN .node .label,#mermaid-svg-RnXZANhCuqTZk0kN .image-shape .label,#mermaid-svg-RnXZANhCuqTZk0kN .icon-shape .label{text-align:center;}#mermaid-svg-RnXZANhCuqTZk0kN .node.clickable{cursor:pointer;}#mermaid-svg-RnXZANhCuqTZk0kN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RnXZANhCuqTZk0kN .arrowheadPath{fill:#333333;}#mermaid-svg-RnXZANhCuqTZk0kN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RnXZANhCuqTZk0kN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RnXZANhCuqTZk0kN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RnXZANhCuqTZk0kN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RnXZANhCuqTZk0kN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RnXZANhCuqTZk0kN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RnXZANhCuqTZk0kN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RnXZANhCuqTZk0kN .cluster text{fill:#333;}#mermaid-svg-RnXZANhCuqTZk0kN .cluster span{color:#333;}#mermaid-svg-RnXZANhCuqTZk0kN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RnXZANhCuqTZk0kN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RnXZANhCuqTZk0kN rect.text{fill:none;stroke-width:0;}#mermaid-svg-RnXZANhCuqTZk0kN .icon-shape,#mermaid-svg-RnXZANhCuqTZk0kN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RnXZANhCuqTZk0kN .icon-shape p,#mermaid-svg-RnXZANhCuqTZk0kN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RnXZANhCuqTZk0kN .icon-shape .label rect,#mermaid-svg-RnXZANhCuqTZk0kN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RnXZANhCuqTZk0kN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RnXZANhCuqTZk0kN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RnXZANhCuqTZk0kN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} LinuxSDK 根目录
brandy

Bootloader 源码
kernel

Linux 内核源码 + DTS 源
device

板级配置中心

sys_config.fex / 分区表 / env / 显示选项
buildroot

根文件系统构建
platform

厂商中间件/应用
tools

打包工具 pack/fex2bin
build

build.sh 脚本
test

测试程序
Boot0/SPL, U-Boot 镜像
内核镜像
DTB 由 DTS 编译
sys_config.fex → sys_config.bin
rootfs.ext4
多媒体库/GUI
pack 工具打包
编译/打包流程
外设验证程序
boot_package
系统镜像打包
最终可烧录镜像 .img/.fex

总结:

  • brandy 保证能启动
  • kernel 驱动硬件
  • device 定义板级参数
  • buildroot 提供根文件系统
  • platform/test 增强与验证
  • tools/build/build.sh 把它们串起来
  • out 里就是最终交付物

2、结构详细说明

2.1、 brandy

brandy/brandy-2.0

  • 包含 Boot0/SPLU-Boot 源码 (Bootloader 源码)
  • 职责:
    • Boot0/SPL 解析 sys_config.bin,完成 DDR 初始化、电源配置。
    • U-Boot Proper:运行在 DDR 上,负责加载 Kernel、传递 DTB参数。
  • 产出 boot0.binu-boot.bin,最终进入 boot_package.fex
  • 对应手册:boot_package 就是从这里编译的产物之一。
2.2、kernel

kernel/linux-4.9

  • Linux内核源码,包含 DTS
  • 职责:
    • 提供 SoC 驱动(显示、网络、USB、音频、摄像头...)
    • 解析 设备树 DTS/DTB,根据硬件资源配置驱动
  • 产出 Image/zImage + DTB
  • 这里改 DTSKernel 阶段生效的配置;改驱动源码则是功能bugfix
2.3、buildroot

buildroot/buildroot-201902

  • 用户空间根文件系统构建工具
  • 职责:
    • 生成 rootfsBusyBox, glibc/musl, 基本命令)
    • 可以裁剪/增加包,做最小系统或应用环境
  • 输出:ext4 镜像( rootfs.ext4),最终合并进系统镜像。
2.4、 device

device/config, product

  • 板级配置中心,含 sys_config.fex、分区表、env、显示配置等
  • 内容:
    • DTS 源码(设备树)
    • sys_config.fexsys_config.binBoot 阶段使用)
    • 分区表、logo、启动参数等
  • sys_config.fexfex2bin 转为 sys_config.bin,随 boot_package 使用
  • 职责:
    • 这里是开发者日常改动最多的地方:
      • DDR电源参数在 sys_config.fex
      • 驱动绑定/屏幕/触摸/网口等在 DTS
2.5、 platform

platform/apps, base, core, framework, external, tools

  • 厂商自定义中间件/应用,产出对应运行时库,合入 rootfs 或单独分发。
  • 例如多媒体框架(CedarX, CedarV)、小型 GUI (MiniGUI/Qt)、AI 库、视频编解码 SDK
  • 职责:扩展内核以外的软件支持,和硬件强相关。
2.6、tools
  • 打包与配置工具
  • 常见工具:
    • fex2bin / bin2fexsys_config 转换工具
    • pack → 把 U-BootKernelRootFSsys_config 打包成 .img
    • dragonsecboot / phoenix → 安全烧录工具
  • 职责:保证各模块编译后能被整合进最终镜像。
2.6、build
  • 编译脚本(Makefilemkkernel.shpack),是编译/打包的核心逻辑。
  • 包含 build.sh 调用的具体规则文件:
    • build.sh config → 选择平台/显示方案
    • build.sh → 编译 uboot/kernel/rootfs
    • build.sh pack → 打包成镜像
2.7、out

​ 编译输出目录,包含交叉编译工具链、打包产物 (pack_out)、最终镜像 (t507_linux_tlt507-evm_uart0.img)

2.8、 test
  • 板级测试程序(I²C, SPI, HDMI, LCD, USB, 网口等)。
  • 职责:方便 bring-up 时快速验证外设可用性。

3、板级适配开发步骤

Board Bring-up,像 T507 这种 全志的 SoC 平台,第一次从原理图到能跑 Linux系统,一般都走一条比较固定的流程。

硬件分析(原理图) → Boot 适配(sys_config.fex) → Kernel 适配(DTS) → Rootfs 工具链(Buildroot) → 打包镜像(pack) → 功能验证/调优
#mermaid-svg-kbXh4VZxUCVZFc8A{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kbXh4VZxUCVZFc8A .error-icon{fill:#552222;}#mermaid-svg-kbXh4VZxUCVZFc8A .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kbXh4VZxUCVZFc8A .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kbXh4VZxUCVZFc8A .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kbXh4VZxUCVZFc8A .marker.cross{stroke:#333333;}#mermaid-svg-kbXh4VZxUCVZFc8A svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kbXh4VZxUCVZFc8A p{margin:0;}#mermaid-svg-kbXh4VZxUCVZFc8A .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster-label text{fill:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster-label span{color:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster-label span p{background-color:transparent;}#mermaid-svg-kbXh4VZxUCVZFc8A .label text,#mermaid-svg-kbXh4VZxUCVZFc8A span{fill:#333;color:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A .node rect,#mermaid-svg-kbXh4VZxUCVZFc8A .node circle,#mermaid-svg-kbXh4VZxUCVZFc8A .node ellipse,#mermaid-svg-kbXh4VZxUCVZFc8A .node polygon,#mermaid-svg-kbXh4VZxUCVZFc8A .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kbXh4VZxUCVZFc8A .rough-node .label text,#mermaid-svg-kbXh4VZxUCVZFc8A .node .label text,#mermaid-svg-kbXh4VZxUCVZFc8A .image-shape .label,#mermaid-svg-kbXh4VZxUCVZFc8A .icon-shape .label{text-anchor:middle;}#mermaid-svg-kbXh4VZxUCVZFc8A .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kbXh4VZxUCVZFc8A .rough-node .label,#mermaid-svg-kbXh4VZxUCVZFc8A .node .label,#mermaid-svg-kbXh4VZxUCVZFc8A .image-shape .label,#mermaid-svg-kbXh4VZxUCVZFc8A .icon-shape .label{text-align:center;}#mermaid-svg-kbXh4VZxUCVZFc8A .node.clickable{cursor:pointer;}#mermaid-svg-kbXh4VZxUCVZFc8A .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kbXh4VZxUCVZFc8A .arrowheadPath{fill:#333333;}#mermaid-svg-kbXh4VZxUCVZFc8A .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kbXh4VZxUCVZFc8A .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kbXh4VZxUCVZFc8A .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kbXh4VZxUCVZFc8A .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kbXh4VZxUCVZFc8A .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kbXh4VZxUCVZFc8A .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster text{fill:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A .cluster span{color:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kbXh4VZxUCVZFc8A .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kbXh4VZxUCVZFc8A rect.text{fill:none;stroke-width:0;}#mermaid-svg-kbXh4VZxUCVZFc8A .icon-shape,#mermaid-svg-kbXh4VZxUCVZFc8A .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kbXh4VZxUCVZFc8A .icon-shape p,#mermaid-svg-kbXh4VZxUCVZFc8A .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kbXh4VZxUCVZFc8A .icon-shape .label rect,#mermaid-svg-kbXh4VZxUCVZFc8A .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kbXh4VZxUCVZFc8A .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kbXh4VZxUCVZFc8A .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kbXh4VZxUCVZFc8A :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-kbXh4VZxUCVZFc8A .greenNode>*{fill:#4CAF50!important;stroke:#333!important;color:white!important;}#mermaid-svg-kbXh4VZxUCVZFc8A .greenNode span{fill:#4CAF50!important;stroke:#333!important;color:white!important;}#mermaid-svg-kbXh4VZxUCVZFc8A .greenNode tspan{fill:white!important;}#mermaid-svg-kbXh4VZxUCVZFc8A .redNode>*{fill:#f44336!important;stroke:#333!important;color:white!important;}#mermaid-svg-kbXh4VZxUCVZFc8A .redNode span{fill:#f44336!important;stroke:#333!important;color:white!important;}#mermaid-svg-kbXh4VZxUCVZFc8A .redNode tspan{fill:white!important;} 硬件分析

阅读原理图
Boot 阶段适配

sys_config.fex
配置 DDR 频率/电源
配置 UART 调试口
pack 生成 boot_package.fex
串口验证 SPL/U-Boot
Kernel 阶段适配

修改 DTS
eMMC 总线/速率/电压
UART 重映射
LVDS/HDMI 显示 + 背光 PWM
SPI / I²C 外设
USB OTG/Device/Gadget
以太网 PHY RMII/RGMII
编译内核 + DTB
烧录镜像启动
功能验证
Memtester 验证 DDR 稳定性
eMMC 大文件读写
UART/I²C/SPI/USB 功能测试
显示输出验证
Rootfs 构建

Buildroot
添加调试工具: ssh, i2c-tools, usbutils
配置安全机制: root 密码, 禁止空口令
系统打包

build.sh pack
生成量产镜像 .img

3.1、硬件准备阶段
  1. 阅读原理图
    • 确认 DDR 供电轨、电阻、电容、ZQ 电阻 是否符合芯片推荐手册;
    • 看清 eMMC / SPI / I²C / UART / USB / HDMI / LVDS 的连线,标记每个接口引脚的复用关系;
    • 找到 PMIC(电源管理芯片),核对各路 DCDC/LDO 输出电压与目标负载。
  2. 确认 Boot 介质
    • eMMC / SD / SPI Flash?确认芯片和走线,知道系统从哪里启动。
3.2、Boot 阶段适配(sys_config.fex + Bootloader
  1. 配置 sys_config.fex
    • [dram_para]DDR 类型/频率/ODT 参数;
    • [power_sply]PMIC 输出电压,对应 DDR/IO/eMMC/LVDS/HDMI
    • [uart_para] → 指定调试串口引脚(保证能看到串口 log)。
  2. 编译/打包 Boot0+U-Boot
    • ./build.sh bootloader → 产出 SPL + U-Boot
    • ./build.sh pack → 合并 sys_config.bin,生成 boot_package.fex
  3. 验证串口启动
    • 上电,串口能打印出 SPLU-Boot → 进入命令行;
    • 若卡死,第一怀疑点:DDR 参数错误;第二怀疑点:供电电压配置错误。
3.3、Kernel 阶段适配(设备树 DTS
  1. 根据原理图修改 DTS
    • eMMC:总线宽度/供电电压/速率模式;
    • UART:重映射 console / 用户串口;
    • LVDS/HDMI:使能 TCON、背光 PWM
    • SPI/I²C:确认接的外设(屏、触摸、EEPROM、传感器...);
    • USB:配置 OTG/Host/Device 模式,决定是否做 Gadget
    • Ethernet:确认 RGMII/RMIIPHY 地址。
  2. 编译内核 & DTS
    • ./build.sh kernel
    • DTSDTB 合并到镜像。
  3. 验证启动 log
    • dmesg 里看 mmc/i2c/spi/pwm 等驱动是否 probe 成功;
    • 如果报错 "timeout""no device",回到原理图,核对引脚复用/电源 rail
3.4、Rootfs & 应用层
  1. 构建根文件系统(Buildroot
    • ./build.sh buildroot,产出 rootfs.ext4
    • 加必要工具:busybox, dropbear/openssh, memtester, i2c-tools, spi-tools, usbutils
  2. 调试工具
    • 串口登录;
    • SSH(有口令);
    • USB gadget(虚拟串口、网络);
    • SPI/I²C 测试程序。
3.5、系统打包 & 烧录
  1. 打包最终镜像
    • ./build.sh pack → 生成 xxx.img
    • 镜像包含:boot_package(SPL+U-Boot+sys_config)、内核、DTBrootfs
  2. 烧录 & 启动
    • 烧录到 eMMC / SD 卡;
    • 上电启动,串口观察全流程。
3.6、功能验证 & 调优
  1. 内存稳定性:memtester 跑几个小时。
  2. 存储稳定性:大文件反复写读。
  3. 外设验证:UART 回环、I²C 探测、SPI 回环、USB 拔插、HDMI 显示、LVDS 点屏。
  4. 电源调优:测量 DDR VDD/VDDQ/VCCQ,确认电压不漂移。
  5. 性能调优:调频率(如 DDR 从 933 → 1200),观察是否稳定。
3.7、最终集成
  • 确认所有外设驱动在 Kernel 中正常加载;
  • Rootfs 里添加登录/安全机制(禁止 root 空口令、配置 SSH 密码);
  • 生成可量产烧录的 .img,并写下 BSP 修改清单(sys_config 改了什么,DTS 改了什么)。
相关推荐
utf8mb4安全女神1 小时前
shell脚本grep指令sed指令awk指令
linux·运维·服务器
Shadow(⊙o⊙)1 小时前
信号2.0,深入信号三张表block pending handlers,core文件的使用,信号执行逻辑:CPU虚拟内存物理内存,时钟源,软中断。
linux·运维·服务器·开发语言·c++
嵌入式修炼师1 小时前
搭建linux nfs服务远程调试环境
linux
zhangrelay2 小时前
ROS2 Lyrical 入门+进阶+精通+……
linux·笔记·学习·机器人·课程设计
Shadow(⊙o⊙)2 小时前
C++进阶知识3.0
linux·服务器·开发语言·c++
黑白园2 小时前
【环境搭建】虚拟机及Ubuntu安装所需的电脑硬件资源
linux·ubuntu
阿文的代码库2 小时前
算法专题:独特的电子邮件地址
linux·运维·算法
代码AC不AC2 小时前
【Linux】线程同步
linux·线程·线程同步
糖果店的幽灵3 小时前
软件测试接口测试从入门到精通:curl命令行工具
linux·软件测试·接口测试·命令行·curl