Sega MegaDrive上的Linux
摘要
一个项目将Linux移植到Sega MegaDrive游戏机,使用EverDrive卡带,提供了构建和启动指南,以及一个用于模拟的自定义QEMU分支。
查看缓存全文
缓存时间: 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.bin、linux/vmlinux.lz4、smolutils/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出现:
加载和解压内核会花费一些时间。请耐心等待! 注意:目前速度非常慢。我手头的一个12MHz 68000系统都比现在的MegaDrive好用很多。这需要一些优化。与EverDrive FIFO的交互非常慢。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 / >
但如果这只是通过串口实现,那有什么意义呢?谁都能做到。
嗯,还有一套利用MegaDrive视频输出的炫酷控制台。它甚至拥有漂亮的滚动效果.. vdpconsole
- 右上角有一个绿色方框,那是“心跳”指示器,会闪烁以表明内核正在运行。
- 绿色方框下方还有一个红色方框,那是磁盘活动指示灯。
相似文章
打造一个串行和VGA的“万能控制台”
一个DIY项目,利用二手IBM 1U机架式控制台和终端模拟器构建便携式串行和VGA控制台,面向复古电脑爱好者。
Loading Sega Games Off a Vinyl Record [video]
作者成功将世嘉Genesis游戏数据编码为音频,通过黑胶唱片播放,经Raspberry Pi Pico解码后加载到主机运行,完成概念验证。
模拟器调试:Area 5150 的 Lake Effect
本文详细介绍了在MartyPC模拟器上调试Area5150演示中“Lake”效应的过程,解释了需要特定标题hack的原因,以及通过总线嗅探和动态时钟实现周期精确CGA模拟的后续修复方法。
ps5-linux-loader:利用 Hypervisor 漏洞运行自定义引导加载程序的 Linux 载荷
ps5-linux-loader 是一种 Linux 载荷,它利用 PS5 Phat 和 Slim 主机(固件 3.00-7.61)上的 Hypervisor 漏洞运行自定义引导加载程序,从而启用完整的 Linux 桌面使用,支持 GPU 加速、USB、蓝牙和 M.2 SSD。
单片软盘上的嵌入式Linux
FLOPPINUX 是一个完整的 Linux 发行版,可安装在一张 1.44MB 软盘上,支持 Intel 486DX 和 20MB RAM 等最低配置硬件。启动后进入终端,具有持久化存储和基本工具。