运维123 - kvm
type: channel
link: https://www.sddts.cn/index.php/tag/kvm/
items: Linux 内核 TSS 描述符符号扩展 bug 修复案例分析
items: Docker-Android 容器化 Android 模拟器完全指南

Linux 内核 TSS 描述符符号扩展 bug 修复案例分析
type: item
date: 2026-03-22T14:30:08+00:00
description: Linux 内核 TSS 描述符符号扩展 bug 修复案例分析一、事件概述1. 事件背景作者在开发 Type-2 虚拟化管理程序时，发现了一个隐藏在 Linux 内核 KVM selftests 中的 C 语言符号扩展 bug。该 bug 导致跨 CPU 核心迁移时系统崩溃。2. 影响范围A. 影响组件Linux 内核 KVM selftests使用受影响代码的虚拟化管理程序B. 触发条件跨 CPU 核心迁移TSS 基地址的高位字节（base2）最高位为 13. 严重程度中等级别，可能导致系统崩溃或死锁二、技术背景1. x86 任务状态段（TSS）x86 架构在保护模式下定义了一个任务状态段（Task State Segment，TSS），它是内存中用于保存任务信息的区域。虽然现代操作系统已经放弃了硬件任务切换，但 TSS 仍然被保留用于保存关键的栈指针。在 64 位系统中，内核采用每核心一个 TSS 的方式，TSS 的主要作用包括：保存当前线程的内核栈指针（用户态到内核态切换时使用）保存关键事件的已知良好栈（NMI、Double Fault 等）2. TR 寄存器任务寄存器（Task Register，TR）包含：可见部分：16 位偏移量隐藏部分：TSS 基地址、限制、访问权限隐藏部分的设计避免了 CPU 每次都需要索引 GDT 来查找 TSS 信息。graph TB subgraph TR["TR 寄存器"] Visible["可见部分 (16 位偏移)"] Hidden["隐藏部分"] Base["基地址"] Limit["限制"] Access["访问权限"] end Visible --> Hidden Hidden --> Base Hidden --> Limit Hidden --> Access GDT["GDT 表"] -->|"通过偏移索引"| TSSDesc["TSS 段描述符"] TSSDesc --> TSS["TSS 内存区域"] Base -->|"直接指向"| TSS3. 虚拟化管理程序与 TSS虚拟化管理程序本质上是一个任务切换器，任务就是操作系统。为了在同一块硅片上运行多个操作系统，管理程序必须交换整个 CPU 状态，包括 TR 寄存器的隐藏部分。Intel VT-x 扩展通过 VMCS（Virtual Machine Control Structure）来保存和恢复 vCPU 状态：graph LR subgraph VMCS["VMCS 结构"] HostState["Host 状态区"] GuestState["Guest 状态区"] Control["控制字段"] ExitInfo["VM 退出信息"] end subgraph HostTR["Host TR 字段"] H1["HOST_TR_SELECTOR (16 位)"] H2["HOST_TR_BASE (自然宽度)"] end subgraph GuestTR["Guest TR 字段"] G1["GUEST_TR_SELECTOR (16 位)"] G2["GUEST_TR_BASE (自然宽度)"] G3["GUEST_TR_LIMIT (32 位)"] G4["GUEST_TR_ACCESS_RIGHTS (32 位)"] end HostState --> HostTR GuestState --> GuestTR三、问题发现1. 开发场景作者在开发 Type-2 虚拟化管理程序时，从 Linux 内核 KVM selftests 中借用了以下代码来设置 HOST_TR_BASE：vmwrite(HOST_TR_BASE, get_desc64_base((struct desc64 *)(get_gdt().address + get_tr())));这段代码的功能是：获取 GDT 地址使用 TR 寄存器值索引到 GDT解析 TSS 段描述符并提取 TSS 内存地址使用 VMWRITE 指令将地址写入 VMCS 的 HOST_TR_BASE 字段2. 故障现象在虚拟化开发环境（3 个 vCPU）中一切正常，但在物理机（Intel Core i7-12700H，14 核 20 线程）上运行时系统崩溃。崩溃模式 1：系统死锁sequenceDiagram participant C5 as CPU 5 participant C6 as CPU 6 participant Others as 其他 CPU Note over C5: NMI 触发 VM 退出 C5->>C5: 尝试从 TSS 读取内核栈 C5->>C5: 致命页错误（读取未映射地址） Note over C5: Kernel Oops，CPU 5 …

