1.2.2 配置运行环境
在ubuntu上安装bochs
%%bash
# 创建缓存目录
mkdir -p /tmp/code/var/apt/archives/partial
# 配置APT使用自定义缓存目录
echo 'Dir::Cache "/tmp/code/var/apt";' > /etc/apt/apt.conf.d/00custom-cache
echo 'Dir::Cache::archives "archives";' >> /etc/apt/apt.conf.d/00custom-cache
echo 'APT::Keep-Downloaded-Packages "true";' >> /etc/apt/apt.conf.d/00custom-cache
# 更新并安装(首次需要联网)
apt-get update
apt-get install -d -y bochs bochs-x openssh-server x11-apps xauth x11-utils xfce4 xfce4-goodies tightvncserver # 只下载不安装
apt-get install -y bochs bochs-x openssh-server x11-apps xauth x11-utils xfce4 xfce4-goodies tightvncserver # 从缓存安装
# apt-get install -y bochsbios
# apt-get install -y vgabios
# bochs目录在哪里
# 后续安装可以直接使用缓存(离线环境):
# apt-get install --no-download -y bochs bochs-x openssh-server x11-apps xauth x11-utils xfce4 xfce4-goodies tightvncserver
bochsrc.bxrc 存放在哪里
这个文件是在 C:\Program Files\Bochs-2.7\dlxlinux\bochsrc.bxrc 这是我在Windows上安装的bochs的目录。我把dlxlinux复制到ubuntu服务器了。
%%bash
# 查找 bochs 相关的配置文件和目录
echo "=== Bochs 可执行文件位置 ==="
which bochs
echo -e "\n=== Bochs 系统配置文件位置 ==="
find /etc -name "*bochs*" 2>/dev/null
echo -e "\n=== Bochs 共享目录位置 (BXSHARE) ==="
find /usr/share -name "*bochs*" 2>/dev/null
echo -e "\n=== Bochs 库文件位置 ==="
find /usr/lib -name "*bochs*" 2>/dev/null
echo -e "\n=== 用户目录下的 Bochs 配置 ==="
find ~ -name "*bochs*" 2>/dev/null
echo -e "\n=== 默认 bochsrc 示例文件位置 ==="
find /usr -name "bochsrc*" 2>/dev/null
安装完之后可以在任意目录新建 bochsrc 文件,文件内容可以参考前面的 Windows 的配置。这里要注意修改 romimage 和 vgaromimage 的路径,已经在bochsrc.bxrc中配置了。
#### Ubuntu Desktop/GUI Apps on WSL | Updated Guide 使得ubuntu可以运行GUI程序。
windows - VS code remote x11 cant get DISPLAY while connecting to remote server - Stack Overflow
# !apt-get install -y x11-apps xauth x11-utils
!xeyes # Error: Can't open display:
%%bash
# 配置ssh使得可以支持GUI程序
# 备份原始配置文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 修改sshd_config文件
sed -i 's/^#X11Forwarding.*$/X11Forwarding yes/' /etc/ssh/sshd_config
sed -i 's/^#X11DisplayOffset.*$/X11DisplayOffset 10/' /etc/ssh/sshd_config
sed -i 's/^#X11UseLocalhost.*$/X11UseLocalhost no/' /etc/ssh/sshd_config
sed -i 's/^#PubkeyAuthentication.*$/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^#AuthorizedKeysFile.*/AuthorizedKeysFile .ssh\/authorized_keys/' /etc/ssh/sshd_config
sed -i 's/^AuthorizedKeysFile.*/AuthorizedKeysFile .ssh\/authorized_keys/' /etc/ssh/sshd_config
# 禁止密码登录,只允许公钥登录
sed -i 's/^#PasswordAuthentication.*$/PasswordAuthentication no/' /etc/ssh/sshd_config
# 禁止root登录
# sed -i 's/^#PermitRootLogin.*$/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
# 重启SSH服务以应用更改
# systemctl restart sshd
/etc/init.d/ssh restart
# 通常, $DISPLAY 变量默认设置。因此,在您的服务器终端中输入以下命令,它将以 IP:D.S. 的形式输出某些内容。记住 D 的值,这里为 10 。
!echo $DISPLAY
import os
os.environ["DISPLAY"] = "localhost:10.0"
# !export DISPLAY=localhost:10.0 # 设置DISPLAY变量
!echo $DISPLAY
%%bash
# ssh -X -L 6010:localhost:6000 username@server_ip
chmod 700 /root/.ssh
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
chmod 600 /root/.ssh/id_rsa
# ssh-keygen -f "/root/.ssh/known_hosts" -R "127.0.0.1"
# ssh -v -X -i /root/.ssh/id_rsa root@127.0.0.1 # 不行啊,tunnel没法转发端口到端口,智能转发端口到Web服务
下载 VcXsrv - Open-Source X Server for Windows
配置VNC
也放弃了,不行
%%bash
# 安装桌面环境
# sudo apt update
# sudo apt install xfce4 xfce4-goodies
# 安装VNC服务器
# sudo apt install tightvncserver
# 配置VNC服务器
## 配置VNC密码
# vncpasswd
## 启动VNC服务器
# vncserver :1 # 这将在端口5901上启动VNC服务
# 编辑启动脚本
#!/bin/sh
cat <<EOF > ~/.vnc/xstartup
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export XKL_XMODMAP_DISABLE=1
exec /usr/bin/startxfce4 &
EOF
## 停止VNC服务器
# vncserver -kill :1
export LC_ALL=C.UTF-8
export LANG=en_US.UTF-8
export USER=root
vncserver :1 -geometry 1280x720 -depth 24
# vncserver -kill :1
%%bash
# 启动bochs
# /tmp/code/linux_kernel_012/notes/dlxlinux/run.sh
安装QEMU
QEMU 也是一款模 拟器 软件,采用动态二进制翻译技术来模拟不同架构的CPU,并提供对应的硬件设备模型。它能保证 运行在其中的客户0S (Guest 0S) 不用进行修改就能运行。QEMU 与 KVM 技术一 起,可以使得GuestOS 系统的运行接近物理机的速度。相比Bochs, QEMU 的特点是高效、跨平台。
QEMU 在 Windows 上的安装很简单,只需要在 QEMU 的官网上下载对应的安装文件,并通过QEMU installer安装即可。
安装 QEMU 之后,打开QEMU 所在的文件目录,可以 看到有一系列 qemu-system-xxxexe 的可执行 文件。这些文件对应的是需要模拟的不同架构的CPU 类型。本书实验开发的 Linux 0.11 的镜像文件可以使用qdemu-system-x86_64.exe 或者qemu-system-i386.exe 运行。
qemu的动态二进制翻译是 一对一翻译,还是一对多翻译,还是多对一翻译 指令?
翻译机制详解
- 指令级翻译:
- 将 目标架构指令(如 ARM)逐条转换为 中间表示(TCG-IR)
- 再将中间表示优化后生成 主机架构指令(如 x86)
- 典型转换比例:1 条复杂指令 → 3-5 条主机指令
- 块级优化:
// 示例:ARM 指令块翻译为 x86
ARM_block: x86_translation:
LDR R0, [R1] → mov eax, [ebx]
ADD R0, R0, #5 → add eax, 5
STR R0, [R1] → mov [ebx], eax
- 通过基本块(Basic Block)合并优化,可提升 20-30% 性能
- 多对一特殊场景: 浮点运算指令:VFPv4 指令集 → x86 AVX SIMD 指令:NEON 指令 → SSE4.1 指令集 此时可能 4:1 压缩翻译
性能关键指标
| 翻译类型 | 延迟 (ns) | 吞吐量 (MIPS) | 代码膨胀率 |
|---|---|---|---|
| 纯解释器 | 100-200 | 1-5 | 1x |
| 动态二进制翻译 | 10-50 | 50-100 | 2-3x |
| 硬件虚拟化 | 1-5 | 500-1000 | 1x |
技术演进
- TCG(Tiny Code Generator):
- 多阶段翻译:目标指令 → TCG-IR → 主机指令
- 支持 20+ 架构互转(ARM↔x86, RISC-V↔PowerPC 等) 2.加速技术
# 使用硬件加速(KVM)
qemu-system-x86_64 -enable-kvm -cpu host
- KVM 模式下性能提升 10 倍以上
- JIT 缓存策略:
- 热点代码缓存命中率 >90%
- 翻译块重用率 70-85%
调试观察
通过 QEMU 的 -d 参数可查看翻译过程:
输出示例:
IN:
0x0000: e3a01005 mov r1, #5 ← ARM 原指令
OUT:
0x7f8b89d2c000: mov $0x5, %ebx ← x86 翻译结果
0x7f8b89d2c005: add $0x8, %r15
这种一对多的动态翻译机制,使得 QEMU 能在跨架构场景下保持约原生性能 50-70% 的速度,是软件全虚拟化的核心技术基础。
kvm 怎么个加速法?不是已经指令转换了吗?
KVM 的加速本质是通过:
- 硬件辅助的CPU虚拟化(Intel VT-x/AMD-V)
- 内存虚拟化扩展(EPT/NPT)
- I/O虚拟化优化(virtio + vhost)
- 中断控制器直通(APICv)
这使得需要动态翻译的指令减少90%以上,特别适合运行像Linux 0.11这样的完整操作系统,而不仅仅是用户态程序。
ubuntu server 如何安装 qemu 并运行 linuximg
%%bash
# 更新软件源
apt update
# 安装 QEMU 完整套件(包含 KVM 支持)
apt install -y qemu-system qemu-utils
# 验证安装
qemu-system-x86_64 --version