x86相关内容
我的目标是将静态结构加载到L1D缓存中。之后,使用这些结构成员执行一些操作,并在操作完成后运行invd以丢弃所有修改后的高速缓存线。因此,基本上我希望在缓存中创建一个安全的环境,以便在缓存中执行操作时,数据不会泄漏到RAM中。 为此,我有一个内核模块。在那里我给结构的成员设置了一些固定值。然后禁用抢占,禁用所有其他CPU的缓存(当前CPU除外),禁用中断,然后使用__builtin_pref
..
我在一篇论文中读到关于末级缓存的介绍。在引言中,有人说末级缓存有很多片。每个片就像一个传统的集关联缓存。根据集合索引和切片ID找到对应的缓存集合(如下图所示)。 我想检查我的服务器有多少个切片。以及每个片的信息(多少个缓存组、每个缓存组中有多少缓存行)。我在Google上搜索的方法是查看/sys/devices/system/cpu/cpu0/cache/index3文件夹下的缓存信息。
..
每一代新CPU都会引入一些新的指令集,如MMX、3DNOW、SSE等。 我有几个关于它们的一般性问题: 如果某些程序使用例如SSE指令,它是否可以在不支持SSE的CPU上运行? 如果是,是否意味着这些指令将更改为更多更简单的指令? 如果没有,这是否意味着这些新指令的真正性能影响将在几年后,届时大多数CPU将支持这种技术(因此不会有任何不兼容)? 当我编译一个经过优化的C++程序时
..
我有疑问,因为我的代码不工作。我正在实现一个运行下面代码的引导加载器,当我尝试加载它时,它只在少数情况下有效,如下所述。我的代码是下一个: ChangeGameState: mov cx, 00H ;Here I make a delay mov dx, 3240H ;. mov ah, 86H ;. int 15h
..
我想写一个IO密集型应用程序,没有底层操作系统,运行在x86体系结构上,并驱动任何现代网络接口控制器。 通过查看Linux的驱动程序源代码,我知道驱动Intel e1000e千兆控制器需要数千行代码。我认为这样的代码很难从Linux源代码中提取出来。 您知道有什么解决方案/项目提供驱动当今计算机(包括其网卡)的方法,可能是通过包装Linux驱动程序吗? 非常感谢 推荐答案
..
我将分支目标与NOP对齐,有时CPU执行这些NOP,最多15个NOP。Skylake一个周期可以执行多少个1字节的NOP?其他英特尔兼容的处理器,比如AMD呢?我不仅对Skylake感兴趣,而且对其他微体系结构也感兴趣。执行15个NOP的序列可能需要多少个周期?我想知道添加这些NOP所带来的额外代码大小和额外执行时间是否物有所值。添加这些NOP的不是我,而是每当我编写align指令时自动添加这些N
..
用于整数除法的硬件指令在历史上一直非常慢。例如,对于64位输入,Skylake上的DIVQ延迟为42-95个周期[1](倒数吞吐量为24-90)。 不过,也有性能更好的较新处理器:Goldmont有14-43个延迟,而Ryzen有14-47个延迟[1],M1的吞吐量显然是每个分频2个时钟周期[2],甚至Raspberry Pico也有每个内核的8周期带符号/无符号分频/模数电路(尽管这似乎是
..
当我在https://godbolt.org上尝试不同的编译器时,我注意到编译器生成如下代码是非常常见的: push rax push rbx push rcx call rdx pop rcx pop rbx pop rax 我知道每个push或pop做两件事: 将操作数移入/移出堆栈空间 递增/递减堆栈指针(RSP) 因此
..
我一直在阅读x86内存模型的工作原理和x86上屏障指令的重要性,并将其与其他体系结构(如ARMv8)进行比较。在x86和ARMv8体系结构中,似乎(没有双关语意思)内存模型尊重传递性/累积性,即,如果CPU1通过CPU0看到存储,并且CPU2通过CPU1看到只有在CPU1看到CPU0存储时才可能发生的存储,那么CPU2也必须看到CPU0的存储。我提到的例子是Paul McKenney的著名论文6.
..
我想知道这个x86寄存器标志在DOS/Windows程序调试中的含义: 辅助进位(AC = 1或NA = 0) 它与公共进位的含义相同吗?(CY = 1或NC = 0) 推荐答案 当指令导致进位或借出位3时,设置辅助进位标志。与CY的概念相同,只是用于字节中的低位半字节的高位。缩写AC是旧式,该标志在英特尔处理器手册中命名为“AF”,是“调整标志”的缩写。它被少数执行BCD
..
我没有这个词的真正意义上的问题,而是我将尝试澄清一个内容问题。假设我们有一个微内核(PC Intel x86;32位保护模式),对于每个CPU异常,都使用中断描述符表(IDT)和中断服务例程(ISR)。如果出现Division by Zero异常,则ISR调用成功。 global ir0 extern isr_handler isr0: cli push 0x00 ;
..
英特尔recommends使用指令前缀缓解JCC错误的性能后果。 如果使用/QIntel-jcc-erratum编译MSVC,则遵循建议,并插入前缀指令,如下所示: 3E 3E 3E 3E 3E 3E 3E 3E 3E 48 8B C8 mov rcx,rax ; with redundant 3E prefixes They sayMSVC在前缀不可用时求助于NOPS。
..
我刚刚了解了超标量处理器(https://en.wikipedia.org/wiki/Superscalar_processor)。 我还了解到,随着超标量处理器在宽度/方式数量上的增加,事情变得更加复杂,复杂性增加得如此之快,以至于最好添加更多的内核,而不是更多的宽度。我的教练说,在4路和8路超标量之间增加更多的方式是不值得的。 这让我想知道:英特尔从哪里停止增加方法,开始增加内核?
..
为什么使用如此“奇怪”的寄存器大小?是否有任何文档说明为什么不建议对这些寄存器使用64位或128位? 推荐答案 Wikipedia page on the IEEE 754-1985 standard关于80位扩展格式有一个很好的解释: 该标准还建议使用扩展格式来执行 内部计算的精度高于 最终结果,以最大限度地减少舍入误差“ 双精度浮点数以64位表示。您可能需要更多的位以获得更
..
由于其TSO内存模型,x86保证了所有存储的总顺序。我的问题是,有没有人知道这实际上是如何实施的。 我对所有4个围栏是如何实施的印象很好,所以我可以解释当地的秩序是如何保持的。但4个栅栏只会给出程序顺序;它不会给您提供TSO(我知道TSO允许较旧的商店跳到新负载之前,因此只需要4个栅栏中的3个)。 在单个地址上的所有内存操作的总顺序是一致性的责任。但我想知道英特尔(尤其是Skylake)如
..
我最近在做一些内核编码,我发现了2个unistd.h文件。 第一个位置为/usr/include/asm/unistd.h。第二个来自内核的源代码:linux/include/uapi/asm-generic/unistd.h。 源代码的版本与我的内核的版本相同,但两个头文件 彼此不同。 /usr/include/asm/unistd.h(从我的电脑): #define __NR
..
在学习逆向工程时,我经常想到,因为我可以传递任何位置(我有权访问)作为参数,带有一些非硬编码或非确定性目标的跳转指令(因为它以前没有由程序明确定义)可以指向任何地方。因此,如果我用EAX加载一个基于比方说操作系统版本的字符串的值并执行jmp eax,那么任何试图生成控制流图的工具似乎都不知道目标在哪里(它可以基于您的当前环境,但这可能会导致程序中的一些中断路径)。 我错过了什么吗?因为如果我
..
我遇到了这样一个任务,即为我用汇编语言制作的程序构建一个Makefile(没有什么新奇的东西,比如Hello World)。该程序是在Linux 32位,我使用的是NASM汇编语言。到目前为止,我只能找到C程序的Makefile,我知道它们之间没有太大区别,但我不熟悉这个东西。我所拥有的是: Program: main.o gcc -o Program main.o main.o:
..
在64位x86汇编NASM中,如何将单个字节从寄存器移到.data部分定义的内存位置? 我知道这很管用 global _main section .data quotient db 0x0, 0x0, 0x30, 0xa ; 3 digit + newline remainder db 0x0, 0x0, 0x30, 0xa; 3 digit + newline section .
..
给定以下代码: L1 db "word", 0 mov al, [L1] mov eax, L1 [L1]中的括号表示什么? 这个问题是关于NASM的。英特尔语法汇编的另一个主要特点是MASM风格,当不涉及寄存器时,括号的工作方式不同: 请参见Confusing brackets in MASM32 推荐答案 [L1]
..