我正在尝试在 x86_64 主机上运行 ARM64 Ubuntu VM 以用于开发目的。我在他们的网站上搜索了 vagrant box 只找到了这个:
https://app.vagrantup.com/boxes/search?provider=libvirt&q=arm64&sort=downloads&utf8=%E2%9C%93
但是,我未能启动该 VM(使用vagrant up --provider libvirt
),因为它似乎使用qemu-system-x86_64
用作模拟器而不是qemu-system-aarch64
. 我用的vagrantfile?
Vagrant.configure("2") do |config|
config.vm.box = "MalibuKoKo/ubuntu-18.04.3-server-arm64-raspberry-4"
config.vm.define "ubuntu18.04-aarch64"
config.vm.provider :libvirt do |libvirt|
libvirt.machine_arch = "aarch64"
libvirt.uri = 'qemu:///system'
libvirt.emulator_path = "/usr/bin/qemu-system-aarch64"
end
end
Run Code Online (Sandbox Code Playgroud)
任何建议如何提出它?谢谢
我试图通过编写和运行测试程序来了解硬件缓存的工作原理:
#include <stdio.h>
#include <stdint.h>
#include <x86intrin.h>
#define LINE_SIZE 64
#define L1_WAYS 8
#define L1_SETS 64
#define L1_LINES 512
// 32K memory for filling in L1 cache
uint8_t data[L1_LINES*LINE_SIZE];
int main()
{
volatile uint8_t *addr;
register uint64_t i;
int junk = 0;
register uint64_t t1, t2;
printf("data: %p\n", data);
//_mm_clflush(data);
printf("accessing 16 bytes in a cache line:\n");
for (i = 0; i < 16; i++) {
t1 = __rdtscp(&junk);
addr = &data[i];
junk = *addr;
t2 = __rdtscp(&junk) - t1; …
Run Code Online (Sandbox Code Playgroud) 我在 x86 labtop 上使用 Ubuntu 20.04,并尝试安装“gcc for aarch64”(交叉编译)并gcc-multilib
使用以下命令:
sudo apt install gcc-9-aarch64-linux-gnu gcc-multilib
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
The following packages have unmet dependencies:
gcc-9-aarch64-linux-gnu : Conflicts: gcc-multilib but 4:9.3.0-1ubuntu2 is to be installed
gcc-multilib : Conflicts: gcc-9-aarch64-linux-gnu
Conflicts: gcc-9-aarch64-linux-gnu:i386
Run Code Online (Sandbox Code Playgroud)
有没有办法同时安装交叉编译器和gcc-multilib?
我编写了一个启用了 PIE/PIC 的“hello world”程序。我观察到程序头有 2 个 LOAD 条目:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
... ...
LOAD 0x000000 0x00000000 0x00000000 0x00870 0x00870 R E 0x1000
LOAD 0x000eb0 0x00001eb0 0x00001eb0 0x0015c 0x00164 RW 0x1000
Run Code Online (Sandbox Code Playgroud)
所以在我的理解中,ELF 二进制文件将被加载到 2 个页面中。第 1 页包含从偏移量 0 到文件大小 0x870 的二进制文件,它是 Read & Execute。由于它们是 0x1000 对齐的,因此第二个条目将被加载到包含二进制文件的第二页中(从偏移量0xeb0到0xeb0+0x15c)。此页面具有读写权限。
当我“pmap”正在运行的进程(或 cat /proc/pid/maps)时,它显示正在运行的程序有 3 个页面:
b7554000 4K rw--- [ anon ]
b7555000 1700K r-x-- libc-2.19.so
b76fe000 4K ----- libc-2.19.so
b76ff000 8K r---- libc-2.19.so
b7701000 …
Run Code Online (Sandbox Code Playgroud) 我想调用由其他配置结果确定的地址.并且该调用是在内联汇编中.
目前,它是这样的,并手动修改:
asm volatile ("call 0xc0200c20\n\t");
Run Code Online (Sandbox Code Playgroud)
我的问题是我能这样写吗?
#define CALL_ADDR 0xC0200c20
asm volatile ("call CALL_ADDR\n\t");
Run Code Online (Sandbox Code Playgroud)
谢谢!