当前位置: 首页 > article >正文

将 fnOS 从 eMMC/TF 卡无损迁移至外部存储(NVMe/USB/SATA/TF)的完整方案 —— 适用于瑞芯微 RK 系列平台(含小容量盘适配)

将 fnOS 从 eMMC 无损迁移至 NVMe SSD日常用 ARM 设备总习惯把固件刷进 eMMC 或者 TF 卡。eMMC 读写慢寿命有限用久了总觉得差口气。我手头有块 NanoPC-T4给它刷了 Arm 飞牛固件简单体验了一下就琢磨要是能把系统挪到 NVMe 上应该会爽很多。NanoPC-T4 正好有个 NVMe M.2 插槽把系统装到外部存储上就能绕过 eMMC 这个瓶颈。我去翻了友善官方的eflasher-multiple-os固件说明它确实可以把根文件系统写到 NVMe 或 USB 设备里但我不确定它能不能兼容飞牛的 rootfs。而且官方固件内核太老了4.19新特性和 Docker 完整支持都享受不到。好在 ARM 设备的引导思路是相通的自己研究了一下把飞牛系统迁移到了 NVMe 硬盘上。下面就是完整的折腾记录。先搞清楚 ARM 板子是怎么启动的以 RK3399 为例芯片内部固化了一段不可更改的启动 ROMBootROM。上电后BootROM 会按顺序扫描可启动设备一般是 SD 卡 → eMMC → SPI Flash找到有效的 U-Boot 就加载执行。U-Boot 负责初始化内存、时钟等然后从某个设备通常是 eMMC 或 SD 卡的分区加载内核kernel和设备树dtb。内核跑起来之后再根据root参数去挂载根文件系统。关键点RK3399 的 BootROM 不认识 NVMe。U‑Boot 和内核镜像必须放在 eMMC 或 SD 卡上但根文件系统可以放在任何内核能驱动的地方——当然也包括 NVMe。顺着这个思路整个方案可以拆成两步准备 rootfs在 NVMe 上建好分区把 eMMC 上的根文件系统完整复制过去并处理好 UUID 冲突。修改 PARTUUID修改 eMMC 上的内核引导参数让系统从 NVMe 的 PARTUUID 启动。基于这个原理我们决定用“eMMC 引导 NVMe 系统”的分离架构eMMC只放引导文件U‑Boot、内核、DTB几乎只读寿命无限NVMe放完整的根文件系统所有读写都在这儿享受高速低延迟这个方案既能绕过 RK3399 的引导限制又能把 eMMC 的寿命省下来同时把 NVMe 的性能用满。而且这种“引导介质与 rootfs 分离”的思路并不局限于 NVMe——如果 eMMC 损坏了或者板子根本没有 eMMC甚至你想把系统挪到 USB 3.0 硬盘、SATA 盘、另一张 TF 卡上本质都是一样的只要 BootROM 能从某个介质比如 TF 卡把 U‑Boot 和内核拉起来内核就能从任何它认得到的设备上挂载 rootfs。后面你会看到我们只改了一个rootPARTUUID参数这个参数指向哪里系统就从哪里启动。我手里的东西开发板NanoPC-T4RK3399引导盘板载 eMMC14.6 GB系统盘Intel Optane M10 16GB NVMe实际可用只有 13.4 GB系统fnOS 1.1.24内核Linux 6.12.41文件系统Btrfs引导方式U-Boot 脚本boot.scrfnEnv.txt注意本文所有操作都假设 NVMe 设备名为nvme0n1。你的可能是nvme1n1或别的请用lsblk确认后替换。一上来就碰了个硬钉子量了一下傲腾 M10 虽然标称 16GB实际可用只有 13.4 GB而 eMMC 上的根分区占了 14.1 GB。用dd直接克隆肯定不行目标盘比源盘还小得换个思路——不能用块设备克隆只能用文件级复制挑着有用的文件搬过去。一步步开干1. 先看看设备lsblk我的输出rootNanoPC-T4:/# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS mmcblk2179:0014.6G0disk ├─mmcblk2p1179:10285M0part /boot └─mmcblk2p2179:2014.1G0part / mmcblk2boot0179:3204M1disk mmcblk2boot1179:6404M1disk zram0252:001.9G0disk[SWAP]nvme0n1259:0013.4G0disk └─nvme0n1p1259:1013.4G0part └─md09:0013.4G0raid1 └─trim_08a0334e_a652_40cb_a25e_151bd2290a7e-0253:0013.4G0lvm注意我的傲腾 M10 之前在飞牛上挂载过残留了 LVM 和 RAID 的配置得先清理干净。2. 清理 NVMe 上的旧配置如果不清理干净后面分区格式化会出各种奇怪问题——比如明明已经分区了但lsblk还是能看到旧的分区结构。# 强制卸载所有可能相关的挂载点根据你的实际情况改umount-l/vol12/dev/null||trueumount-l/dev/md02/dev/null||trueumount-l/dev/nvme0n1p12/dev/null||true# 停止 LVM 和 RAID 服务替换成你实际的 LVM 名称lvchange-an-fftrim_08a0334e_a652_40cb_a25e_151bd2290a7e-02/dev/null||truemdadm--stop/dev/md02/dev/null||truedmsetup remove trim_08a0334e_a652_40cb_a25e_151bd2290a7e-02/dev/null||true# 擦除分区表头扇区让内核认为这盘是空的ddif/dev/zeroof/dev/nvme0n1bs512count100convfsync# 通知内核重新读取分区表partprobe /dev/nvme0n1执行完后lsblk应该只看到一个光秃秃的nvme0n1rootNanoPC-T4:/# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS mmcblk2179:0014.6G0disk ├─mmcblk2p1179:10285M0part /boot └─mmcblk2p2179:2014.1G0part / mmcblk2boot0179:3204M1disk mmcblk2boot1179:6404M1disk zram0252:001.9G0disk[SWAP]nvme0n1259:0013.4G0disk3. 确认 eMMC 上的文件系统类型blkid /dev/mmcblk2p2我得到rootNanoPC-T4:/# blkid /dev/mmcblk2p2/dev/mmcblk2p2:LABELrootfsUUID48b0a7cb-68bc-4337-b9ad-fc605dbb31bfUUID_SUBf29b6a03-37ca-4e05-987e-a2b5d5e05154BLOCK_SIZE4096TYPEbtrfsPARTUUIDafe747ae-13c5-4540-8cd0-94fb975662e5是 Btrfs记下这个 UUID后面要用。4. 给 NVMe 分区第一步准备 rootfs 的开始# 彻底清一下残留元数据wipefs-a/dev/nvme0n1 partprobe /dev/nvme0n1# 创建 GPT 分区表parted/dev/nvme0n1 mklabel gpt# 输入 yes 确认# 创建 Boot 分区285MB和 eMMC 保持一致parted/dev/nvme0n1 mkpart primary ext4 1MiB 286MiB# 创建 Root 分区占满剩余空间(此时建立了一个ext4分区,后面会格式化成btrfs)parted/dev/nvme0n1 mkpart primary ext4 286MiB100%# 刷新分区表partprobe /dev/nvme0n1# 检查分区结果lsblk /dev/nvme0n15. 格式化# Boot 分区用 ext4兼容性最好mkfs.ext4 /dev/nvme0n1p1# Root 分区用 btrfs和源系统一致mkfs.btrfs-f-Lrootfs_nvme /dev/nvme0n1p2格式化完顺手记一下新分区的 UUID 和 PARTUUIDblkid /dev/nvme0n1p26. 挂载并复制数据继续准备 rootfs# 创建临时挂载点mkdir-p/mnt/dst_boot /mnt/dst_root# 挂载目标分区mount/dev/nvme0n1p1 /mnt/dst_bootmount/dev/nvme0n1p2 /mnt/dst_root# 检查空间够不够df-h/# 源已用空间df-h/mnt/dst_root# 目标可用空间# 必须确保 源已用 目标可用确认空间足够后开始复制。因为目标盘比源盘小不能用dd只能用rsync做文件级复制。# 复制 Boot 分区rsync-avHAX/boot/ /mnt/dst_boot/# 复制根文件系统排除虚拟文件系统和外部挂载点rsync-avHAX\--exclude/proc/*\--exclude/sys/*\--exclude/dev/*\--exclude/run/*\--exclude/mnt/*\--exclude/tmp/*\--exclude/lostfound/*\--exclude/vol*/\--exclude/media/*\/ /mnt/dst_root/等几分钟看到类似这样的输出就成功了sent5,244,244,907 bytes received1,572,046 bytes62,080,674.00 bytes/sec total size is5,241,423,994 speedup is1.007. 修改 NVMe 分区的 UUID关键步骤属于准备 rootfs 的收尾现在遇到一个新问题我们用rsync把文件原样复制过去了但 Btrfs 文件系统的 UUID 也被原样复制了。也就是说NVMe 上的新 rootfs 和 eMMC 上的旧 rootfs 有完全相同的 UUID。内核在挂载时看到两个相同 UUID 的 Btrfs 卷就会混乱——它不知道该用哪一个。所以必须给 NVMe 上的 rootfs 生成一个新的 UUID。先卸载 root 分区btrfstune要求分区不能处于挂载状态umount/mnt/dst_root然后生成新 UUIDbtrfstune-u/dev/nvme0n1p2工具会问你是否确认输入yNew fsid: ff743428-987f-4649-b87e-3a94a65c94c6 Set superblock flag CHANGING_FSID Change fsidinextent tree Change fsidinchunk tree Clear superblock flag CHANGING_FSID Fsid change finished记录下新旧 UUID 和 PARTUUIDOLD_UUID$(blkid-sUUID-ovalue /dev/mmcblk2p2)NEW_UUID$(blkid-sUUID-ovalue /dev/nvme0n1p2)NEW_PARTUUID$(blkid-sPARTUUID-ovalue /dev/nvme0n1p2)echo旧 UUID (eMMC):$OLD_UUIDecho新 UUID (NVMe):$NEW_UUIDecho新 PARTUUID (NVMe):$NEW_PARTUUID我的输出旧 UUID(EMMC): 48b0a7cb-68bc-4337-b9ad-fc605dbb31bf 新 UUID(NVMe): ff743428-987f-4649-b87e-3a94a65c94c6 新 PARTUUID(NVMe): 871c986b-5385-45ae-a241-2e875a3ecc438. 修改 NVMe 里的 /etc/fstab让新 rootfs 引用自己的 UUIDNVMe 上的 rootfs 里还有一个/etc/fstab文件它里面写的是旧的 UUID指向 eMMC。如果不改即使内核从 NVMe 启动了后续挂载/时又会因为 UUID 不匹配而出错。所以得把它也换成新的 UUID。重新挂载 NVMe 的 root 分区mount/dev/nvme0n1p2 /mnt/dst_root备份并替换 UUIDcp/mnt/dst_root/etc/fstab /mnt/dst_root/etc/fstab.baksed-is/$OLD_UUID/$NEW_UUID/g/mnt/dst_root/etc/fstab验证一下cat/mnt/dst_root/etc/fstab应该看到/分区已经指向新的 UUIDrootNanoPC-T4:/# cat /mnt/dst_root/etc/fstab.......UUIDff743428-987f-4649-b87e-3a94a65c94c6 / btrfs defaults,noatime,errorsremount-ro01UUIDcf2ecdac-946c-4790-a894-19c10b526a1a /boot ext4 defaults,noatime,errorsremount-ro02tmpfs /tmp tmpfs defaults,nosuid00确认无误后卸载umount/mnt/dst_rootumount/mnt/dst_boot至此第一步“准备 rootfs”完成NVMe 上已经有了一个独立、可用的根文件系统UUID 也改好了。9. 修改 eMMC 上的引导配置第二步修改 PARTUUID现在NVMe 上的系统已经准备好了但内核还不知道要去 NVMe 上找 root。因为 RK3399 的 BootROM 只认识 eMMC/SD 卡所以我们还是从 eMMC 启动内核但要让内核把根文件系统挂载到 NVMe 上。这就需要修改内核启动参数。另外如果直接使用文件系统的 UUID 来指定 root可能会遇到问题在早期引导阶段内核不一定能正确解析 Btrfs 的 UUID尤其当有多个相同类型的文件系统时。更可靠的办法是用 PARTUUID——这是分区表的属性在分区创建时就固定了不会因为文件系统格式化而改变而且内核在很早期的阶段就能识别它。编辑 eMMC 上的/boot/fnEnv.txtvim/boot/fnEnv.txt原来的内容大概是这样verbosity1bootlogofalseconsolebothextraargscma256Mfdtfilerockchip/rk3399-nanopc-t4.dtbkernelfilevmlinuz-6.12.41-trim我们需要在extraargscma256M后面追加rootPARTUUIDxxxx-xxxx-xxxx-xxxx。注意PARTUUID后面不要加双引号cma256M和root...之间必须有一个空格。修改后verbosity1bootlogofalseconsolebothextraargscma256MrootPARTUUID871c986b-5385-45ae-a241-2e875a3ecc43fdtfilerockchip/rk3399-nanopc-t4.dtbkernelfilevmlinuz-6.12.41-trim为什么用 PARTUUID 而不是 UUIDPARTUUID 是分区表的属性不会因为文件系统重新格式化而改变在早期引导阶段更可靠。而且这个rootPARTUUID参数是通用的——如果你的 eMMC 坏了你可以把同样的参数指向另一张 TF 卡上的根分区如果你想用 USB 3.0 硬盘启动只要内核能识别该硬盘改一下 PARTUUID 就行。整个方案的精髓就在这一行。10. 重启验证建议再检查一遍/boot/fnEnv.txt里的 PARTUUID 是否和blkid /dev/nvme0n1p2输出一致。syncreboot验证一下是否真的跑在 NVMe 上重启后登录系统执行df-hT/ lsblkmount|grep / 我的结果可以看到/已经挂载在/dev/nvme0n1p2上了eMMC 的mmcblk2p2没有被使用。性能测试傲腾到底有多快Intel Optane M10 是一块很有意思的小硬盘。它的容量不大16GB但用的是 3D XPoint 介质延迟极低读写磨损均衡做得特别好。普通 TLC 固态的 4K 随机读写通常只有几万 IOPS而傲腾可以轻松跑到六位数。在 NanoPC-T4 上虽然 PCIe 2.0 x4 的带宽限制了顺序读写理论上限约 1.6 GB/s实际更少但傲腾真正的杀手锏——4K 随机读写和超低延迟——几乎不受影响。跑数据库、Docker 容器、频繁读写小文件的场景这块小傲腾能带来脱胎换骨的体验。先装fiosudoaptupdatesudoaptinstallfio-y然后跑几个测试# 4K 随机读fio--namerandread--ioenginelibaio--iodepth1--rwrandread--bs4k--direct1--size256M--numjobs1--runtime60--group_reporting--filename/tmp/fio_test_read# 4K 随机写fio--namerandwrite--ioenginelibaio--iodepth1--rwrandwrite--bs4k--direct1--size256M--numjobs1--runtime60--group_reporting--filename/tmp/fio_test_write# 混合读写70% 读 30% 写典型服务器负载fio--namemixed--ioenginelibaio--iodepth4--rwrandrw--rwmixread70--bs4k--direct1--size256M--numjobs2--runtime60--group_reporting--filename/tmp/fio_mixed# 清理rm/tmp/fio_test_* /tmp/fio_mixed_*2/dev/null我的测试结果测试项目速度/性能延迟评价顺序写入611 MB/s-吃满 PCIe 2.0 带宽顺序读取800 MB/s-含内存缓存加速4K 随机读137,000 IOPS6.16 μs企业级性能4K 随机写135,000 IOPS6.13 μs读写几乎一致混合读写读 181k / 写 77.8k IOPS29 μs低负载依然极低延迟傲腾在 RK3399 上跑出了 13 万 IOPS延迟只有 6 微秒——系统响应飞快Docker 容器启动也明显流畅了。这个方案能走多远回过头看这次迁移的核心其实就两步先在目标盘上准备好一个独立的根文件系统再改一下 eMMC 上fnEnv.txt里的rootPARTUUID参数。这个思路并不绑定 NVMe也不依赖 eMMC 必须完好。引导介质可以是 eMMC也可以是 TF 卡。万一哪天 eMMC 彻底写坏了只要把同样的引导文件U‑Boot、内核、dtb和fnEnv.txt拷到一张 TF 卡上插上去就能照样启动。而rootPARTUUID后面那个参数你想指向哪里就指向哪里——NVMe 可以USB 3.0 硬盘可以SATA 盘可以甚至另一张 TF 卡也可以。只要内核能驱动那个设备系统就能从那儿跑起来。所以这套方法不仅救活了我这块小容量傲腾也适用于任何想把瑞芯微 ARM 设备的系统从慢速存储迁到高速外部介质的场景。如果你的 eMMC 还没坏它可以作为提速方案如果已经坏了它更是一条复活路径。LECREATE2026 年 3 月 22 日

