MIT 6.S081 操作系统课程:从 xv6 到 RISC-V 的硬核实践指南

MIT 6.S081 不是又一个付费买断的“黑马项目”,而是 MIT 开源了多年的操作系统课程。标题里的“2.1 人工智能_操作系统”可以理解成 AI 学习路线中补操作系统的关键一环。2020 版本把教学内核 xv6 迁移到了 RISC-V 架构,课程视频、实验代码、lab 文档全部公开,难度在线,风格硬核,适合想搞懂进程、虚拟内存、文件系统和并发控制的开发者。

这篇文章不讲空话,直接给你一条可执行的学习路径:课程能让你获得什么、环境怎么搭、lab 怎么跑通、系统调用接口怎么用、遇到问题怎么查。目标读者是已经会 C 语言和基础数据结构、想深入了解 AI 框架底层的人,以及准备操作系统面试的候选人。

1. 核心能力速览

能力项说明
课程类型操作系统工程实践课,MIT 公开课程
教学内核xv6,一个用于教学的类 Unix 内核
目标架构RISC-V 64 位(2020 版本)
主要功能系统调用、进程管理、页表、陷阱处理、写时复制、用户线程、网卡驱动
实验形式在 xv6 源码上添加功能,运行测试用例
工具链RISC-V 交叉编译工具链、QEMU、GDB
验证方式make grade自动评分,按 lab 逐项检查
学习成本需要 C 语言基础、数据结构基础、一点汇编知识
硬件门槛普通 x86 主机即可,不依赖 GPU,内存 4G 以上够用
适合场景AI 工程师补底层基础、面试系统设计、操作系统课程自学

注意:MIT 6.S081 的 2020 版本对应实验仓库通常是xv6-labs-2020,具体以课程官网给出的链接为准。课程配套的 xv6 book 和实验文档都能在线获取,涉及提交评分时请务必遵守 MIT 学术诚信政策,不要直接传播或抄袭别人的 lab 答案。

2. 适用场景与使用边界

很多搞 AI 的人一开始会觉得操作系统离自己很远。实际不成立。PyTorch 的 DataLoader 要起多线程,CUDA context 要映射显存,模型推理要管理内存池,分布式训练要处理进程通信,这些能力最终都建立在操作系统提供的机制上。学过 6.S081 之后,再看框架源码里的mmap、pthread、page cache、OOM killer,不会再觉得是黑盒。

这门课最适合以下人群:

  • 想深入系统底层的 AI 工程师,尤其是推理引擎、算子库、高性能计算方向。
  • 后端开发,需要理解线程、锁、IO 多路复用、内存分配。
  • 准备校招或社招操作系统面的候选人,课程 lab 能提供真实动手经验。
  • 对 Unix 内核有兴趣但不满足于“八股文”式的概念,想直接改内核代码的开发者。

边界也要说清楚。xv6 是教学内核,不是生产系统,很多功能被刻意简化:文件系统没有日志恢复,进程调度用轮转,内存管理不支持多级页表缓存,网络协议栈只覆盖基础场景。它不适合作为生产工具,也不需要追求性能,目标是让你看懂核心机制。课程对 C 语言要求并不低,指针、结构体、内存布局必须熟练,否则会在pgtbl和trap环节卡很久。如果你只打算背题找答案,那这门课不适合,因为每个 lab 都要亲手写代码并用测试验证。

合规边界同样要注意。课程实验代码和文档是 MIT 公开教育资源,可以学习,但一些学校会通过在线判题系统比对代码,直接复制他人的 lab 答案会触发学术诚信问题。涉及源码分发时,保留 MIT 许可证声明即可。不要把课程内容用于任何逆向工程或规避安全机制的目的。

3. 环境准备与前置条件

MIT 6.S081 的教学环境基于 RISC-V 交叉编译。建议在 Linux 上进行,Ubuntu、Debian、Arch 都行,Windows 用户先开 WSL2 或虚拟机。macOS 也可以,但工具链安装略麻烦,不推荐新手上来就在 macOS 折腾。

需要准备以下组件:

  • 操作系统:Linux(本文示例以 Ubuntu/Debian 为主)。
  • C 工具链:make、gcc、git。
  • RISC-V 交叉编译器:riscv64-unknown-elf-gcc。
  • QEMU:qemu-system-misc或qemu-system-riscv64,用于模拟 RISC-V 机器。
  • GDB 多架构版本:gdb-multiarch,用于调试 xv6 内核。
  • 磁盘空间:源码不超过 100MB,编译器约 1GB,整体非常轻量。

