我想创造i386环境QEMU环境chroot \n我使用的是 Raspberry Pi ver B,但我想使用哪个版本应该不重要。
到目前为止我做了:
\n\napt-get install qemu qemu-user qemu-user-static binfmt-support debootstrap binutils\nRun Code Online (Sandbox Code Playgroud)\n\n然后我将chroot目录安装到/tmp/mnt并运行:
sudo debootstrap --foreign --arch i386 buster ./ http://deb.debian.org/debian/\nRun Code Online (Sandbox Code Playgroud)\n\n然后我安装了:
\n\nmount -t sysfs /sys /tmp/mnt/sys/\nmount -t proc /proc /tmp/mnt/proc/\nmount \xe2\x80\x93bind /dev /tmp/mnt/dev/\nmount \xe2\x80\x93bind /dev/pts /tmp/mnt/dev/pts/\nmount \xe2\x80\x93bind /dev/shm /tmp/mnt/dev/shm/\nRun Code Online (Sandbox Code Playgroud)\n\n现在当我尝试运行第二阶段时debootstrap:
sudo chroot ./ ./debootstrap/debootstrap --second-stage\nRun Code Online (Sandbox Code Playgroud)\n\n我收到以下错误消息:
\n\nW: Failure trying to run: /sbin/ldconfig\nW: See //debootstrap/debootstrap.log for …Run Code Online (Sandbox Code Playgroud) 我正在尝试分析 QEMU tcg IR 代码
我看到这篇文章讨论了 QEMU 代码流程。根据该图,翻译发生在 target-xxx/translate.c,这就是 QEMU 将代码从源(或前端)翻译为 TCG IR 的地方。然后进一步在 tcg/xxx/tcg-target.c。
这个过程可以总结如下(至少根据我的理解) - 假设我们有x86一个前端和powerpc (ppc64abi32)一个后端,那么 -
x86--> TCG IR-->ppc64abi32
我想分析一下这段TCG IR代码。有什么方法可以生成此代码(这可能不相关,但例如,我们可以使用带有 clang 的标志 -S 生成 LLVM IR 代码)?
我自己做了一些研究,发现struct TranslationBlock(在文件 /include/exec/exec-all.h 中)这与 tcg IR 代码有关(所以,我尝试打印一些结构变量,但我不确定是否我正朝着正确的方向前进)。我还阅读了微型代码生成器自述文件,但找不到生成相关信息。
我想对 QEMU 每秒的客户指令进行基准测试,以将其与其他模拟器进行比较。
如何获取访客指令数?我对用户模式和完整系统模式都感兴趣。
我现在唯一的解决方案是使用简单跟踪exec_tb或-d in_asm:如何使用 QEMU 的简单跟踪后端来记录所有指令?然后从那里计算指令。但这可能会由于输出操作而大大降低模拟性能,因此我可能必须运行测试程序两次,一次有跟踪,另一次没有跟踪,并希望两次执行是相似的(应该是,特别是对于单线程用户模式模拟)。
我看到了这个-icount选项,从名字上听起来很有希望,但是当我将它传递给 QEMU 4.0.0 时,我没有看到任何事情发生。它应该在某处打印指令计数吗?以下补丁似乎未合并,建议不要:https://lists.gnu.org/archive/html/qemu-devel/2015-08/msg01275.html
例如,我有一个启用了 KVM 的主机操作系统(例如 Ubuntu)。我使用 QEMU 启动虚拟机来运行来宾操作系统(例如 CentOS)。可以说,对于主机操作系统来说,这个VM只是一个进程。因此,从主机的角度来看,它像往常一样处理页面错误(例如,根据需要分配页面框架,根据需要根据活动/非活动列表交换页面)。
这是问题和我的理解。在来宾操作系统中,由于它仍然是一个成熟的操作系统,我认为它仍然具有处理虚拟内存的所有机制。它看到QEMU 提供的一些虚拟化物理内存。我所说的虚拟化物理内存是指客户操作系统不知道它在虚拟机中,并且仍然像在真实物理机上一样工作,但它所拥有的确实是 QEMU 给出的抽象。因此,即使分配了一个页框,如果该页框不在客户页表中,客户操作系统仍然会触发页面错误,然后将某些页面映射到该框架。更糟糕的是,可能会出现双页错误,即客户机在发生页错误时首先分配一些页框,这会触发主机操作系统的页错误。
然而,我也听说过类似浅(或影子)页表的东西,它似乎可以优化这种不必要的双页错误和双页表问题。我还查看了一些其他内核实现,特别是 unikernels,例如OSv、IncludeOS等。我没有找到任何与页面错误和页表机制相关的内容。我确实看到了一些类似的符号page_fault_handler,但没有我在 Linux 内核代码中看到的那么大。在这些 unikernel 实现中,内存管理似乎并不是什么大问题。所以我认为 QEMU/KVM 和一些 Intel 的虚拟化技术已经处理了这个问题。
对这个主题有什么想法吗?或者,如果您对这个问题有一些好的参考文献/论文/资源,或者一些提示将会非常有帮助。
我基本上试图协调两个进程,一个在 Qemu 内(用户模式),另一个在主机上。现在我正在寻找一些方法来设置这种虚拟到主机的通信。
我明白这TCP/UDP总是有效的。然而,有没有更有效的方法呢?我试图搜索 Qemu 本身是否为这种通信提供了某种特定的方式,但到目前为止还没有积极的发现。
任何建议将不胜感激。非常感谢。
我有一个 Windows VM,用于代替真实的 WIndows 机器进行测试。我想在该虚拟机内启用 WSL2。
到目前为止我已经:
options kvm-intel nested=1sudo cat /sys/module/kvm_intel/parameters/nested输出“Y”。<cpu model='host-passthrough'>在 virt-manager 的 xml 配置中设置。还是没有骰子。一旦我根据 WSL2 的要求启用“虚拟机平台”功能,我的虚拟机就会在启动时开始冻结。
有人成功地做到了这一点吗?
我有一个程序集(NASM)文件:
bits 32
start:
mov dword [0xb8000], 0x2f4b2f4f
hlt
Run Code Online (Sandbox Code Playgroud)
这会生成一个二进制文件,其中包含:
C7 05 00 80 0B 00 4F 2F 4B 2F F4
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以在 QEMU 中执行此二进制文件中的代码,而无需更改代码且无需添加标头(如 Multiboot 或类似的)?我希望保持二进制文件原样。
如标题所示,我想编译hello_world.c程序并在qemu-system-aarch64上运行它。这是程序:
#include <stdio.h>
int main()
{
printf("hello world!\n");
}
Run Code Online (Sandbox Code Playgroud)
从https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-elf/(这是裸机目录),我可以看到这些工具链:
folder aarch64-elf -
folder aarch64-linux-gnu -
folder aarch64_be-elf -
folder aarch64_be-linux-gnu -
folder arm-eabi -
folder arm-linux-gnueabi -
folder arm-linux-gnueabihf -
folder armeb-eabi -
folder armeb-linux-gnueabi -
folder armeb-linux-gnueabihf -
folder armv8l-linux-gnueabihf
Run Code Online (Sandbox Code Playgroud)
所以我选择了aarch64-elf(这是正确的吗?)并将其安装在我的ubuntu 16.04机器上并将bin目录添加到路径中。如果我这样做,aarch64-elf-gcc hello_world.c我会收到 _exit、_sbrk、_write、_close、_lseek、_read、_fstat、_isatty 函数的未定义引用错误。所以我尝试添加 -spec=aem.ve-specs 并且它没有抱怨(我不确定这是否正确)。我尝试运行 qemu。
qemu-system-aarch64 -M virt -cpu cortex-a57 -nographic -smp 1 -m 2048 -kernel a.out
Run Code Online (Sandbox Code Playgroud)
它没有给我任何打印。我应该在这里改变什么?
Visual Studio Xamarin 再次出现问题。\n我目前拥有 Windows Pro 10.0.19043 和最新版本的 Visual Studio 2019 (16.10.4),其中包含以下组件:
\nMicrosoft Visual Studio Enterprise 2019\nVersion 16.10.4\nVisualStudio.16.Release/16.10.4+31515.178\nMicrosoft .NET Framework\nVersion 4.8.04084\nInstalled Version: Enterprise\nMicrosoft Visual C++ 2019\nASP.NET and Web Tools 2019 16.10.526.50910\nASP.NET and Web Tools 2019\nAzure App Service Tools v3.0.0 16.10.526.50910\nAzure App Service Tools v3.0.0\nC# Tools 3.10.0-4.21329.37+246ce641f04b67ef017655275d850bf902a8e40f\nC# components used in the IDE. Depending on your project type and settings, a different version of the compiler may be used.\nCommon Azure Tools 1.10\nProvides common services for use by Azure Mobile Services and …Run Code Online (Sandbox Code Playgroud) 我有一个 CentOS 7 x86_64 虚拟机。我需要在 Oracle Linux 8 arm64 docker 容器中执行一些操作。
我安装了 docker 和 qemu:
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin \
qemu-system-arm qemu qemu-user qemu-kvm qemu-kvm-tools libvirt virt-install \
libvirt-python libguestfs-tools-c
Run Code Online (Sandbox Code Playgroud)
然后我启动 docker 并设置 qemu-user-static:
$ sudo systemctl start docker
$ docker run --rm --privileged multiarch/qemu-user-static --reset
Run Code Online (Sandbox Code Playgroud)
我的 Dockerfile 是:
FROM oraclelinux:8.5
ENV container docker
RUN dnf -y install sssd nscd unzip zip xz which …Run Code Online (Sandbox Code Playgroud) qemu ×10
arm64 ×2
linux-kernel ×2
adb ×1
android ×1
assembly ×1
bare-metal ×1
binaryfiles ×1
docker ×1
kernel ×1
kvm ×1
linux ×1
nasm ×1
raspberry-pi ×1
windows-subsystem-for-linux ×1
x86 ×1
x86-64 ×1
xamarin ×1