相关文章:

将 fnOS 从 eMMC/TF 卡无损迁移至外部存储(NVMe/USB/SATA/TF)的完整方案 —— 适用于瑞芯微 RK 系列平台(含小容量盘适配)

将 fnOS 从 eMMC 无损迁移至 NVMe SSD 日常用 ARM 设备,总习惯把固件刷进 eMMC 或者 TF 卡。eMMC 读写慢,寿命有限,用久了总觉得差口气。我手头有块 NanoPC-T4,给它刷了 Arm 飞牛固件简单体验了一下,就琢磨&#xff1a…...

扩散模型对抗样本经典baselines窒

一、简化查询 1. 先看一下查询的例子 /// /// 账户获取服务 /// /// /// public class AccountGetService(AccountTable table, IShadowBuilder builder) {private readonly SqlSource _source new(builder.DataSource);private readonly IParamQuery _accountQuery build…...

痞子衡嵌入式:turbo-spiboot - 一种基于MCUBoot协议的二级SPI加载APP提速方案犹

前面我们对 Kafka 的整体架构和一些关键的概念有了一个基本的认知,本文主要介绍 Kafka 的一些配置参数。掌握这些参数的作用对我们的运维和调优工作还是非常有帮助的。 写在前面 Kafka 作为一个成熟的事件流平台,有非常多的配置参数。详细的参数列表可以…...

