“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。
md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。
要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。
在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。
要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。
工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。
写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。
适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。
你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。
全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
在雅达利 Jaguar 上运行 Linux:深入移植与内核适配
将 Linux 内核移植到 1993 年游戏主机 Atari Jaguar 上的技术实践与挑战记录。
引言
Atari Jaguar 是雅达利公司在 1993 年发布的 64 位游戏主机(实际采用双 32 位 RISC 架构),以当时前卫的硬件设计著称,但商业上未能成功。本文作者成功将 Linux 内核移植到这台主机上,并详细记录了整个适配过程,包括启动流程、内存布局、中断控制器、定时器、GPU 协同以及外设驱动等关键环节。这不仅是对复古硬件的探索,更是一次深入底层操作系统移植的技术实战。
硬件架构概览
Atari Jaguar 的核心硬件由以下组件构成:
- 主 CPU:摩托罗拉 68000(68k)@ 13.295 MHz,用作系统控制器和 I/O 处理器。
- GPU:Tom 芯片(32 位 RISC,主频 26.59 MHz),负责图形渲染和通用计算。
- DSP:Jerry 芯片(32 位 RISC,主频 26.59 MHz),负责音频和信号处理。
- 内存:2 MB 共享 DRAM(由 68k、Tom、Jerry 共同访问),以及 4 KB 内部 SRAM(用于 GPU/DSP 本地快速存储)。
- 视频系统:支持多种分辨率,典型模式为 320×240 或 720×240,调色板 16 位 RGB。
- 外设:两个游戏手柄接口、一个键盘/鼠标串行端口、一个 PCMCIA 卡槽(用于扩展)、一个 A/V 输出端口。
关键点在于:所有处理器共享同一物理内存,且没有 MMU(内存管理单元),因此 Linux 移植必须采用 无 MMU 版本(NOMMU),即 uClinux 分支。
启动流程:从 ROM 到内核
Jaguar 的 BIOS 位于 ROM 中,负责初始化硬件并跳转到卡带(cartridge)入口。作者设计了一种两阶段启动方案:
- Stage 1(ROM 加载器):由 BIOS 加载到内存中,负责设置初始页表(由于无 MMU,实际上是内存映射寄存器配置)、初始化中断向量表、将 Stage 2 从卡带复制到 RAM 并跳转。
- Stage 2(引导加载器):一个精简的 bootloader,负责解压 Linux 内核映像(存放在卡带中,使用 gzip 压缩),设置内核参数(如内存大小、控制台设备),最终跳转到内核入口点。
由于 Jaguar 没有标准块设备,内核映像直接嵌入在卡带的 ROM 或闪存中。卡带通过 16 位数据总线映射到 68k 的地址空间(从 0x80000000 开始)。作者使用了一个自定义的打包工具,将内核、设备树(DTB)和 initramfs 整合成一个二进制 blob。
内核适配核心工作
1. 架构支持(arch/m68k)
Linux 内核已经支持 68000 系列 CPU,但 Jaguar 作为特定平台需要新 board 文件。作者在 arch/m68k/platform/ 下创建了 jaguar/ 目录,包含:
- setup.c:硬件初始化,包括时钟源配置、中断控制器初始化、控制台早期输出(通过 Jerry 芯片的 UART)。
- irq.c:中断控制器驱动。Jaguar 使用 Tom 芯片内部的中断控制逻辑,支持 32 个中断源(垂直同步、GPU 完成、DSP 完成、定时器、串口等)。作者实现了标准的中断处理流程:读取中断状态寄存器(0xF00000 区域),通过链式处理分发。
- time.c:定时器驱动。使用 Tom 芯片内置的 16 位定时器(可编程分频),作为内核的时钟源(tick)。由于缺少高精度定时器,作者使用了简单的循环计数法实现延迟函数(udelay)。
- memory.c:内存布局定义。物理内存起始地址为 0x00000000,大小为 2 MB。由于无 MMU,内核必须直接使用物理地址,且所有进程共享同一地址空间(NOMMU 特性)。作者将内核代码放在低地址(0x00040000 开始),initramfs 放在高地址(0x00180000 附近)。
2. 无 MMU 挑战
Jaguar 没有 MMU,这意味着:
- 无法使用虚拟内存,所有进程必须运行在同一个物理地址空间内。
- 内核和用户程序之间没有硬件保护,用户程序可以随意访问内核内存(但通常不会)。
- 必须使用 uClinux 的 flat 可执行格式(FLAT),而不是 ELF。
- 内存分配使用
kmalloc和伙伴系统,但需要避免碎片化,因为 2 MB 空间非常有限。
作者配置内核时选择了 CONFIG_NOMMU=y,并启用了 CONFIG_FLATMEM(平坦内存模型)。由于内存太小,swap 是不现实的。
3. 设备驱动
- 串口控制台:使用 Jerry 芯片的 UART(地址 0xF00000 区域),波特率 9600(可配置)。早期打印通过
early_console_write实现,用于内核引导调试。 - 帧缓冲驱动:Tom 芯片的视频输出。作者编写了简单的 framebuffer 驱动,支持 320×240 分辨率、16 位 RGB 模式。通过设置 Tom 的显示寄存器(如行长度、同步信号),将内核的
fbdev接口映射到帧缓冲内存(位于 0x00200000 附近)。这样可以在屏幕上显示终端输出(如 penguin logo)。 - 输入驱动:手柄和键盘通过 Jerry 的 I/O 端口读取。作者实现了基本的按键扫描,将手柄方向映射为键盘按键(例如方向键对应箭头键),以便在 shell 中使用。
- PCMCIA 存储:Jaguar 的 PCMCIA 卡槽支持 CompactFlash 卡。作者使用了 Linux 内核的 PCMCIA 子系统(
pcmcia_core),通过 I/O 端口(0x00600000 区域)进行访问。这使得系统可以从 CF 卡挂载根文件系统,而不必完全依赖 initramfs。
4. 根文件系统
由于内存只有 2 MB,传统的根文件系统太大。作者使用了 initramfs(嵌入内核映像中),包含 BusyBox、必要的设备节点(/dev/ttyS0、/dev/fb0 等)以及一个简单的 shell。initramfs 使用 cpio 归档,压缩后大小约 500 KB。
对于 CF 卡方案,根文件系统可以是 ext2 或 JFFS2(用于闪存)。作者测试了 ext2,但需要在内核中启用 CONFIG_EXT2_FS。
编译与部署
作者使用交叉编译器 m68k-linux-gnu-gcc(GCC 12.2)和 Linux 内核 6.1 LTS。编译命令大致如下:
bash
make ARCH=m68k CROSS_COMPILE=m68k-linux-gnu- jaguar_defconfig
make ARCH=m68k CROSS_COMPILE=m68k-linux-gnu- -j4
生成的内核映像(vmlinux)通过 objcopy 转换为二进制格式,然后与引导加载器、initramfs 合并。最终通过 Atari Jaguar 的卡带烧录工具(如 jagburn)写入闪存卡带。
运行效果与限制
成功启动后,系统显示一个简单的 shell(通过串口或屏幕)。可以执行基本的 BusyBox 命令(ls、cat、echo 等)。由于没有 MMU,不能运行标准 Linux 的复杂应用程序(如 Python、GCC),但可以运行静态编译的 C 程序(FLAT 格式)。
主要限制:
- 性能:68k 主频仅 13 MHz,加上共享内存总线竞争,整体性能相当于早期 386 处理器。
- 内存:2 MB 对于 Linux 来说极其紧张,内核占用约 800 KB,initramfs 占用 500 KB,剩下不到 700 KB 可用。
- 无网络:Jaguar 没有内置网络硬件,无法连接互联网。
- 无图形加速:Tom 芯片的 3D 功能未被利用,仅作简单帧缓冲。
总结与意义
将 Linux 移植到 Atari Jaguar 不仅是一次怀旧项目,更是一次对嵌入式 Linux 底层原理的实践。它展示了在资源极度受限、无 MMU、非标准外设的平台上,如何通过修改内核架构代码、编写板级支持包、适配无 MMU 内存管理,让一个现代操作系统在 30 年前的硬件上运行。对于操作系统爱好者、嵌入式开发者以及复古计算玩家,这都是一个极佳的技术案例。