问题标签 [tlb]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
428 浏览

assembly - TLB 可以同时映射 4K、2M 和 1GB 页面吗?

在 x86-64 长模式下,最近的 Intel/AMD 微处理器是否允许 TLB 同时将 4K、2MB 和 1GB(大页面)页面的虚拟地址转换为物理地址?

据我阅读手册后了解,如果您设置:

但是我从来没有尝试过,所以在我开始编码之前,你能告诉我它是否有效吗?

0 投票
1 回答
361 浏览

operating-system - 在 x86-64 中直接向 TLB 提供物理地址

是否可以在长模式下以直接方式向 x86-64 架构上的 TLB 提供给定虚拟地址的物理地址?

例如,假设我在 PML4E 中设置了零,因此会触发页面错误异常,因为会找到无效地址,在异常期间 CPU 可以通过使用一些指令告诉 TLB 该虚拟地址位于 X 物理页框?

我想这样做是因为通过代码我可以很容易地知道物理地址在哪里,这样可以避免昂贵的页面遍历。

0 投票
2 回答
2326 浏览

memory - MIPS 内存执行预防

我正在对 MIPS 架构进行一些研究,并且想知道如何使用 mips 提供的有限指令和内存保护来实现操作系统。我特别想知道操作系统如何阻止某些地址范围被执行。例如,操作系统如何限制 PC 在特定范围内运行?换句话说,防止诸如从动态分配的内存中执行之类的事情?

首先想到的是 TLB,但 TLB 只提供内存写保护(而不是执行)。

我也不太清楚操作系统如何处理它,因为这意味着每条指令都会导致异常,然后会烧掉许多周期,只是检查 PC 是否在正常的地址范围内。

如果有人知道,它通常是如何完成的?它是否在初始化期间由硬件以某种方式处理(例如,它被赋予了一个地址范围,如果它超出范围,则会遇到异常?)

0 投票
1 回答
1574 浏览

java - 内存屏障和 TLB

内存屏障保证数据缓存是一致的。但是,它是否保证 TLB 是一致的?

我看到一个问题,即在线程之间传递 MappedByteBuffer 时,JVM(java 7 update 1)有时会因内存错误(SIGBUS、SIGSEG)而崩溃。

例如

如果没有 Thread.yield(),我偶尔会在 force()、put() 和 C 的 memcpy() 中崩溃,所有这些都表明我试图非法访问内存。使用 Thread.yield() 我没有遇到问题,但这听起来不是一个可靠的解决方案。

有没有人遇到过这个问题?TLB 和内存屏障有什么保证吗?


编辑:操作系统是 Centos 5.7,我已经看到了 i7 和 Dual Xeon 机器上的行为。

我为什么要这样做?因为写入消息的平均时间为 35-100 ns,具体取决于长度,并且使用普通的 write() 并没有那么快。如果我在当前线程中进行内存映射和清理,这需要 50-130 微秒,使用后台线程来完成主线程交换缓冲区大约需要 3-5 微秒。为什么我需要交换缓冲区?因为我正在写入许多 GB 的数据,而 ByteBuffer 的大小不能超过 2 GB。

0 投票
1 回答
2548 浏览

c - Linux 内核使 TLB 条目无效

在 linux 内核中,我编写了类似于copy_page_range(mm/memory.c) 的代码,因此通过 COW 优化将内存从一个进程复制到另一个进程。目标地址和源地址可以偏移PAGE_SIZE,但 COW 仍然有效。然而,我注意到,在用户程序中,当我从相同的源地址复制到不同的目标地址时,TLB 似乎没有被正确刷新。在高层次上,我的用户级代码执行以下操作(我一次在我的机器上复制一页,0x1000 字节):

SRC=0x20000000

  1. 写入 SRC(调用相关页面page1)。
  2. 系统调用将 SRC 复制到目标进程中的 0x30000000。现在,src 进程地址 0x20000000 和目标进程地址 0x30000000 指向同一个页面 ( page1)。
  3. 写一些与 SRC 不同的东西(这应该会触发页面错误来处理 COW)。假设源地址现在指向page2.
  4. 系统调用将 SRC 复制到目标进程中的 0x30001000。

此时,应该存在两个单独的页面: SRC 0x20000000 page2 DST 0x30000000 page1 DST 0x30001000page2

我发现在第 3 步,当我在 src 0x20000000 中写入不同的内容时,不会产生页面错误。经检查,实际页面映射为:SRC 0x20000000 page1 DST 0x30000000 page1 DST 0x30001000page1

在我的代码中,如果我调用flush_tlb_page并传递源地址,用户代码将按预期使用正确的页面映射。所以我确信我没有正确维护 TLB。在copy_page_range中,内核mmu_notifier_invalidate_range_start/end在更改页表之前和之后调用。我正在做完全相同的事情并仔细检查了我确实将正确的 struct_mm 和地址传递给mmu_notifier_invalidate_range_start/end. 这个函数不处理刷新 tlb 吗?

好的,从字面上看,当我完成输入时,我检查dup_mmap并意识到(kernel/fork.c) 的主要调用者调用copy_page_range了. 我猜我应该在内核代码之前和之后调用。它是否正确?具体是做什么的?dup_mmapflush_tlb_mmflush_cache_rangeflush_tlb_rangemmu_notifier_invalidate_range_start/end

0 投票
2 回答
5244 浏览

linux - TLB中的内核内存(虚拟地址条目)?

Linux 是操作系统,ARM 是本文所指的处理器。

TLB 是否同时包含内核和用户空间虚拟地址?内核内存开始于前 3 0xc000_0000GB0xFFFF_FFFF 属于用户空间的位置。在进程之间的上下文切换之间,TLB 被刷新。

TLB 是否同时包含内核和用户空间虚拟地址?

内核内存(虚拟)直接对应于物理内存(只是偏移0xC000_0000就会给我们物理地址)。是否有必要在 TLB 中拥有内核内存(虚拟)(如果您说它存在于 TLB 中)?它应该只存在用户空间地址。

0 投票
2 回答
2149 浏览

caching - 当 L1 未命中与 L2 访问有很大不同时...... TLB 相关?

我一直在对一些算法运行一些基准测试并分析它们的内存使用和效率(L1/L2/TLB 访问和未命中),其中一些结果对我来说非常有趣。

考虑到包容性缓存层次结构(L1 和 L2 缓存),L1 缓存未命中的数量不应该与L2 缓存访问 的数量一致吗?我发现的一种解释与 TLB 相关:当虚拟地址未映射到 TLB 中时,系统会自动跳过某些缓存级别中的搜索。这看起来合法吗?

0 投票
1 回答
469 浏览

tlb - 如何学习 TLB 的关联性(路数)?

我的任务是学习 TLB 缓存中的方式数量。我应该使用哪种算法?

0 投票
2 回答
282 浏览

linux - 在 Linux 上使用大/超大页面的开源应用程序

我一直在寻找在 Linux (x86-64) 上使用大/巨大内存页面(大小 > 4KB 的 OS 内存页面)的开源应用程序。我想研究今天如何使用大页面。有人可以指出我很少这样的应用程序吗?

谢谢

阿尔卡

0 投票
2 回答
6361 浏览

linux - 在 LINUX 上测量 TLB 未命中的命令

有人可以指导我使用一个命令来测量 LINUX 上的 TLB 未命中吗?是否可以将轻微的页面错误视为 TLB 未命中?