告别命令行恐惧:在恒源云GPU服务器上部署Linux桌面环境全攻略

1. 为什么需要Linux图形化桌面环境? 很多刚接触GPU服务器的开发者都有这样的经历:好不容易申请到一台高性能的恒源云GPU服务器,登录后却只能面对黑漆漆的命令行界面。对于习惯Windows或Mac图形界面的用户来说,这就像突然被扔进了原…...

Spring with AI (): 搜索扩展——向量数据库与RAG(下)馗

. GIF文件结构 相比于 WAV 文件的简单粗暴,GIF 的结构要精密得多,因为它天生是为了网络传输而设计的(包含了压缩机制)。 当我们用二进制视角观察 GIF 时,它是由一个个 数据块(Block) 组成的&…...

新手入门编程选C语言!超详细零基础入门指南请查收

新手入门编程,选对语言太关键!许多人有着想要学习编程的想法,然而却不清楚该从哪里开始着手——实际上C语言才是对于没有基础之人最为适宜的“敲门砖”。它身为编程领域的“老大哥”,不但语法秉持简洁的特点、易于让人掌握&#x…...

关于CUDA+QtCreator+OpenCV环境配置的一些注意事项

【以下内容不包含安装教程,仅用于环境报错时候自查】如果你在配置相关环境的时候遇到了类似以下报错:Cannot find CUDA installation; provide its path via --cuda-path, or pass -nocudainc to build without CUDA includes Cannot find libdevice for…...

