- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以calloc()
通过向操作系统询问一些虚拟内存来工作。操作系统与 MMU 协同工作,并巧妙地以虚拟内存地址进行响应,该地址实际上映射到 copy-on-write, read-only page full of zeroes .当程序尝试写入该页面的任何位置时,就会发生页面错误(因为您无法写入只读页面),会创建该页面的副本,并且您的程序的虚拟内存被映射到这些全新的副本零。
既然 Meltdown 是一回事,操作系统已被修补,因此不再可能跨内核用户边界进行推测性执行。这意味着每当用户代码调用内核代码时,它都会有效地导致管道停顿。通常,当管道在循环中停滞时,对性能来说是毁灭性的,因为 CPU 最终会浪费时间等待数据,无论是来自缓存还是主内存。
鉴于此,我想知道的是:
calloc()
,并且重新映射到新的 CoW 页面,这是在执行内核代码吗? calloc()
分配 4GiB 的内存,然后在一个紧密的循环中用一些任意值(比如 0xFF
而不是 0x00
)初始化它,我的(Intel)CPU 每次写入新的内存时都会达到推测边界吗?页? 最佳答案
你的前提是错误的。页面错误从来没有流水线化/ super 便宜。但是,随着系统调用和所有其他用户-> 内核转换,Meltdown(和 Spectre)缓解确实使它们变得更加昂贵。
跨内核/用户边界的推测执行是不可能的 ; Intel CPU 不会重命名权限级别,即内核/用户转换始终需要完整的管道刷新。我认为您误解了 Meltdown:这纯粹是由用户空间和 delayed handling of the privilege checks on TLB hits 中的推测执行引起的。 .
这在 CPU 设计中是通用的,AFAIK。我不知道任何重命名特权级别或以其他方式推测内核代码、x86 或其他方式的微体系结构。
Meltdown 缓解增加的成本是进入内核会刷新 TLB。 (或者在具有 TLB 进程上下文 ID 支持的 CPU 上,内核可以使用 PCID 来使内核与用户空间使用单独的页表便宜得多)。
内核入口点(在 Linux 上)变成了一个蹦床,它交换页表并跳转到真正的内核入口点,以避免将内核 ASLR 偏移量暴露给用户空间。但除此之外还有一个额外的 mov cr3, reg
在进入和退出内核时(设置一个新的页表),没有其他任何改变。
(Spectre 缓解也很棘手,需要更多的更改,例如 retpolines ......并且还可能显着增加 user->kernel->user 的成本。关于页面错误成本的 IDK。)
@BeeOnRope 报告(见评论和他的完整细节回答)没有 Spectre 补丁,只应用了 Meltdown 补丁,但 nopti
“禁用”它的启动选项,增加了 Skylake CPU 上内核的往返成本(使用 syscall
和伪造的 RAX,立即返回 -ENOSYS
)从 ~100 到 ~300 个周期。所以这可能是蹦床的成本? 启用实际的页表隔离后,它上升到约 700 个周期 .那根本就没有 Spectre 缓解补丁。 (此外,这是 x86-64 syscall
入口点,而不是页面错误。不过它们可能很相似。)
缺页异常 :
CPU 不会预测页面错误,因此无论如何它们都无法推测性地执行处理程序 .页面错误入口点的预取或解码可能会在管道刷新时发生,但该过程在页面错误指令试图退出之前不会启动。错误的加载/存储被标记为在退出时生效,并且不会重新引导前端; Meltdown 的整个关键是在故障负载达到退役之前缺乏对它的操作。
相关:When an interrupt occurs, what happens to instructions in the pipeline?
另外:Out-of-order execution vs. speculative execution有一些关于哪种推测真正导致 Meltdown 以及 CPU 如何处理故障的详细信息。
When a program writes to a never-before-accessed page which was allocated with
calloc()
, and the remapping to the new CoW page occurs, is this executing kernel code?
If I call calloc() to allocate 4GiB of memory, then initialize it with some arbitrary value (say, 0xFF instead of 0x00) in a tight loop, is my (Intel) CPU going to be hitting a speculation boundary every time it writes to a new page?
mmap(MAP_POPULATE)
进行分配在 Linux 系统上将所有页面预置到硬件页表中。我不确定
madvise
可以为您预置页面,例如
madvise(MADV_WILLNEED)
在已经映射的区域上。但是
madvise(MADV_HUGEPAGE)
将鼓励内核使用匿名大页面(并且可能对物理内存进行碎片整理以释放连续的 2M 块以启用该功能,如果您没有将其配置为在没有
madvise
的情况下执行此操作)。
perf
在带有 KPTI 补丁的 Linux 内核上的结果。
关于performance - Meltdown 缓解与 `calloc()` s CoW "lazy allocation"相结合,是否意味着 calloc() 分配的内存会受到性能影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50191769/
我在 OS X 中构建菜单栏项时找到了一些示例代码。它使用了单个 |我不确定它的实际含义。 (我想做的是在菜单项左键单击时调用一个函数,但在右键单击时显示菜单) 这是我的代码 //Get refere
为什么它在第 23 行抛出编译错误。'a' 是 Apple 类的对象,col 是包含 Apple 对象的列表,但它仍然是抛出下面提到的编译错误: 类型 Collection 中的方法 add(capt
我有一个类A,它扩展了抽象类B。 让B有一个 protected 字段值 我想在 A 中使用这个字段。如果 A 没有 value,我可以编写 this.value 从 B 获取它。 与super.va
DBLint 用于检查数据库状态。有46条规则。在 www.dblint.org 上对每条规则都有一些简单的解释,但对规则 31 的描述如下: 定义的主键不是最小键:主键是最小的 super 键。如果
var aa: (()?) = (john.residence?.address = someAddress) var bb: ()? = john.residence?.printNumberOfR
我对 jquery 的可重用插件有点陌生。我已经多次遇到这段代码,但无法弄清楚究竟发生了什么。 (function( $ ){ ... })( jQuery ); 谁能帮我解答一下吗? 最佳答案
这个问题已经有答案了: int foo (int argc, ...) vs int foo() vs int foo(void) in C (4 个回答) 已关闭 9 年前。 所以我最近在 Hack
typedef struct Element { struct Element *next; void *data; } Element; 在 pop 函数中,(!(elem = *s
数据加载两次...意味着 AsyncTask onPostExecute 加载相同的数据两次?我的 AsyncTask onPostExecute 运行两次它加载相同的数据...我正在运行异步任务以从
运行“yomeanjs”时,我无限期地挂起“这可能需要几分钟”。当我尝试运行 grunt 时,它失败了,与 npm start 相同。 我使用的是 Win 8.1,并安装了最新的 Node 和 Mon
我正在看 big nerd ranch 的“Android Programming”中的这个页面,我对下面的句子感到困惑。它声明“当 Activity 被隐藏时, Activity 对象不存在”。这让
是否 const vector意味着它的元素是const也一样? 在下面的代码中, v[0].set (1234);在 void g ( const vector & v )产生编译器错误 const
我是 xml 相关事物的新手 我无法理解: SelectNodes(@"//Form/*[. = 'on']"); 注:SelectNodes是 XmlNode 的函数.(与 XmlDocument
我想方便地控制命令行参数。因此我想使用 ShellLib。 我的代码是这样的: ... #include ... EFI_STATUS EFIAPI UefiMain ( EFI_HANDL
着眼于更正 Debian 上/etc/init.d/hostapd 中的一个问题。但是,我不知道这行代码是做什么的,也不知道它是如何工作的 [ -n "$DAEMON_CONF" ] || exit
有没有人遇到过类似我下图所示的情况? 我有一个变量 landingBools.didSlowPast40Knots(正如您从调试打印输出中看到的那样)为假,但出于某种原因,if 语句评估为真。 知道为
我设法使用 flexbox 和一些非常基本的 JavaScript 为自己构建了三个下拉菜单。 因为我不太了解,所以我使用了一个简单的函数三次,而不是使用参数、变量和其他东西。我将其称为丑陋的“蛮力”
这周刚开始学习 javascript。我有一个非常菜鸟的问题。 exports.displayName = (undefined: ?string); 在 React Native 中意味着什么? 这
我正在阅读有关 NaN here 的内容它说: A comparison with a NaN always returns an unordered result even when compari
编码格式:引入*表示“从头开始重复”。例子。输入-{a,b,a,b,c,a,b,a,b,c,d}可以写成{a,b,*,c,*,d}。输出:5;例如2:ABCABCE,输出- 5。 这里*表示从头开始重
我是一名优秀的程序员,十分优秀!