在 Debian/Ubuntu 上,执行下面的命令安装基础依赖。不同发行版的包名可能不同,如果包不存在,用apt search确认:

sudo apt update sudo apt install build-essential git make gcc gdb-multiarch sudo apt install qemu-system-misc sudo apt install gcc-riscv64-unknown-elf

工具链安装完后,检查版本:

riscv64-unknown-elf-gcc --version qemu-system-riscv64 --version gdb-multiarch --version

如果某个命令提示找不到,就去对应发行版仓库搜包名。网络受限时,可以改用 xpack 提供的预编译 RISC-V 工具链,解压后把bin目录加入PATH。不推荐自己从源码编译工具链,耗时且容易出错。

4. 安装部署与代码启动

MIT 6.S081 的实验代码存放在课程仓库中,2020 版本常见名称是xv6-labs-2020。从课程站点或镜像获取后,进入目录即可编译运行。

git clone <课程官网提供的 xv6-labs-2020 仓库地址> cd xv6-labs-2020 make

这里没有直接写死仓库 URL,因为库可能随年份调整,请以课程页面最新说明为准。克隆完成后,目录结构大致是:

  • kernel/:内核源码,包含进程、页表、陷阱、文件系统、网卡驱动等。
  • user/:用户态程序源码。
  • Makefile:构建和运行入口。
  • xv6-book相关文档:可另行下载阅读。

编译成功后,启动 qemu 模拟器,进入 xv6 的 shell:

make qemu

看到带$的提示符就是进入系统了。此时可以运行 xv6 自带的命令,比如ls、echo、cat。退出 qemu 的方法是先按Ctrl+A,再按X,不是直接Ctrl+C。如果按Ctrl+C只会在 xv6 shell 里产生中断信号,不会退出模拟器。

跑成绩验证某个 lab 时,使用:

make grade

这个命令会启动多个测试用例,并输出每个测试点是否通过。注意make grade的结果依赖你当前分支对应的 lab 完成状态,官方仓库的初始main分支通常是没有实现实验功能的,需要按 lab 文档切到对应分支或手动修改代码。

5. 课程内容与实验功能验证

这是整门课的核心。2020 版本包含多个 lab,每个 lab 围绕一个操作系统主题,配一套测试用例。下面按常见顺序拆解。

5.1 Lab utilities:系统调用与进程控制

这个 lab 用来热身。你需要写用户态程序,完成sleep、pingpong、primes、xargs等工具。目标是熟悉 xv6 的编程环境、系统调用接口和 shell 的行为。

测试方式很直接:添加代码后运行make grade,检查输出是否符合预期。例如pingpong要用 pipe 在父进程和子进程之间传递一个字节,并交替打印ping和pong。如果输出顺序乱了,大概率是管道读写时机或缓冲区刷新没处理对。primes实际上是一个并发素数筛,用多个进程级联筛选,适合感受 fork 和 pipe 配合。

判断成功的标准:所有用例通过,测试输出没有多余字符,退出码为 0。常见失败原因是忘了wait等待子进程,或者写入管道后没关闭不需要的 fd,导致读端一直阻塞。

5.2 Lab syscall:新增系统调用

这个 lab 让你实现两个新系统调用:trace和sysinfo。trace可以跟踪指定进程的系统调用并打印调用号;sysinfo返回空闲内存和进程数量。

这里要理解一个用户程序调用系统调用时的完整路径:用户态通过user.h拿到函数声明,usys.pl生成陷入代码,进入内核后由syscall.c分发到具体的sys_xxx实现。改动的文件包括:

kernel/syscall.h kernel/syscall.c kernel/proc.c kernel/sysproc.c user/user.h user/usys.pl

实现trace需要在struct proc里加一个 mask 字段,在fork时复制给子进程,在syscall分发函数里做打印。常见问题是忘了在syscall.c里注册名字,或者返回值写错导致测试拿不到预期输出。

5.3 Lab pgtbl:页表与虚拟内存

页表是 xv6 里最值得啃的部分。这个 lab 包含vmprint和sysinfo页表映射两个任务。

