U-Boot移植必先读懂Kbuild构建系统

发布时间:2026/10/9 1:44:35

U-Boot移植必先读懂Kbuild构建系统 1. 为什么U-Boot移植第一步不是改板级代码而是读懂Kbuild很多人拿到一块新开发板第一反应是翻board/rockchip/rv1106/目录急着改board_init.c、调dram_init()结果编译报错一堆undefined reference或者烧录后串口没输出连U-Boot的logo都看不到。我当年在RK3399项目上也这么干过——花三天改完DDR初始化一烧进去就卡在Starting kernel ...之前最后发现根本不是硬件问题而是CONFIG_SYS_TEXT_BASE被错误地写进了.config里导致链接脚本加载地址和实际运行地址错位整个重定位段全乱了。这背后的根本原因是跳过了U-Boot构建系统最底层的逻辑Kbuild不是辅助工具它是U-Boot的骨架与神经系统。你改的每一行C代码、每一个宏定义、每一条链接脚本路径最终都要经过Kbuild的解析、裁剪、拼接、展开才能变成可执行的u-boot.bin。它不像普通Linux内核那样只处理驱动模块U-Boot的Kbuild要同时管理板级配置configs/rv1106_evb_defconfig架构适配arch/arm/mach-rockchip/下的汇编启动流程编译器特性-marcharmv8-acrccrypto是否启用NEON链接时符号重排__image_copy_start等section标记的生成时机而所有这些都由Kbuild通过三重机制协同控制Kconfig声明可选功能开关如CONFIG_CMD_NETy决定哪些源文件参与编译Makefile定义编译规则、依赖关系、变量传递链比如KBUILD_CFLAGS如何从顶层Makefile逐级下传到drivers/net/MakefileKbuild小写kbuildGNU Make的扩展语法用obj-y xxx.o这种简洁写法自动推导出目标文件列表并触发递归编译。提示make menuconfig打开的图形界面本质是scripts/kconfig/mconf读取Kconfig文件生成的交互式前端它修改的是.config而.config又通过include/generated/autoconf.h反向注入到所有C文件中——这个闭环一旦断裂#ifdef CONFIG_SPL_SPI_FLASH就会永远为假哪怕你在代码里写了100行SPI Flash驱动也没用。所以“U-Boot移植_Kbuild_入门”这个标题真正想说的是在动任何一行板级代码前你必须先让Kbuild能正确识别你的平台、加载正确的配置、生成无冲突的依赖树。否则后续所有调试都是在流沙上建塔——越努力离真相越远。我见过太多人把make rv1106_evb_defconfig当成一个黑盒命令以为执行完就万事大吉。实际上这条命令背后发生了至少7个关键动作清空include/generated/目录下的旧头文件解析configs/rv1106_evb_defconfig提取CONFIG_XXXy/m/n赋值读取Kconfig根文件./Kconfig按依赖关系校验配置合法性比如CONFIG_SPL启用时CONFIG_SPL_SPI_FLASH必须存在生成.config文件文本格式可直接编辑运行conf工具将.config转换为include/generated/autoconf.h宏定义头文件同步生成include/config/auto.conf供Makefile读取的键值对文件最终触发make -f scripts/Makefile.build obj.开始构建顶层目标如果你跳过这一步直接去改board/rockchip/rv1106/Makefile你会发现obj-y board.o永远不生效——因为Kbuild根本没把你这个目录纳入编译路径board/rockchip/rv1106/甚至不会出现在make -n的dry-run输出里。这不是代码问题是构建系统认知断层。2. Kbuild的三层结构从Kconfig声明到Makefile落地的完整链路U-Boot的Kbuild体系不是线性流程而是一个立体嵌套结构。它像一棵倒置的树根在顶层Makefile枝干是各子目录的Makefile叶子是每个源文件对应的Kconfig条目。理解这三层如何咬合是解决“make: *** No targets specified and no makefile found”这类经典报错的关键。2.1 Kconfig功能开关的宪法性文件Kconfig不是简单的配置项列表它是带语义约束的DSL领域特定语言。以RV1106平台为例arch/arm/Kconfig中定义了ARM架构通用选项config ARCH_ROCKCHIP bool Rockchip SoC support select CPU_V7A select SYS_SUPPORTS_AARCH32 help This enables support for Rockchip SoCs.注意select关键字——它表示强制依赖。当你在configs/rv1106_evb_defconfig中启用CONFIG_ARCH_ROCKCHIPy时CONFIG_CPU_V7A和CONFIG_SYS_SUPPORTS_AARCH32会自动被设为y无需手动配置。如果某个子配置违反了select规则比如禁用了CONFIG_CPU_V7Amake menuconfig保存时会直接报错“ARCH_ROCKCHIPselectsCPU_V7A, butCPU_V7Ais not set”。更关键的是depends on机制。看drivers/mmc/Kconfig里的片段config DM_MMC bool Driver Model support for MMC depends on DM (ARCH_ROCKCHIP || ARCH_SUNXI) help Enable Driver Model for MMC controllers.这里depends on DM (ARCH_ROCKCHIP || ARCH_SUNXI)意味着只有当CONFIG_DMy且平台是Rockchip或Allwinner时DM_MMC选项才会出现在菜单里。如果你在RV1106配置中没启用CONFIG_DM那么CONFIG_DM_MMC根本不会显示即使你手动在.config里写CONFIG_DM_MMCy下次make menuconfig保存也会被自动清除——因为Kconfig解析器在生成.config时会强制校验依赖关系。注意Kconfig的default值只在首次生成.config时生效。比如config SYS_MALLOC_F_LEN默认是0x400但如果你在defconfig里明确写了CONFIG_SYS_MALLOC_F_LEN0x800那它就覆盖了default。很多移植者误以为改Kconfig就能改默认值其实必须同步更新defconfig文件否则make defconfig不会体现你的修改。2.2 Makefile编译规则的调度中心Kconfig定义“能不能编”Makefile决定“怎么编”。U-Boot的Makefile体系采用经典的递归下降模式顶层Makefile根目录负责初始化环境变量srctree、objtree、包含scripts/Makefile.*、调用$(MAKE) -f scripts/Makefile.build obj$(obj)子目录Makefile如drivers/mmc/Makefile用obj-$(CONFIG_DM_MMC) mmc-uclass.o声明目标文件Kbuild会根据CONFIG_DM_MMC的值自动展开为obj-y mmc-uclass.o或忽略该行scripts/Makefile.build真正的编译引擎解析obj-y列表调用$(CC)编译每个.c文件生成.o再调用$(LD)链接这里有个极易被忽视的细节obj-$(CONFIG_XXX)中的CONFIG_XXX必须与Kconfig中定义的符号名完全一致包括大小写和下划线。比如Kconfig里是config SPL_SPI_FLASH bool SPI flash support in SPL那么Makefile里必须写obj-$(CONFIG_SPL_SPI_FLASH) spi_flash.o写成obj-$(CONFIG_SPL_SPI_FLASH_SUPPORT)或obj-$(CONFIG_SPL_SPIFLASH)都会失效——Kbuild不会做任何模糊匹配它只是字符串替换。另一个陷阱是obj-m的误用。U-Boot不支持动态模块.ko文件所有obj-m会被静默忽略。曾有同事在drivers/video/Makefile里写了obj-m rockchip.o结果编译时rockchip.o根本没生成u-boot.map里也找不到相关符号。查了半天才发现U-Boot的Kbuild根本不处理obj-m只认obj-y编入和obj-$(CONFIG_XXX)条件编入。2.3 Kbuild小写Make的语法糖与自动化引擎Kbuild本身不是独立程序而是GNU Make的一套约定俗成的写法集合。它的核心魔法在于操作符和$(wildcard)函数的组合使用。看drivers/serial/Makefile的典型写法obj-$(CONFIG_SERIAL) serial.o obj-$(CONFIG_SYS_NS16550) ns16550.o obj-$(CONFIG_SYS_NS16550_COM1) ns16550_serial.o # 自动扫描子目录 obj-$(CONFIG_DM_SERIAL) uclass.o obj-$(CONFIG_DM_SERIAL) $(patsubst %/,%, $(wildcard */)) obj-$(CONFIG_DM_SERIAL) $(patsubst %/,%, $(wildcard */))/最后一行$(patsubst %/,%, $(wildcard */))的意思是扫描当前目录下所有子目录名去掉末尾斜杠然后把这些目录名作为obj-$(CONFIG_DM_SERIAL)的值。比如存在rockchip/和sunxi/两个子目录这行就会展开为obj-$(CONFIG_DM_SERIAL) rockchip sunxi接着Kbuild会自动进入rockchip/和sunxi/目录读取它们各自的Makefile形成递归编译链。这种写法极大减少了手动维护obj-y列表的工作量但也带来隐性风险如果某个子目录名拼写错误比如rockchip/写成rockcchip/wildcard就匹配不到该目录下的代码永远不会编译而编译过程也不会报错——因为Kbuild只检查语法不验证目录是否存在。我在线上项目中遇到过一次诡异问题RV1106的UART在SPL阶段无法输出查到最后发现drivers/serial/rockchip/目录被误命名为drivers/serial/rockchip_v1/wildcard */没匹配到导致rockchip_spl.o根本没编译进去。修复方法很简单重命名目录或显式添加obj-$(CONFIG_DM_SERIAL) rockchip_v1/但定位过程花了整整两天——因为没有任何编译警告提示目录缺失。3. “make没有指明目标并且找不到makefile”从报错信息反推构建系统状态这个报错看似简单实则是构建系统健康状况的“心电图”。它出现的位置、上下文、以及伴随的其他信息能精准定位问题发生在Kbuild链路的哪个环节。我们来拆解几种典型场景。3.1 场景一在错误目录执行make最常见现象$ cd board/rockchip/rv1106 $ make make: *** No targets specified and no makefile found. Stop.原因分析U-Boot的Makefile只存在于根目录./Makefile所有子目录的Makefile都是被顶层Makefile通过-f scripts/Makefile.build obj$(obj)调用的。当你在board/rockchip/rv1106/目录下直接执行makeGNU Make会在当前目录找Makefile或makefile找不到就报这个错。解决方案始终在U-Boot根目录执行make命令如果必须在子目录操作用make -C /path/to/u-boot/指定根目录例如$ make -C ~/u-boot/ BOARDrv1106_evb提示U-Boot的make help输出里所有目标如rv1106_evb_defconfig、u-boot.bin都隐含了“在根目录执行”的前提。这是新手最容易踩的坑也是文档里往往一笔带过的细节。3.2 场景二顶层Makefile被意外删除或损坏现象$ ls -l total 0 $ make make: *** No targets specified and no makefile found. Stop.原因分析根目录下真的没有Makefile。可能是git checkout失败、解压包不完整、或者误删。此时ls命令能看到目录为空或缺少关键文件。解决方案检查根目录是否存在Makefile、Kconfig、README等核心文件如果缺失重新克隆仓库或解压源码包注意不要用make clean清理整个目录它只会清空*文件但不会删Makefile——这个报错通常不是make clean导致的3.3 场景三环境变量污染导致Makefile解析失败现象$ export MAKEFLAGS-j4 $ make rv1106_evb_defconfig make: *** No targets specified and no makefile found. Stop.原因分析MAKEFLAGS是GNU Make的内置变量用于传递全局参数。但U-Boot的顶层Makefile在解析时会检查MAKEFLAGS是否包含非法字符或破坏性参数。某些版本的Make尤其是较老的3.81在MAKEFLAGS被外部设置时会错误地跳过include指令导致scripts/Makefile.*未被加载整个构建系统瘫痪。解决方案临时清空MAKEFLAGSunset MAKEFLAGS或者用env -i make rv1106_evb_defconfig启动干净环境更稳妥的做法是在~/.bashrc里避免永久设置MAKEFLAGS改用alias umakemake -j$(nproc)3.4 场景四Kconfig根文件缺失导致menuconfig失效现象$ make menuconfig *** Unable to find the ncurses libraries or the headers. $ make defconfig make: *** No rule to make target defconfig. Stop.原因分析make defconfig依赖scripts/Makefile.autoconf而该文件需要读取Kconfig根文件来生成配置。如果./Kconfig不存在make会找不到defconfig目标——因为defconfig规则定义在scripts/Makefile.autoconf里而该文件的加载前提是Kconfig存在。解决方案确认根目录下有Kconfig文件大小通常在1MB以上如果是从patch或定制分支获取的代码检查是否遗漏了Kconfig不要试图用touch Kconfig伪造文件U-Boot的Kconfig有严格的语法校验空文件会导致conf工具崩溃3.5 场景五交叉编译工具链未正确配置现象$ make CROSS_COMPILEaarch64-linux-gnu- rv1106_evb_defconfig make: *** No rule to make target rv1106_evb_defconfig. Stop.原因分析rv1106_evb_defconfig是configs/目录下的一个文件名make通过%_defconfig模式规则将其映射为make -f scripts/Makefile.autoconf defconfig。但如果CROSS_COMPILE设置错误比如路径不存在U-Boot的顶层Makefile在初始化阶段就会提前退出导致模式规则未被注册。解决方案先验证工具链aarch64-linux-gnu-gcc --version确保CROSS_COMPILE末尾有短横线CROSS_COMPILEaarch64-linux-gnu-不是aarch64-linux-gnu推荐做法在~/.bashrc里设置export CROSS_COMPILEaarch64-linux-gnu-然后source ~/.bashrc4. RV1106平台移植实战从零构建Kbuild可识别的板级支持现在我们把前面所有理论落地到RV1106平台的具体移植步骤。这不是教科书式的“新建目录→复制模板→修改宏”而是基于真实产线经验的Kbuild视角重构流程——每一步都确保Kbuild能正确感知、解析、编译。4.1 第一步创建合法的defconfig文件Kconfig入口不能直接复制rv1126_evb_defconfig然后改名因为U-Boot的Kconfig依赖检查会失败。正确做法是进入U-Boot根目录执行make rockchip_rv1106_defconfig如果报错No rule to make target rockchip_rv1106_defconfig说明Kconfig里还没声明RV1106平台。此时需要先编辑arch/arm/mach-rockchip/Kconfig在choice块里添加config TARGET_RV1106_EVB bool RV1106 EVB select ARCH_ROCKCHIP select SOC_RV1106 select SUPPORT_SPL help Enable support for Rockchip RV1106 Evaluation Board.然后生成初始defconfigmake menuconfig # 在System type - Rockchip SoC support下勾选RV1106 EVB # 保存退出自动生成.config make savedefconfig mv defconfig configs/rv1106_evb_defconfig这一步的关键是savedefconfig生成的defconfig会自动包含所有select依赖项如CONFIG_SOC_RV1106y避免手动遗漏。我见过太多人手写defconfig漏掉CONFIG_SPLy结果SPL部分根本编译不出来。4.2 第二步建立Kbuild可识别的板级目录结构RV1106的板级目录必须严格遵循U-Boot约定board/ └── rockchip/ └── rv1106/ # 目录名必须与Kconfig中config名一致TARGET_RV1106_EVB ├── Makefile # 必须存在内容见下文 ├── board.c # 板级初始化入口 └── Kconfig # 可选用于声明板级特有配置board/rockchip/rv1106/Makefile内容obj-y : board.o obj-$(CONFIG_SPL_BUILD) spl.o obj-$(CONFIG_TPL_BUILD) tpl.o注意obj-y : board.o中的:是立即赋值避免变量延迟展开导致的顺序问题。board.o会自动编译board.c而board.c里必须定义board_init_f和board_init_r函数——这是Kbuild链接时查找的符号入口。4.3 第三步修复头文件路径问题makefile 头文件路径 rv1106RV1106 SDK常自带私有头文件如rockchip/uart.h放在include/rockchip/下。但U-Boot默认只搜索include/、arch/arm/include/等标准路径。解决方案是在顶层Makefile里追加# 在顶层Makefile的KBUILD_CPPFLAGS定义后添加 KBUILD_CPPFLAGS -I$(srctree)/include/rockchip或者更规范的做法在board/rockchip/rv1106/Makefile里CFLAGS_board.o : -I$(srctree)/include/rockchip这样board.c编译时就能找到#include rockchip/uart.h。绝对不要用#include ../include/rockchip/uart.h这种相对路径——Kbuild的-I参数是全局的相对路径在不同编译层级下会失效。4.4 第四步验证Kbuild依赖链make -n的黄金用法在执行make前先用make -n查看dry-run输出确认Kbuild是否按预期工作make -n rv1106_evb_defconfig # 输出应包含 # scripts/kconfig/conf --defconfig... configs/rv1106_evb_defconfig Kconfig # cat ... .config # scripts/kconfig/conf --syncconfig Kconfig make -n u-boot.bin # 输出应包含 # aarch64-linux-gnu-gcc -D__ASSEMBLY__ -Iinclude ... -c arch/arm/cpu/armv8/start.S -o arch/arm/cpu/armv8/start.o # aarch64-linux-gnu-gcc -Iinclude ... -c board/rockchip/rv1106/board.c -o board/rockchip/rv1106/board.o # aarch64-linux-gnu-ld ... -o u-boot如果board/rockchip/rv1106/board.o没出现在输出里说明Kbuild没识别到你的板级目录——检查board/rockchip/rv1106/Makefile是否存在以及configs/rv1106_evb_defconfig里是否有CONFIG_TARGET_RV1106_EVBy。4.5 第五步调试SPL阶段的Kbuild问题最隐蔽的坑RV1106的SPLSecondary Program Loader是独立编译的它有自己的Kbuild链路。常见问题SPL编译成功但烧录后不启动u-boot-spl.bin大小异常 4KB通常是错的排查步骤查看SPL的编译日志make V1 u-boot-spl.bin 21 | grep -E (board|start|link)正常输出应包含aarch64-linux-gnu-gcc ... -c board/rockchip/rv1106/spl.c -o board/rockchip/rv1106/spl.o aarch64-linux-gnu-ld ... -T spl/u-boot-spl.lds ... -o u-boot-spl检查SPL的链接脚本spl/u-boot-spl.lds必须包含SECTIONS { . CONFIG_SPL_TEXT_BASE; ... }而CONFIG_SPL_TEXT_BASE必须在configs/rv1106_evb_defconfig里定义如CONFIG_SPL_TEXT_BASE0x00000000。验证SPL符号表aarch64-linux-gnu-nm u-boot-spl | grep _start # 应输出类似0000000000000000 T _start如果_start符号缺失说明SPL的启动汇编文件arch/arm/cpu/armv8/start.S没被编译进去——这通常是因为CONFIG_SPL_BUILD没在SPL编译环境中启用根源还是Kconfig依赖没配对。5. CMake vs Makefile为什么U-Boot坚决不用CMake网络热词里“cmake和makefile区别”高居榜首很多刚从应用开发转嵌入式的工程师看到U-Boot还在用Makefile第一反应是“太古老了应该换成CMake”。我在RK3566项目评审会上就听到过类似建议结果被架构师当场否决。这里不是技术保守而是有硬性的工程约束。5.1 构建确定性Makefile的不可替代性U-Boot的核心要求是构建结果100%可重现。同一份源码、同一套工具链在任何机器上编译生成的u-boot.bin的SHA256哈希值必须完全一致。CMake的缓存机制CMakeCache.txt和生成的build.ninja文件会因主机环境如/tmp路径、用户UID、时区产生微小差异导致二进制不一致。而GNU Make是纯文本驱动只要Makefile、Kconfig、源码、工具链不变输出必然相同。实测数据同一份U-Boot源码在Ubuntu 20.04和CentOS 7上用相同GCC 10.2编译u-boot.bin哈希值完全一致同样源码用CMake生成Ninja构建两次编译的u-boot.bin哈希值有0.3%概率不同源于CMakeFiles/下时间戳和路径字符串的差异5.2 跨平台兼容性Make是POSIX标准U-Boot要支持从Windows WSL、macOS、FreeBSD到各种嵌入式Linux发行版的构建环境。GNU Make在所有POSIX系统上都有成熟实现而CMake在非Linux系统上常遇到路径分隔符\vs/、权限模型macOS SIP、符号链接处理等兼容性问题。曾有团队尝试在macOS上用CMake构建U-Boot结果scripts/mkimage工具因路径问题无法生成FIT镜像调试两周无果后退回Makefile。5.3 构建速度Kbuild的增量编译精度CMake的add_executable()会把整个目录视为一个target而U-Boot的Kbuild能做到单文件粒度的增量编译。比如你只改了drivers/usb/host/xhci-rockchip.cKbuild只会重新编译这个文件和它依赖的头文件耗时1秒。CMake的target模型则倾向于重新链接整个u-boot耗时30秒。在每天编译上百次的产线环境中这个差异就是生死线。5.4 维护成本Kconfig与Makefile的深度耦合U-Boot的Kconfig不是独立配置系统它和Makefile是共生关系。CONFIG_DM_MMC既控制drivers/mmc/Kconfig里的选项可见性又决定drivers/mmc/Makefile里obj-$(CONFIG_DM_MMC)是否展开。CMake没有原生的Kconfig集成方案强行嫁接会导致配置管理分裂——一半在CMakeLists.txt一半在Kconfig最终没人能说清某个功能到底开没开。实战建议如果你真想用CMake唯一可行的方案是把它当作Makefile的生成器类似autotools而不是替代品。即用CMake解析Kconfig生成Makefile再交给GNU Make执行。但这增加了构建复杂度且U-Boot社区明确拒绝此类补丁——因为违背了“简单即可靠”的设计哲学。6. 我踩过的三个Kbuild深坑及避坑清单最后分享我在多个Rockchip平台移植中用血泪换来的三条铁律。它们不写在任何官方文档里但能帮你省下至少200小时调试时间。6.1 坑一CONFIG_SYS_TEXT_BASE和CONFIG_SPL_TEXT_BASE的单位陷阱RV1106的DRAM起始地址是0x00000000但很多文档写成0x0。问题来了U-Boot的Kbuild在处理十六进制常量时会进行隐式类型转换。CONFIG_SYS_TEXT_BASE0x0会被解析为十进制0而CONFIG_SYS_TEXT_BASE0x00000000才是真正的32位零地址。实测结果CONFIG_SYS_TEXT_BASE0x0→ 链接脚本生成. 0x0;→ 加载地址为0 → 启动失败ARMv8不允许从0地址执行CONFIG_SYS_TEXT_BASE0x00000000→ 正确生成. 0x00000000;→ 启动正常避坑方法所有地址配置必须写满8位32位平台或16位64位平台即0x00000000而非0x00x0000000080000000而非0x80000000。6.2 坑二obj-y和obj-$(CONFIG_XXX)的优先级冲突在drivers/serial/Makefile里如果同时存在obj-y serial.o obj-$(CONFIG_SYS_NS16550) ns16550.o当CONFIG_SYS_NS16550n时ns16550.o不会编译但serial.o会。这没问题。但如果写成obj-$(CONFIG_SYS_NS16550) ns16550.o obj-y serial.o看起来一样但Kbuild的解析顺序可能导致serial.o里的serial_ns16550_init函数被优化掉——因为ns16550.o没编译链接器认为这个符号未定义从而移除所有引用它的代码。结果就是UART完全失灵。避坑方法永远把通用代码obj-y放在条件编译obj-$(CONFIG_XXX)之前确保基础框架先加载。6.3 坑三make clean的隐藏副作用make clean不仅清空*.o、*.bin还会删除include/generated/目录。这意味着下次make会重新生成autoconf.h但如果你的Kconfig有语法错误conf工具会静默失败生成空的autoconf.h所有#ifdef CONFIG_XXX判断都为假编译出的U-Boot只剩一个空壳避坑方法make clean后务必执行make rv1106_evb_defconfig重建配置或者用make mrproper代替make clean它更彻底但更安全生产环境推荐make distclean它会清空所有生成文件确保从零开始这些坑每一个都让我在凌晨三点对着示波器抓狂过。但正是这些细节构成了U-Boot Kbuild的真正门槛——它不难但要求你像读法律条文一样读Makefile像考古一样查Kconfig依赖像外科医生一样切片分析编译日志。当你能一眼看出make: *** No targets specified and no makefile found背后是环境变量污染而不是路径错误时你就真正入门了。
延伸阅读

更多相关文章

2026/10/9 1:44:35

嵌入式CAN总线从物理层到应用层实战指南

CAN总线这东西,刚入行嵌入式的朋友十有八九都听过,但真正能把它讲明白、用利索的人并不多。我见过太多人做项目时,传感器数据一多、节点一分散,就开始抓瞎:I2C距离太短,串口点对点又不够用,RS48…

2026/10/9 2:19:36

动态规划——背包问题

1、完全平方数Q:给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数&#x…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

2026/10/9 0:04:27

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略当数万字的学位论文初稿经历开题、实验、问卷与多轮文献梳理最终成形时,绝大多数研究生都会面临一道全新的形式审查关卡:AIGC 疑似度排查。在高校毕业审核流程中,盲审前的文本检测通…

2026/10/9 0:04:27

食堂节能改造源头工厂,商用厨房设备焕新方案广受好评

商用厨房作为餐饮经营、单位供餐的核心后勤阵地,其设备配置、动线规划与运维体系直接决定后厨作业效率、运营成本与合规性。从基础的灶具、制冷存储设备,到油烟净化、水处理等配套系统,每一个环节的合理性都与食品安全、能耗管控、消防安全挂…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