Articles of x86 64

Linux:大型int数组:mmap vs查找文件?

假设我有一个数据集,它是一个存储在4TB HDD ext4文件系统文件中的1e12 32位整数(4 TB)数组。 考虑到数据很可能是随机的(或者至less似乎是随机的)。 // pseudo-code for (long long i = 0; i < (1LL << 40); i++) SetFileIntAt(i) = GetRandInt(); 此外,考虑我希望以不可预知的顺序读取单个int元素,并且algorithm运行不确定(正在进行)。 // pseudo-code while (true) UseInt(GetFileInt(GetRand(1<<40))); 我们在Linux x86_64上,gcc。 您可以假设系统具有4GB的RAM(即比数据集小1000倍) 以下是架构访问的两种方法: (A)将文件映射到4TB的内存块,并以int数组的forms访问它 (B)打开(2)文件并使用seek(2)和read(2)来读取整数。 A和B哪个会有更好的performance?为什么? 还有另一种devise能比A或B提供更好的性能吗?

编译器:了解从小程序生成的汇编代码

我正在研究编译器是如何工作的。 我正在通过阅读从小型64位Linux程序反汇编生成的代码来学习。 我写了这个C程序: #include <stdio.h> int main() { for(int i=0;i<10;i++){ int k=0; } } 使用objdump后,我得到: 00000000004004d6 <main>: 4004d6: 55 push rbp 4004d7: 48 89 e5 mov rbp,rsp 4004da: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0 4004e1: eb 0b jmp 4004ee <main+0x18> 4004e3: c7 45 fc 00 00 00 00 mov DWORD […]

查找哪个汇编指令在未经debugging的情况下导致非法指令错误

在运行程序集时,我得到Illegal instruction错误。 有没有办法知道哪个指令导致错误,没有debugging,因为我正在运行的机器没有debugging器或任何开发系统。 换句话说,我在一台机器上编译并运行另一台机器。 我不能在我正在编译的机器上testing我的程序,因为它们不支持SSE4.2。 我正在运行程序的机器确实支持SSE4.2指令。 我认为这可能是因为我需要告诉汇编程序(YASM)识别SSE4.2指令,就像我们通过将-msse4.2标志传递给gcc一样。 或者你认为它不是原因? 任何想法如何告诉YASM识别SSE4.2指令? 也许我应该捕获SIGILL信号,然后解码SA_SIGINFO,看看程序做了什么样的非法操作。

在x86(32位)Linux上启动x86_64代码,在x86_64 CPU上运行

?是否可以在i686 Linux(x86,32位)上启动x86_64代码? 我的CPU是现代Core 2,它本身可以运行x86_64 64位代码,但操作系统是32位。 开始的代码是纯math的,它几乎不需要与操作系统交互。 我想测量,与32位模式相比,我的程序在64位模式下速度有多快。 该scheme是解决巨大的组合问题,全尺寸运行几十个小时。 我可以用qemu启动64位代码,但是它不会在本机执行,而且在qemu中的速度与真实的cpu速度无关。

(x86_64 linux程序集)为什么使用float格式string的printf只能与rsp%0x10 = 0一起工作

我在x86_64 linux汇编程序上写了一个printf调用的问题。 如果我尝试在rsp % 0x10 != 0时打印一个double值,那么printf将会出现段错误。 看看我的代码(nasm语法): [bits 64] global _start extern printf extern pow section .data printf_format db '%lf', 10, 0 section .text _start: mov rbp, rsp sub rsp, MEM_VAL mov rax, 0x4000000000000000 mov qword [rsp], rax movsd xmm0, qword [rsp] mov rdi, printf_format mov rax, 1 call printf mov rax, 60 mov […]

GCC:putchar(char)inline assembly

溢出, 我怎么才能实现使用内联汇编的putchar(char)过程? 我想在x86-64程序集中做到这一点。 我这样做的原因是实现我自己的标准库(或至less它的一部分)。 这是我到目前为止: void putchar(char c) { /* your code here: print character c on stdout */ asm(…); } void _start() { /* exit system call */ asm("mov $1,%rax;" "xor %rbx,%rbx;" "int $0x80" ); } 我正在编译: gcc -nostdlib -o putchar putchar.c 感谢您的帮助!

在Linux中轻松检查英特尔汇编操作码

我一直在寻找一种实用的工具,可以在Linux中打印任何英特尔64位或32位指令的操作码,例如。 像DOS中的Hiew's汇编程序。 基于networking的服务也是一个select。 因为我找不到任何东西,所以我创build了自己的bash脚本,它从命令行参数(指令[s]和<32/64>)创build汇编源文件,编译,链接和反汇编,并显示正确拆卸行。 但是,是否已经有一些程序能够显示任何给定指令的所有可能的编码,例如。 对于mov eax,ebx ? 我使用nasm , ld和ndisasm显然只给每个指令一个可能的编码。 通过这个脚本,我可以得到nasm用于64位和32位代码的编码,例如: /home/user/code/asm$ showop 'nop;add eax,ebx;cpuid' 64 00000000 90 nop 00000001 01D8 add eax,ebx 00000003 0FA2 cpuid 但是,我怎样才能轻松获得所有可能的操作码编码? 有没有可用的程序? 代码如下: #!/bin/bash # usage: showop instructions bits asminstr=$1 bits=$2 # asminstr="nop;nop;nop;nop;add eax,ebx;nop;nop;nop" # bits=64 numberofinstr=`echo $asminstr | grep -o ";" | wc -l` ((numberofinstr++)) if [ […]

是否有可能中断一个进程和检查点,以便稍后恢复?

比方说,你有一个应用程序,它正在消耗所有的计算能力。 现在你想做一些其他必要的工作。 Linux上有什么办法可以中断那个应用程序和检查点的状态,以便稍后可以从它被中断的状态恢复。 特别是我感兴趣的方式,应用程序可以停止并在另一台机器上重新启动。 这可能吗?

为什么这个内联程序集不工作?

对于下面的代码: long buf[64]; register long rrax asm ("rax"); register long rrbx asm ("rbx"); register long rrsi asm ("rsi"); rrax = 0x34; rrbx = 0x39; __asm__ __volatile__ ("movq $buf,%rsi"); __asm__ __volatile__ ("movq %rax, 0(%rsi);"); __asm__ __volatile__ ("movq %rbx, 8(%rsi);"); printf( "buf[0] = %lx, buf[1] = %lx!\n", buf[0], buf[1] ); 我得到以下输出: buf[0] = 0, buf[1] = 346161cbc0! […]

为什么这个movq指令工作在linux上而不是osx?

以下汇编代码在OSX 10.9.4上运行时出现错误,但在Linux(Debian 7.6)上成功运行。 特别是,movq指令似乎不喜欢标签参数。 $ cat test.S .globl _main _main: movq $_main, %rax ret 这是错误: $ as -o test.o test.S test.S:3:32-bit absolute addressing is not supported for x86-64 test.S:3:cannot do signed 4 byte relocation 将第3行中的$_main更改$_main像$10这样的文字可以正常工作。 代码必须以非常小的方式进行修改,才能使其在Linux上运行 – 只需从标签中删除下划线即可。 $ cat test.S .globl main main: movq $main, %rax ret 独立validation代码在Linux上工作是非常容易的: $ as -o test.o test.S $ […]