Articles of x86 64

预取数据以cachingx86-64

在我的应用程序中,我需要在一个连续的大块内存数据(100 MB的MB)上进行计算。 我当时的想法是保持预取程序将在未来触及的块的部分,以便在对该部分执行计算时,数据已经在caching中。 有人可以给我一个简单的例子,说明如何用gcc实现这个function吗? 我在某处读_mm_prefetch ,但不知道如何正确使用它。 另外请注意,我有一个多核系统,但是每个核心将并行处理不同的内存区域。

在运行时将代码注入可执行文件

我正在研究应用程序(使用C ++编写),它在运行时生成一些机器代码(现在是Linux,x86-64,但是我打算在ARM上迁移)。 接下来,它将生成的代码存储在内存中并通过跳转到内存位置来执行它。 很长一段时间,我在分配可执行内存时遇到了一个问题,但是我终于解决了这个问题: uint8_t *memory = mmap (NULL, length, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 到目前为止它工作,但我不知道是否这是做这种事情的优雅方式。 我不知道如何可执行文件加载程序这样做

Intel x86与x64系统调用

我正在阅读有关x86和x64之间的组装差异。 在x86上,系统调用号被放在eax ,然后执行int 80h来产生一个软件中断。 但在x64上,系统调用号被置于rax ,然后执行syscall 。 我被告知syscall比生成软件中断更轻更快。 为什么它在x64比x86更快,我可以使用int 80h在x64上进行系统调用?

共享库是否与应用程序使用相同的堆?

假设我在Linux中有一个使用共享库( .so文件)的应用程序。 我的问题是,这些库中的代码是否将分配与主应用程序相同的堆内存,或者他们使用自己的堆? 因此,例如, .so文件中的某个函数调用malloc ,它会使用与应用程序相同的堆pipe理器还是另一个? 另外,那些共享内存中的全局数据呢? 它在哪儿撒谎? 我知道应用程序位于bss和数据段,但不知道这些共享对象文件的位置。

内存访问错误sys_rt_sigaction(信号处理程序)

在这个接口Linux信号文章之后,我一直试图在amd64中使用sys_rt_sigaction ,但是在发送信号时总是得到内存访问错误 。 当使用C / C ++函数sigaction时, struct sigaction起作用。 sys_rt_sigaction调用有什么错误? 带有ASM代码的C / C ++: #include<signal.h> #include<stdio.h> #include<time.h> void handler(int){printf("handler\n");} void restorer(){asm volatile("mov $15,%%rax\nsyscall":::"rax");} struct sigaction act{handler}; timespec ts{10,0}; int main(){ act.sa_flags=0x04000000; act.sa_restorer=&restorer; //* asm volatile("\ mov $13,%%rax\n\ mov %0,%%rdi\n\ mov %1,%%rsi\n\ mov %2,%%rdx\n\ mov $8,%%r10\n\ syscall\n\ mov %%rax,%%rdi\n\ mov $60,%%rax\n\ #syscall\n\ "::"i"(7),"p"(&act),"p"(0):"rax","rdi","rsi","rdx","r10"); /**/ /* sigaction(7,&act,0); […]

如何得到一个“回溯”(如gdb)只使用ptrace(Linux,x86 / x86_64)

我想像gdb那样得到一个类似于backtrace的输出。 但我想直接通过ptrace()来做到这一点。 我的平台是Linux,x86; 和后来的x86_64。 现在我只想从堆栈中读取返回地址,而不用转换成符号名称。 所以,对于testing程序,由gcc-4.5在-O0模式下gcc-4.5 : int g() { kill(getpid(),SIGALRM); } int f() { int a; int b; a = g(); b = a; return a+b; } int e() { int c; c = f(); } main() { return e(); } 我将开始我的程序,并与ptrace连接,以开始testing程序。 然后,我会做PTRACE_CONT并等待信号。 当testing程序会做自杀时, 信号将被传送到我的程序。 这时我要读取返回地址,他们会像(因为kill函数此刻被激活): 0x00_some_address_in_g 0x00_some_address_in_f 0x00_some_address_in_e 0x00_some_address_in_main 0x00_some_address_in__libc_start_main 如何find当前停止的testing过程的返回地址与ptrace ? 会有帧循环? […]

什么是x86-64长两倍?

有人告诉我说: 在x86-64下,FPalgorithm是用SSE完成的,因此long double是64位。 但是在x86-64 ABI中它说: C type | sizeof | alignment | AMD64 Architecture long double | 16 | 16 | 80-bit extended (IEEE-754) 请参阅: amd64-abi.pdf 和gcc说sizeof(long double)是16,并给FLT_DBL = 1.79769e+308和FLT_LDBL = 1.18973e+4932 所以我很困惑, long double 64比特怎么样? 我认为这是一个80位的代表。

你可以在内核模式之外inputx64的32位“长兼容性子模式”吗?

这可能是一个确切的重复是否有可能通过执行模式切换在64位进程中执行32位代码? ,但这个问题是从一年前,只有一个答案,不给任何源代码。 我希望得到更详细的答案。 我正在运行64位Linux(Ubuntu 12.04,如果重要的话)。 这里有一些代码分配一个页面,写入一些64位的代码,并执行该代码。 #include <assert.h> #include <malloc.h> #include <stdio.h> #include <sys/mman.h> // mprotect #include <unistd.h> // sysconf unsigned char test_function[] = { 0xC3 }; // RET int main() { int pagesize = sysconf(_SC_PAGE_SIZE); unsigned char *buffer = memalign(pagesize, pagesize); void (*func)() = (void (*)())buffer; memcpy(buffer, test_function, sizeof test_function); // func(); // will […]

为什么Linux / GNU链接器select地址0x400000?

我正在试验ELF可执行文件和Linux x86_64上的gnu工具链: 我已经链接并剥离了一个“Hello World”testing。 .global _start .text _start: mov $1, %rax … 到一个267字节的ELF64可执行文件… 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF………… 0000010: 0200 3e00 0100 0000 d400 4000 0000 0000 ..>…….@….. 0000020: 4000 0000 0000 0000 0000 0000 0000 0000 @…………… 0000030: 0000 0000 4000 3800 0100 4000 0000 0000 ….@.8…@….. 0000040: 0100 […]

在64位Linux&64位处理器上运行32位汇编代码:解释exception

我在一个有趣的问题。我忘了我正在使用64位机器和操作系统,并写了一个32位汇编代码。 我不知道如何写64位代码。 这是Linux上Gnu Assembler(AT&T语法)的x86 32位汇编代码。 //hello.S #include <asm/unistd.h> #include <syscall.h> #define STDOUT 1 .data hellostr: .ascii "hello wolrd\n"; helloend: .text .globl _start _start: movl $(SYS_write) , %eax //ssize_t write(int fd, const void *buf, size_t count); movl $(STDOUT) , %ebx movl $hellostr , %ecx movl $(helloend-hellostr) , %edx int $0x80 movl $(SYS_exit), %eax //void _exit(int status); […]