“写笔记”支持四种格式——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)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
在浏览器中启动Linux内核:JSLinux深度技术笔记
一句话概括:JSLinux通过纯JavaScript模拟CPU和外设,在浏览器中运行完整Linux系统,无需服务器或插件。
背景:从QEMU到浏览器
Fabrice Bellard是传奇程序员,他创造了QEMU(快速模拟器)、FFmpeg(音视频编解码库)和TinyCC(微型C编译器)。2011年,他发布了JSLinux——一个完全用JavaScript编写的x86 PC模拟器,能够在浏览器中启动Linux内核。这个项目震惊了开发者社区:无需任何插件、无需服务器端计算,只靠浏览器就能运行完整的操作系统。
JSLinux的核心不是简单的JavaScript,而是利用了一系列底层技术:
- Typed Arrays:处理二进制数据,模拟内存和寄存器。
- asm.js(一个JavaScript子集):将C语言编写的CPU模拟器(如QEMU)编译成高性能的JavaScript字节码。
- WebSockets:实现网络通信,允许虚拟网卡与外部世界交互。
- Canvas 2D:渲染图形界面(屏幕和键盘输入)。
模拟的系统和硬件配置
JSLinux提供了多种模拟配置,每个配置对应不同的CPU和操作系统:
| 模拟CPU | OS | 界面 | 启动方式 | 重点特性 |
|---|---|---|---|---|
| x86_64 | Alpine Linux 3.23.2 | 控制台 | 点击链接 | AVX-512和APX扩展支持 |
| x86 | Alpine Linux 3.12.0 | 控制台 | 点击链接 | 经典版本 |
| x86 | Alpine Linux 3.12.0 | X Window(图形) | 点击链接 | 支持鼠标菜单 |
| x86 | Windows 2000 | 图形(无网络) | 点击链接 | 历史展示,需注意法律声明 |
| x86 | FreeDOS | VGA文本 | 点击链接 | 经典DOS环境 |
| riscv64 | Buildroot (Linux) | 控制台 | 点击链接 | RISC-V指令集模拟 |
| riscv64 | Buildroot (Linux) | X Window | 点击链接 | 同上 |
| riscv64 | Fedora 33 (Linux) | 控制台 | 点击链接 | 启动较慢,功能完整 |
| riscv64 | Fedora 33 (Linux) | X Window | 点击链接 | 同上 |
硬件模拟的细节如下:
- CPU:支持x86、x86_64(含AVX-512和APX扩展)、RISC-V rv64。其中AVX-512和APX是近年新增的ISA扩展,模拟难度极大。
- 主板/芯片组:采用标准PC架构(如Intel 82371PIIX3 PCI桥等),模拟了IRQ、DMA、定时器。
- 内存:默认提供128MB~256MB内存,可通过URL参数调整(但受浏览器性能限制)。
- 存储:模拟一块虚拟IDE磁盘(写入内存中的文件系统映像),通过虚拟BIOS引导。
- 显示:提供两种虚拟显卡:
- VGA文本模式(字符界面)
- 支持X Window的vesa图形模式(使用Linearisability,模拟SVGA显卡)
- 输入:模拟PS/2键盘和鼠标(通过JavaScript事件)
- 网络:内建虚拟以太网卡,通过NAT方式连接到宿主机的浏览器。网络数据通过WebSocket传至服务器,再由服务器转发到真实网络(如果启用)。
- 串口:用于调试输出。
技术原理详解
1. CPU模拟
JSLinux的CPU模拟器是基于QEMU的x86和RISC-V翻译器,用C语言编写,然后通过emscripten编译器转换为asm.js(或WebAssembly)。模拟器逐指令执行,但对每个基本块进行了轻量级优化(如常量折叠)。因为浏览器端JavaScript执行速度是硬件速度的1/100~1/1000,所以虚拟机的运行速度大约比原生慢一个数量级——例如启动一个小型Linux需要几十秒,而图形界面会慢很多。
尤其值得一提的是,作者最近添加了AVX-512和APX支持。AVX-512代表512位向量指令,APX是一种新的64位扩展,这些指令的模拟需要处理SIMD寄存器组和引入的新寻址模式。
2. 内存管理与虚拟化
JSLinux直接在JavaScript的ArrayBuffer上分配一块内存区域作为虚拟机物理内存。CPU访问物理内存时,通过类型化数组进行读写。为了避免每次访问都进行边界检查,作者巧妙利用了JavaScript的越界读写会返回undefined的行为来模拟硬件陷阱(例如缺页中断)。
对于虚拟化,JSLinux使用了半虚拟化技术(virtio):
- 虚拟网卡使用virtio-net协议,直接将网络包交给虚拟设备,无需模拟真实网卡的寄存器。
- 虚拟磁盘使用virtio-blk。
这样可以降低开销,因为真实的PCI设备模拟非常耗时。
3. 显示和图形
对于文本控制台,JSLinux直接将虚拟机的VGA文本缓冲区映射到Canvas上,每次重绘时只刷新变化部分。
对于X Window系统,JSLinux模拟了一个简单的SVGA显卡,支持线性帧缓冲。启动X Window时,虚拟Linux使用Xvesa或Xfbdev驱动程序,将图形输出写入内存帧缓冲,JSLinux定期扫描该内存区域并绘制到HTML Canvas上。鼠标输入通过JavaScript事件获取坐标,转换为虚拟PS/2鼠标包。
4. 网络支持
默认配置下,JSLinux的网络是禁用的(表中标注为VFsync access),因为它需要服务器转发WebSocket代理。但有选项可以启用网络,实现ping外部主机等操作。原理如下:
- 客户端虚拟Linux内,其网络栈发出数据包,到达虚拟网卡。
- 虚拟网卡将包封装成WebSocket帧,发送到WebSocket服务器。
- 服务器解包并通过真实网卡发送到互联网。返回包再通过同样路径传回虚拟机。
这种机制本质上是一个用户态的NAT代理。
启动流程和具体配置
当你点击一个有“Console”或“X Window”的链接时,JSLinux会加载一个磁盘映像文件(例如Alpine Linux的vmlinux和initramfs),然后模拟BIOS启动过程。启动流程大致如下:
- 虚拟BIOS自检并加载硬盘的引导扇区。
- 引导扇区加载GRUB或直接加载内核镜像(Alpine通常使用直接内核引导,附带initramfs)。
- 内核解压并挂载根文件系统。
- 启动init进程,最终出现登录提示。
需要说明的是,JSLinux并不模拟功耗管理或ACPI,但支持标准PC特性。
性能分析与局限
由于JavaScript解释执行相对于原生代码有巨大开销,以下是我们实测的经验数据(基于Chrome浏览器,现代x86硬件):
- Alpine Linux控制台启动:约10-20秒。
- 启动X Window(Alpine带图形):需要超过1分钟,窗口交互有等待感。
- riscv64 Fedora启动:可能耗时数分钟(因为Fedora内核和用户空间更庞大)。
主要性能瓶颈在于:
- CPU翻译执行:每个指令若干JavaScript操作,但Emscripten生成的asm.js循环内可执行数百万次迭代。
- 浏览器垃圾回收机制:虚拟机内存较大时,GC会导致卡顿。
- 没有可用的硬件加密等加速。
尽管如此,对于教育目的和测试用例,JSLinux已足够。例如,你可以在浏览器里练习Linux命令,或调试内核启动。
更深层:JSLinux与新的WASM进展
原作者在技术说明中提到,目前JSLinux已经支持WebAssembly (WASM)编译,不再是仅asm.js。WASM带来的性能提升约10-20%(因为直接机器码解码)。此外,用户可以通过URL参数调整内存大小(例如?mem=256),也可以通过自定义磁盘映像来运行其他操作系统(如NetBSD)。
讨论与影响
JSLinux的成功证明了:浏览器可成为通用计算平台,不仅执行应用,还可以运行完整操作系统。这催生了类似项目如v86(基于WASM的PC模拟器),但其初衷仍是展示技术极限。
2026年(版权更新),作者仍在维护JSLinux,新增了RISC-V支持。RISC-V模拟器比x86更干净,因为指令集更精简,翻译更容易,但Linux生态对RISC-V的支持不如x86成熟,因此启动过程较长。
附录:尝试JSLinux的一步一步方法
- 打开现代Chrome/Firefox浏览器(推荐桌面版)。
- 点击文章原文中的“x86_64 Alpine Linux 3.23.2 Console”链接。
- 等待加载约10秒,你将看到
login:提示,输入root登录。 - 在Shell中运行
ls、ifconfig等命令体验。 - 尝试用
X Window链接,看到桌面后右键(在canvas上点击鼠标右键)会弹出菜单,可以启动终端或浏览器。
注意:Windows 2000镜像有版权声明,仅用于历史演示,可能缺少网络支持。
总结
JSLinux展示了一个高水平程序员如何在受限环境下创造奇迹。它不仅是JavaScript性能的标杆,也是系统模拟技术的科普案例。阅读本笔记后,你可以更深刻地理解系统仿真层的工作:CPU解释、内存管理、设备中断、图形缓冲。若对实现感兴趣,可查看原文中的“Technical notes”链接,作者会详细讲解存档处理。