欢迎回来
登录你的知识库账户
忘记密码?
还没有账户?立即注册
创建账户
注册你的专属知识库
已有账户?去登录
找回密码
输入注册邮箱获取验证码
返回登录
请输入图片中的验证码以继续注册
加载中...
取消
新建收藏
手动添加你喜欢的内容
取消
编辑头像与昵称
上传新头像或修改你的显示昵称
支持 JPG/PNG,最大 2MB
取消

问题反馈

notebasewww.notebase.cn
控制台
内容库
动态
管理
账户
U
用户
--
在线
v0.8.7 · 知识库
笔记
KnowledgeBase
网络无边,知识有迹。
0笔记
0工具
30推荐

分类导航

按主题直达

编辑精选

站内用户贡献 · 真实笔记

最新收录

每日更新
继续浏览全部内容 →
>
笔记
0
加载中...
工具
0
此页用于记录用户反馈问题后的每一次改进
笔记用法

“写笔记”支持四种格式——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深度技术笔记

1970/1/1编程开发

一句话概括: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启动过程。启动流程大致如下:

  1. 虚拟BIOS自检并加载硬盘的引导扇区。
  2. 引导扇区加载GRUB或直接加载内核镜像(Alpine通常使用直接内核引导,附带initramfs)。
  3. 内核解压并挂载根文件系统。
  4. 启动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的一步一步方法

  1. 打开现代Chrome/Firefox浏览器(推荐桌面版)。
  2. 点击文章原文中的“x86_64 Alpine Linux 3.23.2 Console”链接。
  3. 等待加载约10秒,你将看到login:提示,输入root登录。
  4. 在Shell中运行ls、ifconfig等命令体验。
  5. 尝试用X Window链接,看到桌面后右键(在canvas上点击鼠标右键)会弹出菜单,可以启动终端或浏览器。

注意:Windows 2000镜像有版权声明,仅用于历史演示,可能缺少网络支持。

总结

JSLinux展示了一个高水平程序员如何在受限环境下创造奇迹。它不仅是JavaScript性能的标杆,也是系统模拟技术的科普案例。阅读本笔记后,你可以更深刻地理解系统仿真层的工作:CPU解释、内存管理、设备中断、图形缓冲。若对实现感兴趣,可查看原文中的“Technical notes”链接,作者会详细讲解存档处理。

原文链接:http://bellard.org/jslinux/

编写使用方法
Markdown 格式 · Ctrl+Enter 确定
新建笔记
预览
数据表格
点击单元格编辑 · Tab 移动
A1fx
Sheet1
BIH1H2≡🔗</>
隐私提醒

取消
编辑工具
取消