如何在SMP(Symmeteric多处理器/多核)机器上处理中断?是否只有一个或更多的内存管理单元?
假设在不同核心上运行的两个线程A和B触摸页面表中不存在的存储页面(同时),在这种情况下将出现页面错误并且从存储器引入新页面.
会发生什么事件的顺序是什么?如果有一个内存管理单元,哪个核心是转发到的页面错误?内核如何处理它?是否有多个内核实例,每个实例运行在不同的内核上?如果是这样,他们如何同步页面错误处理等事件?
我写了一段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是真正在做什么?
我看到一个简单的存储循环出乎意料地表现不佳,这个存储循环有两个存储:一个具有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 + …
我想知道这里的人是否有一些很好的C++ CPUID实现示例,可以从任何托管的.net语言中引用.
此外,如果不是这种情况,我应该知道X86和X64之间的某些实现差异吗?
我想使用CPUID获取我的软件运行的机器上的信息(crashreporting等...),我想尽可能保持所有内容的兼容性.
我问的主要原因是因为我在编写可能是所有机器指令的内容时总是菜鸟,尽管我有关于CPU寄存器的基本知识等等...
在人们开始告诉我谷歌之前:我在网上找到了一些例子,但通常他们并不打算允许来自托管代码的交互,并且没有一个示例针对X86和X64.大多数示例似乎都是特定于X86的.
我知道x87具有更高的内部精度,这可能是人们在它与SSE操作之间看到的最大差异.但我不得不怀疑,使用x87还有其他好处吗?我有-mfpmath=sse在任何项目中自动输入的习惯,我想知道我是否遗漏了x87 FPU提供的任何其他内容.
我最近正在构建一个针对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?
运行amd64构建的Python和扩展有什么好处?(这里为amd64编译了很多扩展.)我有一个i5处理器和Win7 64位,所以看起来它是合适的.但它听起来也像是有缺陷,测试版,不支持等.
它实际上是否提供了性能优势?在哪些方面?我将运行SciPy,NumPy等.我偶尔会遇到32位Python的"内存不足"错误,而我的机器有4 GiB的RAM.
如果不存在64位版本的软件包,是否可以在64位Python基础上安装win32软件包?
我正在看一个学校项目中的一些旧代码,并试图在我的笔记本电脑上编译它时遇到了一些问题.它最初是为旧的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位模式下无效,所以我有一种感觉手动推送所有寄存器可能不是一个好主意.
如何从二进制llvm bitcode(扩展名.bc)文件生成人类可读的llvm bitcode(扩展名.ll)?
在以下 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添加到那里?