标签: x86-64

如何在SMP上处理中断?

如何在SMP(Symmeteric多处理器/多核)机器上处理中断?是否只有一个或更多的内存管理单元?

假设在不同核心上运行的两个线程A和B触摸页面表中不存在的存储页面(同时),在这种情况下将出现页面错误并且从存储器引入新页面.

会发生什么事件的顺序是什么?如果有一个内存管理单元,哪个核心是转发到的页面错误?内核如何处理它?是否有多个内核实例,每个实例运行在不同的内核上?如果是这样,他们如何同步页面错误处理等事件?

c linux x86-64

25
推荐指数
3
解决办法
7814
查看次数

为什么这个内存地址%fs:0x28(fs [0x28])有一个随机值?

我写了一段C代码,我已经拆解了它,并阅读了寄存器以了解程序在汇编中的工作原理.

int test(char *this){
    char sum_buf[6];
    strncpy(sum_buf,this,32);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我一直在研究的代码是测试功能.当我反汇编输出我的测试功能时,我得到...

   0x00000000004005c0 <+12>:        mov    %fs:0x28,%rax
=> 0x00000000004005c9 <+21>:        mov    %rax,-0x8(%rbp)
... stuff ..
   0x00000000004005f0 <+60>:        xor    %fs:0x28,%rdx
   0x00000000004005f9 <+69>:        je     0x400600 <test+76>
   0x00000000004005fb <+71>:        callq  0x4004a0 <__stack_chk_fail@plt>
   0x0000000000400600 <+76>:        leaveq 
   0x0000000000400601 <+77>:        retq 
Run Code Online (Sandbox Code Playgroud)

我想知道的mov %fs:0x28,%rax是真正在做什么?

c gcc x86-64 buffer-overflow disassembly

25
推荐指数
1
解决办法
1万
查看次数

英特尔Skylake上的商店循环出乎意料的糟糕和奇怪的双峰性能

我看到一个简单的存储循环出乎意料地表现不佳,这个存储循环有两个存储:一个具有16字节的正向步长,另一个总是位于同一位置1,如下所示:

volatile uint32_t value;

void weirdo_cpp(size_t iters, uint32_t* output) {

    uint32_t x = value;
    uint32_t          *rdx = output;
    volatile uint32_t *rsi = output;
    do {
        *rdx    = x;
        *rsi = x;

        rdx += 4;  // 16 byte stride
    } while (--iters > 0);
}
Run Code Online (Sandbox Code Playgroud)

在汇编这个循环可能3看起来像:

weirdo_cpp:

...

align 16
.top:
    mov    [rdx], eax  ; stride 16
    mov    [rsi], eax  ; never changes

    add    rdx, 16

    dec    rdi
    jne    .top

    ret
Run Code Online (Sandbox Code Playgroud)

当访问的存储区域在L2中时,我希望每次迭代运行少于3个周期.第二个商店只是一直在同一个位置,应该添加一个周期.第一个商店意味着从L2引入一条线,因此每4次迭代也会驱逐一条线.我不确定你如何评估L2成本,但即使你保守估计L1只能在每个周期中执行以下操作之一:(a)提交商店或(b)从L2接收一行或(c)将一条线驱逐到L2,对于stride-16商店流,你会得到1 + 0.25 + …

optimization performance x86 assembly x86-64

25
推荐指数
2
解决办法
1629
查看次数

C++中的CPUID实现

我想知道这里的人是否有一些很好的C++ CPUID实现示例,可以从任何托管的.net语言中引用.

此外,如果不是这种情况,我应该知道X86和X64之间的某些实现差异吗?

我想使用CPUID获取我的软件运行的机器上的信息(crashreporting等...),我想尽可能保持所有内容的兼容性.

我问的主要原因是因为我在编写可能是所有机器指令的内容时总是菜鸟,尽管我有关于CPU寄存器的基本知识等等...

在人们开始告诉我谷歌之前:我在网上找到了一些例子,但通常他们并不打算允许来自托管代码的交互,并且没有一个示例针对X86和X64.大多数示例似乎都是特定于X86的.

c++ cpu assembly x86-64

24
推荐指数
2
解决办法
3万
查看次数

x87优于SSE的优点

我知道x87具有更高的内部精度,这可能是人们在它与SSE操作之间看到的最大差异.但我不得不怀疑,使用x87还有其他好处吗?我有-mfpmath=sse在任何项目中自动输入的习惯,我想知道我是否遗漏了x87 FPU提供的任何其他内容.

x86 sse x86-64 fpu x87

24
推荐指数
4
解决办法
6600
查看次数

与位置无关的代码的差异:x86 vs x86-64

我最近正在构建一个针对x86-64架构的特定共享库(ELF),如下所示:

g++ -o binary.so -shared --no-undefined ... -lfoo -lbar
Run Code Online (Sandbox Code Playgroud)

这失败,出现以下错误:

在制作共享对象时,不能使用对"本地符号"的重定位R_X86_64_32; 用-fPIC重新编译

当然,这意味着我需要将其重建为与位置无关的代码,因此它适合链接到共享库.

But this works perfectly well on x86 with exactly the same build arguments. So the question is, how is relocation on x86 different from x86-64 and why don't I need to compile with -fPIC on the former?

c linux x86 x86-64 elf

24
推荐指数
2
解决办法
5719
查看次数

在64位操作系统中在64位CPU上运行X86-64 Python是否有好处?

运行amd64构建的Python和扩展有什么好处?(这里为amd64编译了很多扩展.)我有一个i5处理器和Win7 64位,所以看起来它是合适的.但它听起来也像是有缺陷,测试版,不支持等.

它实际上是否提供了性能优势?在哪些方面?我将运行SciPy,NumPy等.我偶尔会遇到32位Python的"内存不足"错误,而我的机器有4 GiB的RAM.

如果不存在64位版本的软件包,是否可以在64位Python基础上安装win32软件包?

python 64-bit x86-64 windows-7

24
推荐指数
4
解决办法
2万
查看次数

如何在x86_64上保存寄存器以获取中断服务程序?

我正在看一个学校项目中的一些旧代码,并试图在我的笔记本电脑上编译它时遇到了一些问题.它最初是为旧的32位版本的gcc编写的.无论如何,我试图将一些程序集转换为64位兼容代码并遇到一些障碍.

这是原始代码:

pusha
pushl   %ds
pushl   %es
pushl   %fs
pushl   %gs
pushl   %ss
Run Code Online (Sandbox Code Playgroud)

pusha在64位模式下无效.那么在64位模式下,在x86_64汇编中执行此操作的正确方法是什么?

必须有一个原因,为什么pusha在64位模式下无效,所以我有一种感觉手动推送所有寄存器可能不是一个好主意.

assembly x86-64 isr

24
推荐指数
4
解决办法
2万
查看次数

将llvm .bc文件转换为人类可读的.ll文件

如何从二进制llvm bitcode(扩展名.bc)文件生成人类可读的llvm bitcode(扩展名.ll)?

c linux x86-64 llvm clang

24
推荐指数
1
解决办法
2万
查看次数

如果我不包含标题,为什么在调用函数之前清除 EAX?

在以下 C 代码中:

#include <stdio.h>
int main(void){getchar();}
Run Code Online (Sandbox Code Playgroud)

它产生以下汇编:

main:
        push    rbp
        mov     rbp, rsp
                 # no extra instruction here when header is included
        call    getchar
        mov     eax, 0
        pop     rbp
        ret
Run Code Online (Sandbox Code Playgroud)

但是,如果我不包含stdio.h在文件中,那么它仍然可以编译,但会添加看起来像随机mov eax, 0指令的内容:

在此处输入图片说明

这是编译器资源管理器:https : //godbolt.org/z/3fTcss。这只是“未定义行为”的一部分,还是有特殊原因将之前的指令call getchar添加到那里?

c assembly x86-64 calling-convention

24
推荐指数
1
解决办法
1624
查看次数