Articles of x86

我怎么知道我是否可以用FMA指令集进行编译?

我已经看到了关于如何使用FMA指令集的问题,但是在我开始使用它们之前,我首先想知道我能否(我的处理器支持它们)。 我发现一篇文章说我需要看(在Linux上工作)的输出: more /proc/cpuinfo 找出。 我得到这个: processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 30 model name : Intel(R) Xeon(R) CPU X3470 @ 2.93GHz stepping : 5 cpu MHz : 2933.235 size : 8192 KB physical id : 0 siblings : 4 core id : 0 cpu cores : 4 apicid […]

对于80286机器(或任何没有内存页机制的机器)是否有可能使用unix或linux?

是否有可能为80286机器(或任何没有分页内存机制,但分段内存)的Unix操作系统? 80286是一个没有TLB的页表, 只有分段的虚拟内存和分段的内存保护。 这样的机器上可以有一个Linux吗? UPD:处理器是很旧的,所以我只问历史版本,而不是超现代的Linux 2.6.42.11或Solaris 13或FreeBSD 10或…

从中断返回时必须使用IRET吗?

IRET可以从堆栈中恢复寄存器,包括EFLAGS,ESP,EIP等等,但是我们也可以自己恢复寄存器。 例如,“movl”可以用来恢复%esp寄存器,“jmp”可以跳转指向存储在堆栈上的EIP的地址。 Linux内核通过IRET(所有中断)返回,这是一个权重指令。 一些内核操作(如上下文切换)经常发生。 IRET不是浪费吗?

如何在汇编程序中打开文件并进行修改?

我开始学习汇编,而我正在使用Unix。 我想打开一个文件,并在上面写上“Hello world”。 section.data textoutput db 'Hello world!', 10 lentext equ $ – textoutput filetoopen db 'hi.txt' section .text global _start _start: mov eax, 5 ;open mov ebx, filetoopen mov ecx, 2 ;read and write mode int 80h mov eax, 4 mov ebx, filetoopen ;I'm not sure what do i have to put here, what […]

将Cvariables的内容复制到一个寄存器(GCC)

由于我对GCC很新,所以在内联汇编代码中遇到了一个问题。 问题是我无法弄清楚如何将Cvariables( UINT32types)的内容复制到寄存器eax 。 我已经尝试了下面的代码: __asm__ ( // If the LSB of src is a 0, use ~src. Otherwise, use src. "mov $src1, %eax;" "and $1,%eax;" "dec %eax;" "xor $src2,%eax;" // Find the number of zeros before the most significant one. "mov $0x3F,%ecx;" "bsr %eax, %eax;" "cmove %ecx, %eax;" "xor $0x1F,%eax;" ); 不过mov $src1, %eax; […]

为什么分叉放慢我的应用程序

我的应用程序通过使用fork系统调用每隔100毫秒就会收到一个检查点。 但是,我注意到,当使用点检查(分叉)时,我的应用程序显着减慢。 我testing了拨号所用的时间,结果是1到2毫秒。 那么为什么fork会减慢我的应用程序呢。 请注意,我一次只保留1个检查点(分叉进程),并在每次取新检查点时closures以前的检查点。 另外,我的电脑有一个巨大的内存。 请注意,我的分叉进程在创build之后才会hibernate。 只有在回滚需要完成时才会唤醒。 所以,它不应该由操作系统安排。 我想到的一件事是,因为fork是一个写入时复制机制,所以每当我的应用程序修改一个页面时,都会出现页面错误。 但是,这是否会显着减慢应用程序? 没有检查点(分叉),我的应用程序在大约3.1秒内完成,使用它大约需要3.7秒。 任何想法,什么是放缓我的申请?

内存负载何时会导致x86-64 linux上的总线错误?

我曾经认为,x86-64支持未alignment的内存访问和无效的内存访问总是导致分段错误(可能除SIMD指令,如movdqa或movaps )。 不过最近我用普通的mov指令观察了总线错误。 这里是一个复制者: void test(void *a) { asm("mov %0, %%rbp\n\t" "mov 0(%%rbp), %%rdx\n\t" : : "r"(a) : "rbp", "rdx"); } int main() { test((void *)0x706a2e3630332d69); return 0; } (必须使用帧指针省略进行编译,例如gcc -O test.c && ./a.out )。 mov 0(%rbp), %rdx指令和地址0x706a2e3630332d69是从越野车程序的coredump中复制的。 将其更改为0会导致0x706a2e3630332d60错误,但只是与0x706a2e3630332d60alignment仍然是总线错误(我的猜测是它与x86-64上的地址空间是48位有关)。 问题是:哪些地址导致总线错误(SIGBUS)? 是由架构决定还是由操作系统内核configuration(即在页表,控制寄存器或类似的东西)?

“呼叫0x80482f0 <puts @ plt>”? 只需要在x86汇编的“hello world”程序中澄清一行代码即可

“ call 0x80482f0 <puts@plt> ”? 只需要x86程序集中“hello world”程序中的一行代码就可以获得帮助。 注意:我正在运行ubuntu linux,同时编程/debugging这个,使用gcc作为编译器和gdb的debugging器。 我正在阅读Hacking:The Exploitation V2和我编译的这个C程序: 1 #include <stdio.h> 2 3 int main() 4 { 5 int i; 6 for(i=0; i<10; i++) 7 { 8 printf("Hello, world\n"); 9 } 10 return 0; 汇编成这个程序: 0x080483b4 <+0>: push ebp 0x080483b5 <+1>: mov ebp,esp 0x080483b7 <+3>: and esp,0xfffffff0 0x080483ba <+6>: sub esp,0x20 […]

用mmap和munmap实现你自己的malloc / free

我已经实现了自己的malloc和免费使用mmap 。 现在,因为不像free , munmap也把长度作为参数,所以我把length作为附加信息放在映射的内存中。 下面显示了我的malloc和free的代码。 我想问,如果这个代码是好的,或者我仍然错过任何东西或者做错了一些事情。 void * malloc ( size_t size ) { int *plen; int len = size + sizeof( size ); // Add sizeof( size ) for holding length. plen = mmap( 0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 ); *plen = len; // First 4 bytes contain […]

执行二进制文件

我下载了一个用GCC 4.4.4编译的二进制文件(一个C程序),用于x86-64 Red Hat Linux。 当我尝试在运行GCC 4.2.1的Mac OS X(运行Lion,所以也是x86-64)上运行它时,它会说: cannot execute binary file ,这是cannot execute binary file吗? 它无法将其检测为二进制文件。 为什么会这样做? 我相信因为这个文件已经被编译了,所以gcc的版本跟这个没什么关系。 它已被编译为两台机器运行的x86-64。 有人可以解释吗?