cpu-architecture相关内容

写时复制期间父进程是否会失去写能力?

假设我们有一个特定的父进程,内存中存储了一些任意数量的数据,我们使用 fork 来生成一个子进程.我了解,为了让操作系统在写入时执行复制,内存中包含我们正在修改的数据的特定页面将设置其只读位,并且操作系统将使用孩子尝试时将导致的异常修改数据以将整个页面复制到内存中的另一个区域,以便孩子获得自己的副本.我不明白的是,如果内存中的特定部分被标记为只读,那么数据最初所属的父进程也无法修改数据.那么这整个 ..

为什么 32 位应用程序可以在 64 位 x86 CPU 上运行?

32 位应用程序可执行文件包含 32 位 CPU 的机器代码,但是 32 位和 64 位 Intel CPU 的程序集和内部架构(寄存器数量、寄存器宽度、调用约定)不同,所以如何32 位 exe 在 64 位机器上运行? 维基百科的 x86-64 文章说: x86-64 完全向后兼容 16 位和 32 位 x86 代码.因为完整的 x86 16 位和 32 位指令集仍然在硬件中实现而没 ..

TLB 未命中与缓存未命中?

有人能解释一下 TLB(翻译后备缓冲区)未命中和缓存未命中之间的区别吗? 我相信我发现 TLB 指的是某种虚拟内存地址,但我并不太清楚这究竟意味着什么? 我了解当内存块(缓存行的大小)加载到(L3?)缓存中并且如果当前缓存行中未保存所需地址时会导致缓存未命中 - 这是缓存未命中. 解决方案 嗯,今天所有的现代操作系统都使用一种叫做虚拟内存的东西.CPU生成的每个地址都是虚拟的. ..

是否严格要求组装以制造“最低"的?操作系统的一部分?

我是一名中级(抽象)程序员,几个月前我开始考虑是否应该减少或增加抽象(我选择减少). 现在,我认为我已经完成了大部分关于我需要什么的“研究",但仍有一些问题. 现在我“实际上什么都不做",我只是加强我的 C 技能(买了“K&RC Programing Lang"),我想(在感觉舒服之后)开始学习操作系统(比如 minix)只是为了学习目的,但我有一个想法卡在我的脑海里,我真的不知道我是 ..
发布时间:2022-01-11 23:14:22 其他开发

SMP 内核、进程和线程如何精确地协同工作?

在单核 CPU 上,每个进程都在操作系统中运行,并且 CPU 从一个进程跳到另一个进程以充分利用自身.一个进程可以有很多线程,在这种情况下,CPU 在各个进程上运行时会通过这些线程运行. 现在,在多核 CPU 上: 核心是在每个进程中一起运行,还是核心可以在一个特定时间点在不同进程中单独运行?例如,您有程序 A 运行两个线程.双核 CPU 可以运行这个程序的两个线程吗?如果我们使用 O ..

armeabi 和 armeabi-v7a 的区别

据我所知,Android NDK 中两种支持的 ARM 架构风格之间的区别仅在于支持的 CPU 指令集.真的是这样吗?调用约定、系统调用顺序或其他方面没有区别吗? 我想知道如果我将模块编译为 ARM 目标文件(使用 NDK 以外的编译器 - 特别是 Free Pascal),将 ARMv6 指定为架构,然后将其链接到 armeabi 和 armeabi-v7a 会发生什么共享库.FPC 位不 ..
发布时间:2022-01-10 23:58:45 移动开发

负数作为2的补码存储在内存中,CPU如何知道它是负数还是正数?

-1 可以用 4 位二进制表示为(2 的补码)1111 15 也表示为 1111. 那么,当 CPU 从内存中获取值时,它是如何区分 15 和 -1 的呢? 解决方案 当一个字节从一个地方移动到另一个地方时,CPU 并不关心它是保持 -1 还是 15.没有“签名移动"之类的东西(到相同大小的位置 - 更大或更小的目的地都有签名移动). CPU 仅在对字节进行算术运算时才关 ..
发布时间:2022-01-09 19:34:20 其他开发

R 在 RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP 中代表什么?

x86 汇编语言不得不改变,因为 x86 处理器架构已经从 8 位变为 16 位,再到 32 位和现在的 64 位. 我知道在 32 位汇编寄存器名称(EAX、EBX 等)中,每个名称的前缀 E 代表 Extended 表示寄存器的 32 位形式而不是 16 位形式(AX、BX 等).). 这些寄存器名称的 R 前缀在 64 位中代表什么? 解决方案 我认为它只是 R 代表“寄 ..
发布时间:2022-01-06 13:13:01 其他开发

从内存加载寄存器时是否可以“中止"而不是触发页面错误?

我正在考虑“最小化页面“行走"大图时出现故障(和 TLB 故障)' '如何知道一个指针是否在物理内存中,否则会触发 Page Fault?' 是一个从另一面看问题的相关问题,但没有解决方案. 我希望能够将一些数据从内存加载到寄存器中,但如果内存当前已被分页,则加载会中止而不是出现页面错误.我需要代码在 Windows 和 Linux 上的用户空间中工作,而无需任何非标准权限. ( ..
发布时间:2022-01-06 13:09:13 其他开发

为什么使用 ebp 比使用 esp 寄存器更好地定位堆栈上的参数?