When and Why to use Extensions -- VK_KHR_draw_indirect_count

VK_KHR_draw_indirect_count已晋升为 Vulkan 1.2 核心功能每次调用 vkCmdDraw 都会使用一组描述绘制命令的参数。为了批量执行绘制命令,相同的参数会以 VkDrawIndirectCommand 为单位存储在 VkBuffer 中。使用 vkCmdDrawIndirect 可以发起 drawCount 次绘制&#xf…...

千问 LeetCode 1359.有效的快递序列数目 public int countOrders(int n)

这道题要求计算 n 个订单所有有效的收件/配送序列数目,其中每个订单的配送(Delivery)必须在其收件(Pickup)之后。这是一个经典的组合数学问题,可以通过递推的方法来解决。💡 解题思路我们可以从…...

手把手教你用Qwen-Image-Edit-2511:小白也能玩的AI换装神器

手把手教你用Qwen-Image-Edit-2511:小白也能玩的AI换装神器 1. 快速认识AI换装神器 最近发现一个特别有意思的工具,能让普通人也能轻松玩转AI换装。这个叫Qwen-Image-Edit-2511的AI模型,是之前2509版本的升级版,主要解决了几个关…...

警惕!你的CV模型可能正在被欺骗:实测PGD对抗攻击在ResNet50上的破坏力