vmprint用来打印一个进程的页表结构,帮助可视化三级页表布局。你会看到类似这样的层级输出,但你得自己写遍历逻辑:

page table 0x0000000087f6b000 .. 0x0: pte 0x0000000021fda801 pa 0x0000000087f6a000 .. .. 0x0: pte 0x0000000021fda401 pa 0x0000000087f69000

sysinfo要求把内核态统计信息映射到用户空间,核心是理解walk函数和一个虚拟地址如何翻译成物理页。做这个 lab 前,建议先把 xv6 book 的第三章“Page tables”读两遍,否则你会被PTE_V、PTE_R、PTE_W绕晕。

常见失败:遍历页表时没有按PTE_V判断条目有效,或者漏掉了叶子节点和内部节点的打印格式。排查思路用 GDB 打印页表基址,配合vmprint输出对比。

5.4 Lab traps:陷阱与异常处理

这个 lab 和 CPU 的 trap 机制强相关。任务包括实现用户态backtrace和定时器alarm。

backtrace需要在用户态栈帧上遍历返回地址,涉及 frame pointer 的获取和栈边界判断。alarm要求内核在定时器中断时回调用户函数,注意保存用户态寄存器,不能破坏正在执行的用户程序状态。

测试时,建议在trap.c中打印寄存器值来理解陷入现场。这个 lab 最能锻炼汇编和内存布局能力。常见坑是切换中断上下文时没保存a0,导致用户回调参数丢失;或者栈指针越界,造成内核 panic。

5.5 Lab cow:写时复制 fork

写时复制的目标是避免 fork 时复制全部用户内存。实现方案是:fork 只复制页表,但把父子进程的 PTE 标记为只读,共享物理页;遇到写异常时,在内核 trap 处理中分配新页并更新对应 PTE。

这个 lab 需要同时修改vm.c、kalloc.c、trap.c。你需要维护每个物理页的引用计数,确保只有在最后一个引用释放时才回收页。测试会检查内存分配的次数,以及父子进程是否都能正确写入。

最常出现的错误有两个:一是缺页处理时没有正确判断是写 COW 页还是其他 fault;二是引用计数更新不及时,导致同一物理页被释放两次。调试时可以先用 GDB 在usertrap里打断点,观察scause的值。

5.6 Lab thread:用户态线程

这个 lab 让你在用户态实现一个线程库:thread_create、thread_join和thread_exit。核心是切换线程栈,保存和恢复上下文。

实现思路是用ucontext或者自己保存寄存器上下文。关键在于每个线程要有独立栈,线程切换时不能覆盖调用者的局部变量。测试程序会创建多个线程并累加全局计数器,但如果临界区没加锁,结果会受影响。课程源码里没有提供锁机制,你只需要保证切换正确。

这个 lab 是理解并发和竞争条件的好入口。失败通常表现为线程执行顺序错乱,或者访问了非法内存。建议先用单个线程跑通,再加多线程压测。

5.7 Lab net:网卡驱动

这是 2020 版本中偏后的 lab,和 E1000 网卡驱动相关,涉及 DMA、发送接收队列、中断处理。难度比前面的 lab 高不少,不是所有人都需要做,但如果目标是搞懂现代网络 IO,建议挑战一下。

你会实现e1000_transmit和e1000_recv,需要读写寄存器、维护描述符环、处理 TSO 相关逻辑。测试会在 xv6 里跑一个简单 HTTP 服务,然后用外部环境验证。这个阶段排错比较困难,建议把读写寄存器的宏先封装好,逐个字段核对描述符的状态位。

6. 系统调用 API 与用户程序接口示例

操作系统课程里的 API 不是 Web 接口,而是系统调用。xv6 提供了一组精简的系统调用,相当于课程要求掌握的最小接口集合:

系统调用功能说明
fork()创建子进程
exec()加载并执行新程序
exit()退出当前进程
wait()等待子进程退出
open()打开文件
read()读文件或设备
write()写文件或设备
close()关闭文件描述符
pipe()创建管道
kill()给进程发信号
sbrk()调整进程堆大小

这些接口并不是你自己实现的,而是课程内核已经提供的。Lab syscall 的目标是新增接口,比如trace(int mask)和sysinfo(struct sysinfo *info)。

如果你后续想在自己的硬件或虚拟环境里用 xv6 跑程序,可以写这样的用户态 C 代码:

#include "kernel/types.h" #include "user/user.h" int main(void) { int p[2]; if (pipe(p) < 0) { printf("pipe error\n"); exit(1); } int pid = fork(); if (pid < 0) { printf("fork error\n"); exit(1); } if (pid == 0) { // child process close(p[0]); write(p[1], "ping", 4); close(p[1]); exit(0); } else { // parent process close(p[1]); char buf[4]; read(p[0], buf, 4); printf("%s\n", buf); close(p[0]); wait(0); exit(0); } }

编译和运行要放在 xv6 环境里,可以用user/目录下的 Makefile 规则生成可执行文件,再通过make qemu启动系统执行。

如果要做自定义系统调用,一般流程是:

  1. 在kernel/syscall.h中增加新的系统调用号。
  2. 在kernel/syscall.c中把调用号映射到处理函数。
  3. 在kernel/sysproc.c或对应文件中实现sys_xxx。
  4. 在user/user.h声明用户态函数。
  5. 在user/usys.pl添加一行汇编跳转,生成陷入指令。
  6. 重新编译并测试。

这个流程不复杂,但每个环节都影响编译结果。漏掉usys.pl的话,用户态程序会链接不上。

7. 资源占用与性能观察

课程本身不涉及 GPU,所以显存占用可以忽略。环境资源消耗主要体现在编译和 QEMU 模拟上。QEMU 启动 xv6 后,会有一个qemu-system-riscv64进程,CPU 占用在空闲时很低,内存占用一般在几十到几百 MB 之间。这是因为 xv6 本身只有几 MB 内核镜像,用户程序也很小。

观察资源占用可以直接用系统工具:

top -p $(pgrep -f qemu-system-riscv64)

或者:

ps aux | grep qemu

如果编译时出现内存不足或卡顿,多半是同时打开了多个 QEMU 实例,或者是交叉编译工具链版本不匹配。编译 xv6 是很快的,源码量很小,不需要高配机器。真正影响体验的是前端代码调试时的 GDB 连接,以及跑make grade时连续启动多个 QEMU 实例造成的短暂负载。

在使用make qemu时,xv6 默认分配的内存由 Makefile 控制。如果自定义运行参数,比如加-m 512M给 QEMU 更多内存,需要改 Makefile 或启动脚本。不建议一开始就调大内存,因为实验场景用不到。

调试时还会涉及端口占用。QEMU 默认不监听外部端口,但在 GDB 调试场景中,需要在启动 QEMU 时指定-gdb或-S参数。如果碰到端口被占用,可以用ss -tlnp检查监听端口,然后换一个空闲端口。课程文档里的make qemu-gdb目标会启动一个 GDB 服务器,通常使用 26000 端口,如果被占用可以手动改 Makefile。

8. 常见问题与排查方法

问题现象可能原因排查方式解决方案
make报 riscv64-unknown-elf-gcc 找不到交叉编译工具链未安装或不在 PATH执行riscv64-unknown-elf-gcc --version安装工具链,或把工具链 bin 目录加入 PATH
make qemu报 qemu-system-riscv64 找不到QEMU 未安装或版本太旧运行qemu-system-riscv64 --version安装qemu-system-misc或qemu-system-riscv64
进入 xv6 shell 后命令不响应可能是 QEMU 被Ctrl+C中断检查终端是否还连接到 qemu先退出 QEMU,再重新make qemu
退出 QEMU 只能强制关闭终端不知道怎么正确退出查看课程文档或按Ctrl+A X用组合键退出,不要在 qemu 里反复按Ctrl+C
make grade某些用例报错对应 lab 功能没实现或实现有 bug单独运行失败用例,查看具体输出对照实验文档补全代码,检查返回值
GDB 连不上目标机QEMU 的 gdb 端口未开启或端口被占用检查启动参数,查看端口用make qemu-gdb或在 Makefile 中指定端口
内核 panic 或打印 trap 信息指针越界、页表映射错误、中断上下文破坏用 GDB 打断点,查看 backtrace定位到具体源码行,调整内存访问
pipe 相关测试卡住存在未关闭的 fd,管道读端阻塞检查 fork 后哪些 fd 需要关闭在子进程和父进程中正确close多余 fd
fork 后内存占用异常高COW 未实现,导致每个进程都复制内存用make grade的分配计数测试确认做 lab cow,实现写时复制和引用计数
编译时出现重复符号链接错误在多个文件重复定义了全局变量检查源码里的全局声明,用nm查看符号只在kernel/defs.h声明外部变量,在单文件定义