我是 MASM 的新手.我对这些指针寄存器感到困惑.如果你们能帮助我,我将不胜感激. 谢谢 解决方案 使用 [ebp + disp8] 编码寻址模式比 [esp+disp8] 短一个字节>,因为使用 ESP 作为基址寄存器需要一个 SIB 字节.有关详细信息,请参阅rbp 不允许作为 SIB 基础?.(该问题的标题是关于 [ebp] 必须被编码为 [ebp+0] 的事实.) 第 ..
发布时间:2022-01-06 13:09:06 其他开发

如何强制cpu核心刷新c中的存储缓冲区?

我有一个应用程序,它有 2 个线程,线程 A 与核心 1 的关联性和线程 B 与核心 2 的关联性,核心 1 和核心 2 在同一个 x86 插槽中. 线程 A 对整数 x 进行忙自旋,线程 B 在某些条件下会增加 x,当线程 B 决定增加 x 时,它会使 x 所在的缓存行无效,并根据 x86 MESI 协议存储新的 x在 core2 接收到 invalidate ack 之前存储缓冲区,然后 ..
发布时间:2022-01-06 13:04:38 其他开发

存储缓冲区和行填充缓冲区如何相互作用?

我正在阅读 MDS 攻击论文RIDL:Rogue In-Flight Data Load.他们讨论了 Line Fill Buffer 如何导致数据泄漏.有 关于 RIDL 漏洞和“重播"加载问题,讨论漏洞利用的微架构细节. 阅读该问题后,我不清楚的一件事是,如果我们已经有存储缓冲区,为什么还需要行填充缓冲区. John McCalpin 在 WC-buffer 如何与 LFB 相关联 ..

什么特别将 x86 缓存行标记为脏 - 任何写入,或者是否需要显式更改?

这个问题专门针对现代 x86-64 缓存一致性架构 - 我很欣赏其他 CPU 上的答案可能会有所不同. 如果我写入内存,MESI 协议要求先将缓存行读入缓存,然后在缓存中修改(将值写入缓存行,然后将其标记为脏).在较旧的 write-though 微架构中,这将触发缓存线被刷新,在回写下,被刷新的缓存线可能会延迟一段时间,并且在两种机制下都可能发生一些写组合(更可能是写回).而且我知道这如何 ..
发布时间:2022-01-06 13:02:43 其他开发

为什么 RDTSC 不是序列化指令?

关于 RDTSC 指令的英特尔手册警告说乱序执行RDTSC 实际执行时可以改变,所以他们建议在它前面插入一条 CPUID 指令,因为 CPUID 会序列化指令流(CPUID 永远不会乱序执行).我的问题很简单:如果他们有能力使指令序列化,他们为什么不进行 RDTSC 序列化?它的全部意义似乎是获得周期准确的计时.是否存在您不想想在它前面加上序列化指令的情况? 较新的 Intel CPU 有一 ..
发布时间:2022-01-06 13:01:20 其他开发

陷阱和中断有什么区别?

陷阱和中断有什么区别? 如果不同系统的术语不同,那么它们在 x86 上的含义是什么? 解决方案 A 陷阱 是用户进程中的异常.它是由除以零或无效的内存访问引起的.这也是调用内核例程(系统调用)的常用方法,因为那些以更高优先于用户代码.处理是同步的(因此用户代码被挂起并在之后继续).从某种意义上说,它们是“主动的"——大多数时候,代码期望陷阱发生并依赖于这个事实. 中断 是由硬件 ..
发布时间:2022-01-06 12:59:24 其他开发

使用时间戳计数器测量内存延迟

我编写了以下代码,它首先刷新两个数组元素,然后尝试读取元素以测量命中/未命中延迟. #include #include #include #include int main(){/* 创建数组 */整数数组[100];国际我;for ( i = 0; i 缓存未命中_mm_fence();t2 = __rdtsc();//设置停止时间_mm_fence();差异1 = t2 - t1;//两个栅 ..
发布时间:2022-01-06 12:56:25 其他开发

英特尔的 CLWB 指令使缓存行无效

我正在尝试为 Intel 的 clwb 指令找到不会使缓存行无效的配置或内存访问模式.我正在使用 NVDIMM 对 Intel Xeon Gold 5218 处理器进行测试.Linux 版本是 5.4.0-3-amd64.我尝试使用 Device-DAX 模式并直接将此字符设备映射到地址空间.我还尝试将此非易失性内存添加为新的 NUMA 节点,并使用 numactl --membind 命令将内存 ..
发布时间:2022-01-06 12:56:14 其他开发

x86 暂停指令如何在自旋锁中工作 * 和 * 是否可以用于其他场景?

pause 指令通常用于测试循环spinlock,当其他一些线程拥有自旋锁时,以减轻紧密循环.据说相当于一些NOP指令.有人能告诉我它究竟是如何用于自旋锁优化的吗?在我看来,即使是 NOP 指令也是浪费 CPU 时间.它们会降低 CPU 使用率吗? 另一个问题是我是否可以将暂停指令用于其他类似目的.例如,我有一个繁忙的线程,它不断扫描某些地方(例如队列)以检索新节点;然而,有时队列是空的,线 ..

为什么 Linux (x86) 的页面大小是 4 KB,这是如何计算的?

Linux 内核在 x86 架构上的默认内存页大小是 4 KB,我想知道它是如何计算的,为什么? 解决方案 默认页面大小由 CPU 的 MMU(内存管理单元)支持的内容决定.在 32 位保护模式下 x86 支持两种页面: 普通的,4 KiB 巨大的,4 MiB 并非所有 x86 处理器都支持大页面.需要有一个具有页面大小扩展 (PSE) 功能的 CPU.这不包括奔腾之前的处理 ..
发布时间:2022-01-06 12:51:02 服务器开发