问题标签 [x86-emulation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
x86 - VMWare 工作站和 x86 平台
我正在研究 Tanenbaum 的书(“现代操作系统”)中的虚拟化。我清楚地记住了虚拟化的所有基本概念,但我无法更好地理解 VMWare Workstation 是如何工作的。
首先,VMWare Workstation 有两个组件:
- VMM:它关心指令的执行。
- VMX:VMM 与主机操作系统的接口。
VMM 在每次(?)执行之前使用“决策算法”来确定是否可以使用“直接执行”(陷阱和模拟)或“二进制转换”来执行它。
Tanenbaum 说,明智的指令仅在几种情况下会产生“陷阱”(在这种情况下,VMM 可以使用直接执行,从而提高性能)。
对我来说不清楚的是,为什么在 x86 平台上一个明智的指令,总是不明智(在 x86 平台上),在什么情况下这是真的?
assembly - Pentium III CPU 如何处理来自同一组的多个指令前缀?
Intel x86 规范指出,使用来自同一组的多个指令前缀会导致未定义的行为。在实践中,Pentium III Coppermine CPU 在这种情况下是如何反应的?遗憾的是我没有芯片可以测试。
memory-mapping - 在 simics 中,打印虚拟到物理内存映射的命令是什么?
调试运行在 simics-x86-core-i7-x58-ich10 目标上的内核时,如何打印物理内存映射?
memory-map
似乎只打印对象(ram、apic、vga 等)的物理内存空间映射。
l2p
打印特定逻辑地址的映射,而不是所有映射。
compilation - 动态重新编译如何处理软件虚拟化中的指令指针检查?
(这个问题并不针对 VirtualBox 或 x86 本身,但由于它们是我所知道的最好的例子,我将参考它们并询问 VBox 如何处理某些场景。如果你知道VBox 未使用的其他解决方案,请考虑提及它们。)
我已经阅读了 VirtualBox 如何进行软件虚拟化,但我不明白以下内容。
在执行 ring 0 代码之前,CSAM [代码扫描和分析管理器]递归地扫描它以发现有问题的指令。PATM [补丁管理器]然后执行原位补丁,即它用跳转到集成代码生成器已放置更合适实现的管理程序内存来替换指令。实际上,这是一项非常复杂的任务,因为有很多奇怪的情况需要被发现和正确处理。因此,以目前的复杂性,有人可能会说 PATM 是一种先进的原位重编译器。
考虑 ring-0 代码中的以下示例指令序列:
这里的被调用者正在测试调用者的返回地址是否是1234
,如果是,它会做一些特殊的事情。显然打补丁会改变返回地址,所以我们需要能够处理它。
VirtualBox 的文档说它发现了“有问题的”指令并就地修补它们,但我真的不明白这是如何工作的,原因有两个:
似乎任何暴露指令指针的指令都是“有问题的”,其中
call
可能是最常见的(而且非常常见)。这是否意味着 VirtualBox 必须分析并可能修补它在 ring 0 中看到的每条指令?call
这不是让性能一落千丈吗?他们如何以高性能处理这个问题?(他们在文档中提到的案例非常模糊,所以我很困惑为什么他们没有提到如果发生这种常见的指令。如果这不是问题,我不明白为什么。)如果指令流碰巧被修改(例如动态加载/卸载内核模块),VirtualBox 必须动态检测这一点并垃圾收集无法访问的重新编译指令。否则会出现内存泄漏。但这意味着现在必须分析每条
mov
指令(和指令,以及写入内存的所有其他内容)并可能对其进行修补,可能会重复,因为它可能正在修改已修补的代码。push
这似乎本质上将所有guest ring-0 代码退化为近乎完整的软件仿真(因为在重新编译期间不知道移动的目标),这将使虚拟化成本飙升,但这并不是我从阅读文档中得到的印象。这不是问题吗?这如何有效地处理?
请注意,我不是在询问英特尔 VT 或 AMD-V 等硬件辅助虚拟化,我对阅读这些内容不感兴趣。我很清楚他们完全避免了这些问题,但我的问题是关于纯软件虚拟化。
x86 - ARM是否以16位实模式启动
有点 bg - 我刚刚开始 OS Dev 并正在开发自己的汇编操作系统。
因此,据我所知,x86 处理器和其他模拟它们(AMD?)的处理器以 16 位实模式启动以进行引导过程,然后可以切换到保护模式以进一步引导操作系统或辅助引导加载程序等等。(让现代 BIOS 和 UEFI 将它们切换到 32/64 位部分,然后将它们切换回 16 位实模式部分,因为这无关紧要)
我的简单问题是 - 具有 ARM 处理器的嵌入式设备也这样做吗?我的意思是我们的智能手机在启动过程中会切换到 16 位实模式吗?
android - 运行 android studio 时出现错误,我的 haxm 管理器也无法正常工作
模拟器:模拟器:错误:x86 仿真当前需要硬件加速! 这是 haxm 管理器错误的快照
android - Docker:将主机中的目录安装到容器中会导致错误
我在从这个项目中运行 docker android 仿真时遇到了一些麻烦:https ://github.com/thyrlian/AndroidSDK
由于我是 Linux(使用 Ubuntu 18)菜鸟,也许我太愚蠢了……我无法将图像安装到我的容器中……在教程中,它使用以下命令完成:
docker run -it --rm -v $(pwd)/sdk:/sdk thyrlian/android-sdk bash -c 'cp -a $ANDROID_HOME/. /sdk'
所以我下载了 android-sdk-tools 并将其提取到我的根目录中,名为“sdk”。所以我的命令看起来像这样:
docker run -it --rm -v sdk bash -c 'cp -a $ANDROID_HOME/. /sdk'
但是我得到了大量的错误(这些只是少数,因为它们都是相似的):
cp: 无法打开 '/./sys/bus/isa/uevent': 权限被拒绝 cp: 无法打开 '/./sys/bus/isa/drivers_probe': 权限被拒绝 cp: 无法打开'/ ./sys/bus/xen/uevent': 权限被拒绝 cp: 无法打开 '/./sys/bus/xen/drivers_probe': 权限被拒绝 cp: 无法打开'/./sys/bus/serio/ uevent':权限被拒绝
assembly - 我想交换两个位的位置。这个怎么做?
给我一个问题,我必须编写一个程序,使第一段偏移地址的最后一位成为第二段偏移地址的第一位。例如,如果我得到 ABCDH,那么第二个地址的偏移地址应该是 DCBAH。我只关注偏移地址的交换,暂时忽略基地址:
现在我们有了 CDABH。现在我想交换D和C的位置。我被困在这一点上。我会使用 SAR 命令吗?
x86 - 尝试在 Raspberry Pi 上的 x86 chroot 环境下运行 Wine 时出现总线错误
按照https://www.novaspirit.com/2019/04/15/run-x86-arm/上的教程进行了一些修改(我使用 /x86/ 作为 chroot 目录并通过安装 wine apt-get
),尝试运行winecfg
只返回“总线错误”
这是在 Raspberry Pi 4 上运行的。错误是如此非描述性,以至于我无法通过我的故障排除尝试得到任何结果。
这是我为安装它而运行的每个命令的完整列表:
当我尝试winecfg
用 wine 运行或运行东西时,我只收到错误Bus Error
qemu - QEMU:如何在没有 fpu 的情况下创建 486 VM
我正在尝试创建一个没有 FPU 的 486 虚拟机,例如 80486SX。我认为这可以通过 QEMU 来实现。我找不到直接指定这样一个 cpu 的可能性(只有 option -cpu=486
)。根据文档,我认为可以通过指定 cpu 来删除 FPU,如下所示
但是在我安装了 Debian 5.0(最后一个支持 486 的 Debian)之后,cat/proc
告诉我 FPU 确实被认为存在(即使它不在标志中),并且 gcc 将为一个简单的 hello-world 样式程序发出浮点指令打印双打,QEMU 会愉快地执行它。