这些是课程学习中的高频问题,遇到时先看错误输出最后面几行,再结合 QEMU 日志定位。不要一上来改代码,先确认环境正常。

9. 最佳实践与学习建议

6.S081 不适合“看完视频就算学完”的人。它有大量的动手任务,每完成一个 lab,你都会对操作系统的一部分真正建立起体感。下面给一套可执行的学习方式。

第一,第一次跑通环境是关键点。不要一上来做 lab,先把官方仓库 clone 下来,运行make qemu,在 xv6 shell 里执行ls、cat README。这个循环跑通之后,再开始做题。

第二,严格按照 lab 顺序推进。2020 版本 lab 的难度是渐进的:先从用户态工具开始,再进入系统调用,然后是页表、陷阱、COW,最后到线程和网络。跳过前置 lab 直接做后面的,你会发现很多概念无法落地。

第三,善用 Git。每个 lab 开始前新建分支,完成一个功能后提交一次。课程仓库经常需要切换分支来评测,如果不使用 Git,改动很容易混在一起。推荐的分支交换机命令格式:

git checkout -b lab-name git commit -m "lab-name initial"

第四,遇到 panic 不要慌。xv6 的断言和 trap 输出已经给出了大量信息。学习如何用 GDB 打断点比反复加 print 更高效。在 QEMU 启动参数中加-S -gdb tcp::26000,然后用gdb-multiarch连接:

gdb-multiarch kernel/kernel target remote :26000 break sys_write continue

第五,建立自己的实验笔记。每次测试失败,把 QEMU 输出复制到笔记里,记录失败原因和修复方法。这个习惯对准备面试和后续学习非常有价值。

第六,不要抄别人的 lab 答案。课程设计非常成熟,测试用例不会因为答案格式固定而放水。自己写代码,卡住的时候看 xv6 book 或源码注释,查阅kernel/proc.c、kernel/vm.c,比直接看答案收获大得多。

第七,把 AI 方向的知识和操作系统连接起来。学完页表和 COW 后,可以对照 PyTorch 的page_size和 CUDA 统一内存原理;学完线程后,再看pthread_create的实现,理解线程栈和寄存器上下文。做这个连接远比单纯刷 lab 更有价值。

10. 总结与下一步

MIT 6.S081 值得认真啃一遍,尤其是对 AI 底层感兴趣的人。最值得尝试的点不是看完视频,而是亲手把fork的系统调用流程跑通,把页表打印出来,再把写时复制做出来。这三个阶段分别对应进程、内存、并发,三个操作系统最硬的主题。

最先应该验证的功能是 Lab utilities,因为它可以快速建立“写代码进入内核”的正向反馈。最容易踩的坑是环境工具链缺失,以及不熟悉 GDB 调试导致排错效率低。

接下来可以根据自己的方向继续扩展:读完 xv6 book 的剩余章节,把 lab net 做完;或者去阅读 Linux 的进程管理和内存管理源码,对照 xv6 的简化实现找差异。如果你在 AI 推理引擎方向工作,可以进一步研究 CUDA 的虚拟内存管理和 GPU 驱动里的页表设计。

这门课不用花钱,不需要高端显卡,一台普通 Linux 主机足够。把它排在 AI 学习路线“2.1 操作系统”这个位置,是值得的。建议直接打开课程主页,开始第一节课。

相关新闻

正交设计助手ODA安装配置与避坑指南

正交设计助手ODA安装配置与避坑指南

简介&#xff1a;正交设计助手破解版是一款面向实验设计人员、科研工作者及高校理工科师生的专业工具软件&#xff0c;专为高效构建混合正交试验表而优化&#xff0c;显著降低多因素多水平试验方案设计的复杂度与试错成本。资源包共10个文件&#xff0c;含2个核心可执行程序&am…

2026/10/20 8:04:23 阅读更多 →
RAG过度检索问题解析:根源、症状与工程优化实践

RAG过度检索问题解析:根源、症状与工程优化实践

