我正在使用Cachegrind,Callgrind和Gem5进行一些实验.我注意到一些访问被计为cachegrind的读取,如callgrind的写入以及gem5的读取和写入.
我们来看一个非常简单的例子:
int main() {
int i, l;
for (i = 0; i < 1000; i++) {
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
... (100 times)
}
}
Run Code Online (Sandbox Code Playgroud)
我编译:
gcc ex.c --static -o ex
所以基本上,根据asm文件,addl $1, -8(%rbp)
执行100,000次.由于它既是读取也是写入,我期待100k读取和100k写入.但是,cachegrind只将它们计为read,而callgrind只计为write.
% valgrind --tool=cachegrind --I1=512,8,64 --D1=512,8,64
--L2=16384,8,64 ./ex
==15356== Cachegrind, a cache and branch-prediction profiler
==15356== Copyright (C) 2002-2012, and GNU GPL'd, by Nicholas Nethercote et al.
==15356== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的台式计算机上模拟一个简单的 Hello world ARM 示例。我尝试了 qemu 和 gem5。两者都给出了类似的错误。他们找不到ld-linux-aarch64.so.1
。其实我也找不到。如果我能找到它,我将用 -L (在 qemu 中)或 --redirects (在 gem5 中)显示它。
该文件是:
armhello: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=23a21b7a545ac510923b6b3713d2bbee092f820a, for GNU/Linux 3.7.0, not stripped
Run Code Online (Sandbox Code Playgroud)
它是用以下内容编译的:aarch64-linux-gnu-gcc
我正在尝试在 qemu 中运行它:
qemu-aarch64 armhello
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
/lib/ld-linux-aarch64.so.1: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我尝试在 gem5 中运行它:(simpleARM.py 指向我的可执行文件(名为armhello))
build/ARM/gem5.opt configs/tutorial/simpleARM.py
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
panic: panic condition fd < 0 occurred: Failed to open file /lib/ld-linux-aarch64.so.1.
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
注意:我知道它在编译时有效--static。但我需要运行动态链接的更复杂的二进制文件,并且我无法更改它们。这只是一个例子。
我在按照官方文档中的指示构建 gem5 时遇到了很多问题。
这些是我使用过的命令:
git clone https://gem5.googlesource.com/public/gem5
cd gem5
python2 `which scons` build/MIPS/gem5.opt
Run Code Online (Sandbox Code Playgroud)
这导致此输出:
scons: Reading SConscript files ...
Warning: Your compiler doesn't support incremental linking and lto at the same time, so lto is being disabled. To force lto on anyway, use the --force-lto option. That will disable partial linking.
Checking for C header file Python.h... (cached) yes
Checking for C library python2.7... (cached) yes
Checking for C library pthread... (cached) yes
Checking for C library dl... (cached) yes …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 X86_64 (amd64) ISA 中添加自定义指令。我将使用这些指令创建一个二进制文件,然后在 gem5 模拟器中运行它。要查找未使用的操作码列表,我指的是http://ref.x86asm.net/coder64.html。然而,该网站仅列出了单字节未使用的操作码。我正在寻找的是 amd64 CPU 的解码器语法,以便我可以找到哪些二进制序列无效。我尝试测试一些随机二进制序列以查看它们是否无效,并且我能够找到一些(例如0xc5000c
无效的 3 字节指令)。然而,我想要 amd64 CPU 用来解码指令的语法,以导出更长的无效二进制序列。是否有任何资源可用于此任务?
目前,为了查找二进制序列,我使用 C 程序,如下所示:
int main()
{
asm volatile(".byte 0x06" ::: "memory");
asm volatile(".byte 0x07" ::: "memory");
asm volatile(".byte 0x0E" ::: "memory");
asm volatile(".byte 0x16" ::: "memory");
asm volatile(".byte 0x17" ::: "memory");
asm volatile(".byte 0x1E" ::: "memory");
asm volatile(".byte 0x1F" ::: "memory");
asm volatile(".byte 0x27" ::: "memory");
asm volatile(".byte 0x2F" ::: "memory");
asm volatile(".byte 0x37" ::: "memory");
asm volatile(".byte 0x3F" ::: "memory"); …
Run Code Online (Sandbox Code Playgroud) 与此其他问题相关.我试图在gem5中运行这个简单的C程序:
int main() {
int a=1, b=2;
int c=a+b;
return c;
}
Run Code Online (Sandbox Code Playgroud)
它失败了因为gem5没有实现一些系统调用.
我的问题是,为什么像这样的简单程序需要系统调用?这应该毫无困难地运行裸机.有没有办法编译这个以避免系统调用?我正在使用arm-linux-gnueabi-gcc -static -DUNIX来编译它.
有许多可能的错误和解决方法分散在不同的地方,任何人都可以提供至少一种详细的工作设置,以及确切的 gem5 和编译器版本,希望在 Ubuntu 上吗?
我正在 gem5 模拟环境中运行一个小型矩阵乘法程序,并且想要测量该程序的执行时间。该程序是 Fortran 语言,我在矩阵乘法例程之前和之后使用 cpu_time 来获取时间。但是在gem5环境下还有其他更好的测量时间的方法吗?
后如何解决:运行gem5在系统调用仿真SE模式时,“致命的内核太旧”?我设法在某些条件下运行了一个静态链接的 hello world。
但是,如果我尝试针对 stdlib 运行一个 ARM 动态链接的:
./out/common/gem5/build/ARM/gem5.opt ./gem5/gem5/configs/example/se.py -c ./a.out
Run Code Online (Sandbox Code Playgroud)
它失败了:
fatal: Unable to open dynamic executable's interpreter.
Run Code Online (Sandbox Code Playgroud)
如何让它找到解释器?希望不要在我的主机根目录上复制我的交叉工具链的解释器。
对于 x86_64,如果我使用我的本机编译器,它就可以工作,并且正如预期的strace
那样,它使用本机解释器,但如果我使用交叉编译器,它就不起作用。
当前的常见问题解答说不能使用动态可执行文件:http : //gem5.org/Frequently_Asked_Questions但我不相信它,然后这些演示文稿提到了它:
但不是如何实际使用它。
QEMU 用户模式有这个-L
选项。
在 gem5 49f96e7b77925837aa5bc84d4c3453ab5f07408e 中测试
https://www.mail-archive.com/gem5-users@gem5.org/msg15582.html
我已经安装了 Gem5。我正在尝试进行完整的系统模拟。我添加了M5_PATH
echo "export M5_PATH==/home/sam/security/gem5/full/" >> ~/.bashrc
Run Code Online (Sandbox Code Playgroud)
我将所有系统映像和配置文件放在以下目录下:
:~/security/gem5/full$ ls
binaries configs config-x86.tar.bz2 disks x86-system.tar.bz2 x86-system.tar.bz2.1
Run Code Online (Sandbox Code Playgroud)
我将 SysPaths.py 文件中的路径更改为以下内容:
paths = [ '/dist/m5/system', 'full' ]
Run Code Online (Sandbox Code Playgroud)
并在 Benchmark.py 中更新了以下行
return env.get('LINUX_IMAGE', disk('linux-x86.img'))
Run Code Online (Sandbox Code Playgroud)
Gem5 已成功编译,我正在运行以下命令:
./build/X86/gem5.opt configs/example/fs.py --disk-image=/home/sam/security/gem5/full/disks/linux-x86.img
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误,它找不到系统文件的路径。
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "build/X86/python/m5/main.py", line 438, in main
exec(filecode, scope)
File "configs/example/fs.py", line 335, in <module>
test_sys = build_test_system(np)
File "configs/example/fs.py", line 93, in build_test_system
cmdline=cmdline)
File "/home/sam/security/gem5/configs/common/FSConfig.py", line 614, in makeLinuxX86System
makeX86System(mem_mode, numCPUs, …
Run Code Online (Sandbox Code Playgroud) 我有一个使用英特尔内在函数的C应用程序,如:
__m128 _mm_add_ps (__m128 a, __m128 b)
__m128 _mm_sub_ps (__m128 a, __m128 b)
__m128 _mm_mul_ps (__m128 a, __m128 b)
__m128 _mm_set_ps (float e3, float e2, float e1, float e0)
void _mm_store_ps (float* mem_addr, __m128 a)
__m128 _mm_load_ps (float const* mem_addr)
Run Code Online (Sandbox Code Playgroud)
现在,我正在尝试修改我的应用程序,以便使用名为Gem5的模拟器使其在ARMv8上运行.所以,我开始寻找ARM内在函数,我发现了这个手册ARM®NEON™内在函数参考
好吧,我找到了算术内在函数,但是我对设置,存储和加载指令有点失落.
有ARM内在函数经验的人可以告诉我正确的内在函数吗?