Docker-Android 容器化 Android 模拟器完全指南
type: item
date: 2026-02-13T00:14:52+00:00
description: Docker-Android 容器化 Android 模拟器完全指南一、概述1. 简介A. 是什么Docker-Android 是一个将 Android 模拟器容器化的开源解决方案，支持通过 noVNC 在浏览器中访问和控制 Android 设备。该项目提供了完整的 Docker 镜像，可用于应用开发、测试和自动化场景。B. 为什么选择传统的 Android 开发和测试面临以下问题：需要在本地安装 Android SDK 和模拟器模拟器占用大量系统资源CI/CD 环境中难以集成图形化测试多设备测试需要多台物理设备Docker-Android 通过容器化技术解决了这些问题：开发环境隔离，不影响主机系统支持并行运行多个模拟器实例可轻松集成到 Jenkins 等 CI/CD 流程通过 noVNC 实现远程访问C. 可以做什么应用程序开发和测试（原生、Web 和混合应用）使用 Appium、Espresso 等框架进行 UI 自动化测试构建 Android 项目通过 ADB 连接从容器外部控制模拟器部署到云平台（AWS、GCP、Azure）与 Genymotion Cloud 集成2. 项目数据GitHub Stars：14.3k+Fork 数量：1.6k+贡献者：52 人支持语言：Python 92.1%、Shell 7.9%最新版本：v3.2.0-p0（2026 年 1 月发布）二、支持的 Android 版本1. Docker 镜像列表Android 版本API 级别最新版本镜像指定版本镜像9.028budtmo/docker-android:emulator_9.0budtmo/docker-android:emulator_9.0_<version>10.029budtmo/docker-android:emulator_10.0budtmo/docker-android:emulator_10.0_<version>11.030budtmo/docker-android:emulator_11.0budtmo/docker-android:emulator_11.0_<version>12.032budtmo/docker-android:emulator_12.0budtmo/docker-android:emulator_12.0_<version>13.033budtmo/docker-android:emulator_13.0budtmo/docker-android:emulator_13.0_<version>14.034budtmo/docker-android:emulator_14.0budtmo/docker-android:emulator_14.0_<version>--budtmo/docker-android:genymotionbudtmo/docker-android:genymotion_<version>2. 支持的设备型号A. 手机设备Samsung Galaxy S10Samsung Galaxy S9Samsung Galaxy S8Samsung Galaxy S7 EdgeSamsung Galaxy S7Samsung Galaxy S6Nexus 4Nexus 5Nexus OneNexus SB. 平板设备Nexus 7Pixel C三、系统要求1. 硬件要求支持 KVM 虚拟化足够的内存（建议每个模拟器实例至少 2GB）足够的磁盘空间（每个镜像约 5-10GB）2. 软件要求A. 操作系统Ubuntu Linux（原生支持）macOS/Windows：需要运行支持虚拟化的 Ubuntu 虚拟机B. 虚拟化检查# 安装虚拟化检查工具 sudo apt install cpu-checker kvm-ok # 检查 KVM 是否启用 kvm-ok四、快速开始1. 基本使用graph LR A[宿主机] -->|Docker run| B[容器] B -->|KVM加速| C[Android模拟器] B -->|noVNC| D[浏览器] E[ADB客户端] -->|adb connect| BA. 启动容器docker run -d \ -p 6080:6080 \ -e EMULATOR_DEVICE="Samsung Galaxy S10" \ -e WEB_VNC=true \ --device /dev/kvm \ --name android-container \ budtmo/docker-android:emulator_11.0参数说明：-p 6080:6080：映射 noVNC 端口-e EMULATOR_DEVICE：指定设备型号-e WEB_VNC=…