2000 行代码在 RISC-V 模拟器上跑 Linux

How to bring up the Linux Kernel on a new platform

2000 行代码在 RISC-V 模拟器上跑 Linux

大多数嵌入式系统依赖 Linux,但面对定制硬件时,我们仍需亲手完成内核的启动工作。这次我并未使用实体 PCB,而是用约 2000 行 C++ 代码构建了一个极简的 RISC-V 模拟器。我实现了 RV32IMA 指令集、简单的 RAM 外设、基于 WD8250 的 UART 以及 SBI 定时器接口。接着,我利用 crosstool-ng 编译了针对 riscv32-unknown-linux-gnu 的交叉工具链,并配置编译了 Linux Kernel。最后,通过编写一个简单的 init 程序、构建 initramfs 以及定义 Device Tree,成功让 Linux 在这个纯软件模拟的环境中运行起来。整个过程展示了从零开始搭建 Linux 运行环境的核心要素。

尽管 Linux 是非常复杂的软件,但它运行所需的硬件条件其实并不多。
  1. Neywiny

    我在 QEMU 上给 cortex-m 做过类似的(意味着我也写了芯片和周边设备的模拟代码,包括定时器、UART、带 DMA 的 SD 控制器以及 RCC)。不过我用了 buildroot。用它来追踪所有东西要容易得多,而且上手非常简单(不像 yocto)。我推荐大家看看 buildroot。

    运行 Linux 其实并不需要 MMU。它只是有助于兼容性。

    干得漂亮。

  2. csdreamer7

    精彩的帖子。你的文件格式逆向工程(RE)内容看起来也该加入阅读清单了:https://werwolv.net/posts/file_format_reverse_engineering/

  3. elevation

    太棒了,能在浏览器里跑起来真有意思!有个问题:为什么不在配置上精简一点?USB、SOUND、VGA 等等都在拖慢启动速度,但并没有对应的硬件可供控制。

同日更多故事

2026-09-07