Sega MegaDrive上的Linux

Hacker News Top 工具

摘要

一个项目将Linux移植到Sega MegaDrive游戏机,使用EverDrive卡带,提供了构建和启动指南,以及一个用于模拟的自定义QEMU分支。

<a href="https:&#x2F;&#x2F;hackaday.com&#x2F;2026&#x2F;06&#x2F;29&#x2F;its-linux-on-a-sega-megadrive&#x2F;" rel="nofollow">https:&#x2F;&#x2F;hackaday.com&#x2F;2026&#x2F;06&#x2F;29&#x2F;its-linux-on-a-sega-megadriv...</a>
查看原文
查看缓存全文

缓存时间: 2026/06/30 06:33

LinuxMD/linuxmd

源代码:https://github.com/LinuxMD/linuxmd

linuxmd - 适用于世嘉MegaDrive的Linux

这是个玩笑吗?

我需要什么?

  • 一台世嘉MegaDrive
  • Mega EverDrive Core 或 Pro(Pro版本尚未测试)(参见:https://krikzz.com/our-products/cartridges/)
  • 连接EverDrive和电脑的USB线
  • 花点时间去折腾

这个能在(普通)模拟器上运行吗?

很可能不行,模拟器需要模拟EverDrive特殊的SSF2映射器(为我们提供4MB RAM)、EverDrive的协议(允许MegaDrive从SD卡加载文件)以及EverDrive提供的定时器寄存器。项目中包含一个QEMU分支,它模拟了足够多的MegaDrive和EverDrive功能,让你无需真实硬件就能体验。但请注意,这并不能真正还原真实硬件的感觉,QEMU模拟CPU的速度过快。

构建说明

  • 运行 ./buildtoolchain.sh 构建工具链。这使用了buildroot,但我们并没有用它构建根文件系统。buildroot是获取一份能生成68000可用二进制文件的m68k-linux工具链最省事的方法。
  • 运行 ./builduboot.sh 使用工具链构建u-boot。
  • 运行 ./buildmedtool.sh 构建 medtool,用于与EverDrive串口控制台交互。
  • 运行 ./buildlinux.sh 构建Linux内核镜像。
  • 运行 ./buildrootfs.sh 构建根文件系统erofs镜像。

针对模拟版本

  • 运行 ./buildqemu.sh 构建QEMU
  • 运行 ./runqemu.sh 运行QEMU并启动。

启动说明

  • u-boot/u-boot.binlinux/vmlinux.lz4smolutils/m68k.erofs 复制到你的EverDrive SD卡中
  • 启动MegaDrive电源
  • 将USB线连接到电脑(在MegaDrive关闭时连接可能也可以,但我遇到过问题)
  • 查看你的dmesg,确保EverDrive被检测到。你应该看到类似下面的信息:
    [1135618.045606] usb 3-2: new full-speed USB device number 5 using xhci_hcd
    [1135618.255415] usb 3-2: New USB device found, idVendor=0483, idProduct=5740, bcdDevice= 2.00
    [1135618.255428] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    [1135618.255430] usb 3-2: Product: Mega EverDrive
    [1135618.255432] usb 3-2: Manufacturer: STMicroelectronics
    [1135618.255434] usb 3-2: SerialNumber: 00000000001A
    [1135618.307393] cdc_acm 3-2:1.0: ttyACM0: USB ACM device
    [1135618.307472] usbcore: registered new interface driver cdc_acm
    [1135618.307475] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
    
  • terminal模式下将 medtool 连接到你的EverDrive:
    ./medtool/medtool -p /dev/ttyACM0 -m terminal
    Opened serial port /dev/ttyACM0
    data out, 4 bytes --> 0x2b 0xd4 0x40 0xbf
    <-- data in, 4 bytes 0x5a 0x05 0x25 0x00
    core
    Creating socket and waiting for connection (minicom -D unix#/tmp/medtool)
    
  • 按照提示操作,启动 minicom 并连接到 medtool 的unix socket
  • 在EverDrive菜单中选中 u-boot.bin,按下一个按钮,然后按下 start game(见 everdrive_menu_uboot 图)
  • 稍等片刻,你应该能在minicom中看到u-boot出现:
    Welcome to minicom 2.10
    
    OPTIONS: I18n
    Port unix#/tmp/medtool
    
    [?] Press CTRL-A Z for help on special keys
    
    md ! a b c
    
    U-Boot 2026.01-00675-g9da66c43e96b-dirty (Jun 24 2026 - 20:10:31 +0900)
    
    DRAM:  3.8 MiB
    SR is 0x2700
    copy from 00000000 to 00398000, 0x27f70 bytes (reloc_off 0x00398000)
    copied from 00000000 to 00398000, 0x27f70 bytes (reloc_off 0x00398000)
    clearing new bss from 003bd000 to 003bff70
    Doing relocation
    Relocation point of no return, new SP 0x003368d0, jump to 0x003a0370
    Core:  5 devices, 5 uclasses, devicetree: embed
    Loading Environment from NVRAM... *** Warning - bad CRC, using default environment
    
    In:    serial
    Out:   serial,vidconsole
    Err:   serial
    Hit any key to stop autoboot:  0 
    status; 0xa500
    status; 0xa500
    Loading vmlinux.lz4, 744178 bytes
    status; 0xa500
    Done
    Uncompressed size: 1270696 = 0x1363A8
    ELF overwrites reserved memory: 0x00000000 -> 0x0013ff35: -22
    new fdt 003392a8
    L s K
    Linux version 7.1.0-rc6-00250-g29f5b5b8fc12-dirty (daniel@kinako) (m68k-linux-gcc.br_real (Buildroot -gdb75a8eea0bd) 15.2.0, GNU ld (GNU Binutils) 2.46.0.20260210) #374 Wed Jun 24 22:12:37 JST 2026
    Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne
    Generic DT Machine (C) 2024 Daniel Palmer
    OF: reserved mem: Reserved memory: No reserved-memory node in the DT
    Zone ranges:
      DMA      [mem 0x0000000000000000-0x00000000003fffff]
      Normal   empty
    Movable zone start for each node
    Early memory node ranges
      node   0: [mem 0x0000000000000000-0x00000000003fffff]
    Initmem setup node 0 [mem 0x0000000000000000-0x00000000003fffff]
    Kernel command line: console=ttyVDP0 console=ttyED0 root=/dev/edblk -- smolinit.getty=/dev/ttyED0 smolinit.getty=/dev/ttyVDP0 smolinit.hostname=md
    printk: log buffer data + meta data: 4096 + 8704 = 12800 bytes
    Dentry cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
    Inode-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
    Built 1 zonelists, mobility grouping off.  Total pages: 1024
    mem auto-init: stack:all(zero), heap alloc:off, heap free:off
    SLUB: HWalign=16, Order=0-1, MinObjects=0, CPUs=1, Nodes=1
    NR_IRQS: 32
    clocksource: everdrive-timer: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 29163075000 ns
    printk: console [ttyVDP0] enabled
    printk: console [ttyED0] enabled
    Calibrating delay loop... 0.72 BogoMIPS (lpj=5984)
    pid_max: default: 4096 minimum: 301
    Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
    Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
    VFS: Finished mounting rootfs on nullfs
    everdrive fifo thread started
    Memory: 2532K/4096K available (1002K kernel code, 54K rwdata, 108K rodata, 72K init, 39K bss, 1368K reserved, 0K cma-reserved)
    devtmpfs: initialized
    clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 31854341414376613 ns
    clocksource: Switched to clocksource everdrive-timer
    workingset: timestamp_bits=30 (anon: 26) max_order=10 bucket_order=0
    (anon: 0)
    status 0xa500
    status 0xa500
    status 0xa500
    everdrive-blk everdrive-blk@0: Everdrive blk created for m68k.erofs, size is 90112
    erofs (device edblk): mounted with root inode @ nid 36.
    VFS: Mounted root (erofs filesystem) readonly on device 259:0.
    devtmpfs: mounted
    VFS: Pivoted into new rootfs
    Freeing unused kernel image (initmem) memory: 72K
    This architecture does not have kernel memory protection.
    Run /sbin/init as init process
    smolutils init (Jun 20 2026, 22:01:47)
    cmdline args:
    smolinit.getty=/dev/ttyED0
    Will start getty on TTY /dev/ttyED0
    smolinit.getty=/dev/ttyVDP0
    Will start getty on TTY /dev/ttyVDP0
    smolinit.hostname=md
    Hostname will be md
    environment variables HOME=/ TERM=linux
    mounting filesystems...
    mounted sysfs(sysfs) on /sys
    mounted proc(proc) on /proc
    mounted tmp(tmpfs) on /tmp
    mounted run(tmpfs) on /run
    Starting getty on /dev/ttyED0 with shell /bin/smolsh
    Starting getty on /dev/ttyVDP0 with shell /bin/smolsh
    smolsh / > ls -l
    random: crng init done
    dr-xr-xr-x    2 root     root           447 bin
    drwxr-xr-x    2 root     root             0 dev
    dr-xr-xr-x   61 root     root             0 proc
    drwxr-xr-x    2 root     root             0 run
    dr-x------    2 root     root           112 sbin
    dr-xr-xr-x   11 root     root             0 sys
    drwxr-xr-x    2 root     root             0 tmp
    smolsh / > ps
    USER       PID CMD
    root         1 init
    root         2 kthreadd
    root         3 pool_workqueue_release
    root         4 kworker/R-slub_flushwq
    root         5 kworker/0:0-events
    root         8 kworker/R-mm_percpu_wq
    root         9 everdrive_fifo
    root        10 ksoftirqd/0
    root        11 pr/ttyED0
    root        12 pr/ttyVDP0
    root        13 kworker/0:1
    root        14 kdevtmpfs
    root        15 kworker/R-writeback
    root        16 kworker/R-kblockd
    root        17 kswapd0
    root        18 kworker/u5:0
    root        19 kworker/u4:1-ttyED-ttyED
    root        20 kworker/u4:2-ttyED-ttyED
    root        21 kworker/0:1H-kblockd
    root        24 getty
    root        25 getty
    root        26 smolsh
    root        27 smolsh
    root        29 kworker/u4:3-ttyED-ttyED
    root        30 ps
    root        31 kworker/0:0H
    root        32 kworker/u4:0-ttyED-ttyED
    smolsh / > 
    
    加载和解压内核会花费一些时间。请耐心等待! 注意:目前速度非常慢。我手头的一个12MHz 68000系统都比现在的MegaDrive好用很多。这需要一些优化。与EverDrive FIFO的交互非常慢。

但如果这只是通过串口实现,那有什么意义呢?谁都能做到。

嗯,还有一套利用MegaDrive视频输出的炫酷控制台。它甚至拥有漂亮的滚动效果.. vdpconsole

  • 右上角有一个绿色方框,那是“心跳”指示器,会闪烁以表明内核正在运行。
  • 绿色方框下方还有一个红色方框,那是磁盘活动指示灯。

相似文章

模拟器调试:Area 5150 的 Lake Effect

Lobsters Hottest

本文详细介绍了在MartyPC模拟器上调试Area5150演示中“Lake”效应的过程,解释了需要特定标题hack的原因,以及通过总线嗅探和动态时钟实现周期精确CGA模拟的后续修复方法。

单片软盘上的嵌入式Linux

Hacker News Top

FLOPPINUX 是一个完整的 Linux 发行版,可安装在一张 1.44MB 软盘上,支持 Intel 486DX 和 20MB RAM 等最低配置硬件。启动后进入终端,具有持久化存储和基本工具。