问题标签 [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.
c - 移动内存页面的方法比 mremap() 更快?
我一直在尝试使用 mremap()。我希望能够高速移动虚拟内存页面。至少比复制它们的速度更高。我对算法有一些想法,可以利用能够非常快速地移动内存页面。问题是下面的程序显示 mremap() 非常慢 - 至少在我的 i7 笔记本电脑上 - 与实际逐字节复制相同的内存页面相比。
测试源代码是如何工作的?mmap() 256 MB RAM,比 CPU 上的缓存大。迭代 200,000 次。在每次迭代中,使用特定的交换方法交换两个随机内存页。使用基于 mremap() 的页面交换方法运行一次。使用逐字节复制交换方法再次运行并计时。事实证明,mremap() 每秒只管理 71,577 次页面交换,而逐字节复制每秒管理高达 287,879 次页面交换。所以 mremap() 比逐字节复制慢 4 倍!
问题:
为什么 mremap() 这么慢?
是否有另一个可能更快的用户级或内核级可调用页面映射操作 API?
是否有另一个用户级或内核级可调用页面映射操作 API 允许在一次调用中重新映射多个非连续页面?
有没有支持这种事情的内核扩展?
更新:所以我们不需要质疑“往返内核空间”有多快,这是一个进一步的性能测试程序,它表明我们可以连续调用 getpid() 3 次,每秒 81,916,192 次i7 笔记本电脑:
更新 2:我添加了 WIP 代码来调用我发现的名为 modify_ldt() 的函数。手册页暗示页面操作可能是可能的。但是,无论我尝试什么,当我期望它返回读取的字节数时,该函数总是返回零。'man modify_ldt' 表示“成功时,modify_ldt() 返回读取的实际字节数(用于读取)或 0(用于写入)。失败时,modify_ldt() 返回 -1 并设置 errno 以指示错误。” 任何想法(a) modify_ldt() 是否可以替代 mremap() ?(b) 如何让 modify_ldt() 工作?
memory-management - 用于处理 Linux 内核中 TLB 未命中的调用图
我试图了解 linux 内核如何处理 TLB 未命中。具体来说,我知道页表遍历发生在其中follow_page
,mm/memory.c
但是当发生 TLB 未命中时,follow_page 是如何调用的。follow_page的返回值 ( struct page
) 是如何传回硬件的?有人可以说明从硬件引发 TLB 未命中异常到何时follow_page
被调用的 TLB 未命中处理的调用图吗?
follow_page
我在内核代码中搜索了http://lxr.linux.no/linux+v3.4.4/+search=follow_page但结果似乎没有多大帮助。为了清楚起见,假设硬件是 x86_64。
linux - 使用英特尔 PEBS 的 DTLB 未命中地址跟踪
我正在尝试通过使用硬件性能计数器生成 D-TLB 未命中的地址跟踪。英特尔处理器具有“基于事件的精确采样”(PEBS),可以在每次采样时转储硬件寄存器内容。我需要使用这个寄存器转储来创建导致 D-TLB 未命中的地址。但是,我不确定如何从寄存器转储中生成访问地址。
有人有做类似事情的经验,可以给我一些指示吗?
谢谢
阿尔卡
memory-management - 架构式 TLB 与架构式页表
架构 TLB 和架构页表有什么区别?
mips - MIPS R4000:为什么每个 EntryLo 寄存器中都有一个全局位?
以下 R4000 文档的第 81 页: http ://www.scribd.com/doc/53181649/70/EntryLo0-2-and-EntryLo1-3-Registers
在每个 TLB 条目中显示一个全局位(这是有道理的)。如果在 TLB 条目中设置了全局位,则在查找期间忽略 ASID。
但是,在下一页中,EntryHi 寄存器有一个保留 (0) 字段来代替 TLB 条目的全局位(如第 82 页的标题中所述)。取而代之的是两个全局位,一个位于每个 EntryLo{0,1} 寄存器中。
一些消息来源(包括“See MIPS Run”)表明,在使用 TLBW 指令写入 TLB 条目时,如果 EntryLo0 (G) 和 EntryLo1 (G) 位不相同,“将会发生坏事”。其他来源,例如 linux-mips.org 上的论坛帖子 (http://www.linux-mips.org/archives/linux-mips/2003-04/msg00226.html) 建议“换句话说,写在 EntryLo{0,1} 寄存器对集中只有一个 G 位的 TLB 条目将导致 G 位被清除的 TLB 条目。” (这本身并不清楚究竟会发生什么——“坏事”,或者 G 位清除的 TLB 条目)。
那么,两个全局位的原因是什么?它是否适合遗留支持,或者我错过了什么?
c - 虚拟内存系统、页表和TLB
我正在努力解决这个问题,甚至无法进行一步,问题是这样的:
考虑以下 C 程序:
如果该程序运行在具有 4 KB 页大小和 64 项 TLB 的机器上,那么 M 和 N 的什么值会导致每次执行内循环时 TLB 未命中?
谁能给我一些提示,我该如何解决?
linux - 1GB 页面和透明大页面 (Linux)
最近 Linux 内核中的Transparent Huge Pages(THP)
支持允许在不同页面大小(例如,x86-64 中的 4KB 和 2MB)之间自动升级/降级。但我不确定 THP 是否也可以在4KB
和1GB
页面之间或在2MB
和1GB
页面之间提升/降低页面大小。
有人可以对此发表评论吗?
x86 - TLB invlpg 指令延迟时间长
所以我正在研究这个内核模块,它进行一些页表操作,我注意到刷新 TLB 条目很慢。你问有多慢?每次调用 invlpg 超过 100 ns!那是280个周期或更多。我愿意接受这一点……但对于硬件支持的分页和地址转换,这似乎违反直觉。有谁知道为什么这么糟糕?
我在 4 核 2.8 Ghz Intel core i5 上运行
x86 - 调用 invlpg 指令时的段错误
我正在尝试实现 tlb 刷新功能。对于刷新,我使用INVLPG
指令,但不幸的是它总是会导致分段错误。你能帮我解决这个问题吗?
这是代码:
x86 - x86_64 架构中多页大小的 TLB 使用情况
有人知道 TLB(L1 和 L2)是否支持在现代 x86_64 微处理器(Intel SandyBridge、AMD Bulldozer)中同时访问多个页面大小?x86 核心管道是否向 MMU 提供有关页面大小的信息?
最好的祝福,
亚历克斯