做RAG的人&#xff0c;大概率都遇到过这类场景&#xff1a;明明知识库里有标准答案&#xff0c;模型却把一堆不相关的说明也端了上来&#xff0c;回答变得又长又绕&#xff0c;甚至把错误信息当成依据。我把这类现象统称为“过度检索”——检索模块召回了一大堆内容&#xff0c…

2026/10/20 8:04:23 阅读更多 →
Hermes Agent:会成长的AI智能体,记忆与经验沉淀机制全解析

Hermes Agent:会成长的AI智能体,记忆与经验沉淀机制全解析

这几年开源圈子里冒出来不少号称“会用工具”的智能体&#xff0c;但很多项目用下来也就图一乐&#xff0c;问复杂点的问题就开始胡言乱语。直到我上手了这个叫Hermes Agent的项目&#xff0c;才真正体会到什么叫“越用越顺手、越用越聪明”。它不像传统助手每次对话都从零开始…

2026/10/20 8:04:23 阅读更多 →

最新新闻

银行模拟程序:数据结构选型与离散事件仿真实战

银行模拟程序:数据结构选型与离散事件仿真实战

1. 项目概述&#xff1a;为什么一个银行模拟程序能成为数据结构教学的“试金石”“数据结构-银行模拟程序”这个标题乍看平平无奇&#xff0c;但在我带过的十几届学生项目实践中&#xff0c;它几乎稳居“最能暴露基础漏洞”的榜首。不是因为它有多复杂&#xff0c;恰恰相反——…

2026/10/20 8:55:28 阅读更多 →
AI推理加速器设计实战:从算子映射到INT8量化落地全解析

AI推理加速器设计实战:从算子映射到INT8量化落地全解析

做硬件加速这几年来&#xff0c;被问得最多的一个问题就是&#xff1a;既然 CPU 和 GPU 都能跑模型&#xff0c;为什么还要自己折腾 AI 推理加速器&#xff1f;一开始我也觉得这是个伪需求&#xff0c;直到真在边缘侧设备上部署过几个模型才明白——通用处理器要么算力不够&…

2026/10/20 8:55:28 阅读更多 →
前后端分离AI客服系统:会话缓存优先的多级查询策略与DeepSeek流式接入

前后端分离AI客服系统:会话缓存优先的多级查询策略与DeepSeek流式接入

简介&#xff1a;这份资源是一套基于SpringBoot与Vue.js前后端分离架构的AI智能客服系统完整源码&#xff0c;面向具备Java与前端基础的开发者、课程设计或毕业设计人群&#xff0c;解决自然语言对话与高并发响应场景下的系统搭建问题。压缩包共63个文件、约23.76MB&#xff0c…

2026/10/20 8:55:28 阅读更多 →
用workbuddy把官方AI教程改造成能讲的课:实操与避坑

用workbuddy把官方AI教程改造成能讲的课:实操与避坑

2. 官方教程的"三座大山"&#xff1a;为什么直接啃原版很难受在讲我怎么用workbuddy之前&#xff0c;先聊聊我起初面对官方AI认证教程的真实感受。很多朋友拿到官方文档的第一反应是"权威、全面、跟着学就行了"&#xff0c;但实际翻上两章就会发现&#xf…

2026/10/20 8:55:28 阅读更多 →
OpenClaw从零部署指南:环境准备到安全加固运维

OpenClaw从零部署指南:环境准备到安全加固运维

OpenClaw这个开源项目&#xff0c;在个人自动化与任务调度圈子里热度一直在线。它把任务编排、插件管理、多终端数据同步整合成一个轻量级服务&#xff0c;安装边界清晰&#xff0c;部署完就能感受到它的调度与插件生态比裸写脚本省心太多。但很多朋友卡在第一步&#xff1a;不…

2026/10/20 8:55:28 阅读更多 →
Agentic RAG 实战指南:从直线管道到多步决策闭环

Agentic RAG 实战指南:从直线管道到多步决策闭环

1. 检索管道的天花板&#xff1a;一次查询解决不了连锁问题做了一段时间 RAG 应用的人&#xff0c;多半都会遇到同一个尴尬时刻&#xff1a;知识库文档放得挺全&#xff0c;向量检索的召回率调得也不算差&#xff0c;但面对稍微复杂一点的问题&#xff0c;系统就开始"答非…

2026/10/20 8:54:27 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/18 12:16:16 阅读更多 →