警惕!你的CV模型可能正在被欺骗:实测PGD对抗攻击在ResNet50上的破坏力 计算机视觉工程师们常常沉浸在模型准确率提升的喜悦中,却很少意识到一个残酷的现实:那些在测试集上表现优异的模型,可能正面临着看不见的威胁。上…...

嵌入式滤波器频率响应实时绘制库

1. FrequencyResponseDrawer 库概述FrequencyResponseDrawer 是一个面向嵌入式平台的轻量级 C 类库,专为在资源受限的微控制器上实时绘制数字滤波器频率响应曲线而设计。其核心目标并非替代 MATLAB 或 Python 的科学计算能力,而是解决嵌入式系统中一个典…...

5. 联合类型和交叉类型的区别是什么?

目录 一、 第一层:从“集合论”定性(底层逻辑) 二、 第二层:成员访问的“悖论” (技术深度点) 1. 联合类型的“访问收缩” 2. 交叉类型的“属性扩张” 三、 第三层:实战场景(展…...

php方案 Beanstalkd

安装 composer require pda/pheanstalk monolog/monolog ---项目结构src/├──…...

批量PDF合并工具使用说明:批量合并与直接合并两种模式,拖拽排序/页面范围/遍历子目录/重名自动处理

【批量PDF合并工具】用于把多个 PDF 合并成一个 PDF,提供两种常用模式:批量合并:选择文件夹,让工具按规则自动收集并合并 PDF直接合并:把 PDF 拖到列表里,手动调整顺序后合并(更可控&#xff09…...

FreeRTOS 线程本地存储(TLS)实战指南:从原理到应用

1. 什么是FreeRTOS线程本地存储(TLS)? 想象一下你在办公室里工作,每个同事都有自己的抽屉存放私人物品。FreeRTOS的线程本地存储(Thread Local Storage,简称TLS)就是为每个任务(线程…...

VescUart库详解:嵌入式VESC UART通信协议与实时控制实践

1. VescUart库深度解析:面向嵌入式工程师的VESC UART通信全栈指南 1.1 库定位与工程价值 VescUart是一个专为嵌入式平台设计的轻量级UART通信库,核心目标是实现对VESC( Vedder Electronic Speed Controller)电调设备的可靠、低延…...

把 CTS 权限边界讲透,SAP 传输体系里的角色设计、授权对象与最小权限落地

很多团队在做 CTS 安全治理时,真正出问题的地方并不在 STMS 能不能打开,也不在 SE09 能不能看到请求,而是在权限边界画得太粗。开发、运维、项目负责人、Basis 管理员,本来承担的工作就不一样,结果大家都被塞进一套大而全的角色里,最后形成一种很典型的局面,开发能看不该…...

车辆三自由度运动学模型; Carsim_Simulink联合仿真; 无人驾驶车辆模型预测控制(2.1);

车辆三自由度运动学模型; Carsim/Simulink联合仿真; 无人驾驶车辆模型预测控制(2.1); 包括Carsim的设置、控制信号数据、PPT文件、cpar件、车辆运动分析图(适用于word两栏布局);Simu…...

华为OD机试真题 新系统2026-04-08 JavaGo 实现【直捣黄龙】

目录 题目 思路 Code 题目 小王在玩一款叫做直捣黄龙的小游戏,在该游戏中他需要从入口位置进入敌营,绕过哨兵的层层封锁,达到敌军司令部实施斩首行动。 敌军阵营是一个n*n的矩阵,入口在坐标(0,n/2),敌军司令部在坐标(n-1,n/2),每个哨兵警戒以自己为中心的9宫格,一旦被…...

Linux 进程控制(上):创建、终止、等待与程序替换

一. 进程控制概述进程是操作系统中的任务载体,而进程控制则是对其生命周期进行管理的完整机制在之前的博文中,我们已经窥探了进程的属性和地址空间,但进程并不会静止在那里。一个完善的操作系统必须能够解决以下问题:如何高效地克…...

An Introduction to RAID in Linux

1. Overview RAID stands for Redundant Array of Inexpensive/Independent Disks. We build our storage with redundancy — duplication of critical functions — so that no one part can fail and bring down our whole system. Because the data reads and writes are…...

数据结构-双向链表-基础

#include <iostream> #include <stdio.h> #include<stdlib.h>//双向链表存储结构 typedef int ElemType; typedef struct node {ElemType data;struct node* prev, * next; }Node;//初始化 Node* initList() {Node* head (Node*)malloc(sizeof(Node));head-…...

SCM 第二例|三大模型推理性能深度对比:InternLM 效率最高,Qwen 并发增益最强

SCM 第二例|三大模型推理性能深度对比:InternLM 效率最高,Qwen 并发增益最强 引言:从单模型验证到多模型对决 一个月前,我用自研的 叠合一致法(SCM) 完成了首例验证——在 Qwen2.5-7B 上,成功标定出并发增益函数和长度增益系数,实现了 0% 偏差的自洽检验。 但那篇文…...

为什么你的Function Calling在Qwen-3和Claude-4上表现差3倍?2026奇点大会现场压测对比结果首次公开

第一章&#xff1a;2026奇点智能技术大会&#xff1a;大模型FunctionCalling 2026奇点智能技术大会(https://ml-summit.org) Function Calling 已成为大模型与外部系统深度协同的核心范式&#xff0c;2026奇点智能技术大会将其列为关键议题&#xff0c;聚焦于语义理解精度、工…...

RelayModule:嵌入式继电器面向对象驱动库

1. RelayModule 库深度解析&#xff1a;面向嵌入式系统的数字继电器模块面向对象驱动设计继电器是嵌入式系统中实现强电控制与弱电隔离的核心执行器件&#xff0c;广泛应用于工业自动化、智能家居、电源管理及测试设备等场景。传统继电器驱动多采用裸机 GPIO 直接控制&#xff…...

《为什么只有镜像视界能做三维空间智能体?》——空间智能时代的技术门槛与体系壁垒解析

《为什么只有镜像视界能做三维空间智能体&#xff1f;》——空间智能时代的技术门槛与体系壁垒解析发布单位&#xff1a;镜像视界&#xff08;浙江&#xff09;科技有限公司一、引言&#xff1a;这是“能力问题”&#xff0c;不是“努力问题”在当前AI行业中&#xff0c;一个常…...

WiFiPixels:ESP32上轻量级Wi-Fi控制NeoPixel的固件框架

1. 项目概述WiFiPixels 是一个面向嵌入式 LED 控制场景的轻量级网络化固件框架&#xff0c;其核心设计目标是将 NeoPixel&#xff08;WS2812B 类型&#xff09;LED 阵列通过 Wi-Fi 接口暴露为可远程寻址、实时更新的像素资源。项目名称 “NeoPixel Wifi WifiPixels” 并非营销…...

编程基础(python)

由于我们的目标是学习人工智能&#xff0c;我们不需要特别精通这个编程。但掌握一些python必要的语法是十分必要的。我们没有必要只盯着语法&#xff0c;得将重点放在 数据处理 和 逻辑思维 上。毕竟&#xff0c;AI 的底层全是 矩陈运算和数据流转。我们得学会用代码把数学公式…...

从钓鱼邮件到Web后门:一次完整的攻击链流量分析复盘(基于BUUCTF案例)

从钓鱼邮件到Web后门&#xff1a;一次完整的攻击链流量分析实战 当企业内网突然出现异常流量时&#xff0c;安全团队往往需要像侦探一样从海量数据包中拼凑出攻击者的完整行动轨迹。这次我们以BUUCTF案例为蓝本&#xff0c;还原一个真实攻击场景&#xff1a;攻击者如何通过邮件…...