x86架构上的Linux内核的默认内存页面大小是4 KB,我想知道这是如何计算的,为什么?
我正在探索说明的叶子0x02,cpuid并提出了一些问题。文档中有一个表格,描述cpuid了TLB配置的结果。他们来了:
56H TLB Data TLB0: 4 MByte pages, 4-way set associative, 16 entries
[...]
B4H TLB Data TLB1: 4 KByte pages, 4-way associative, 256 entries
Run Code Online (Sandbox Code Playgroud)
这是否意味着只有2个级别的TLB?如果某些x86供应商决定提供3个级别的TLB,如何查询TLB缓存的级别数?
57H TLB Data TLB0: 4 KByte pages, 4-way associative, 16 entries
[...]
B4H TLB Data TLB1: 4 KByte pages, 4-way associative, 256 entries
Run Code Online (Sandbox Code Playgroud)
这里的“ 4向关联”仅仅是错字,意味着“ 4向集合关联”吗?
55H TLB Instruction TLB: 2-MByte or 4-MByte pages, fully associative, 7 entries
[...]
6AH Cache …Run Code Online (Sandbox Code Playgroud) 8 路设置缓存关联性是否有我看不到的特殊优势?
我有一台配备 Ryzen 7 1800X CPU 的 Linux 计算机。根据 WikiChip 的说法,它的 L2-DTLB 有 1536 个条目。所以我假设关联性可以被 3 整除。我编写了一个小程序来检查 CPUID 报告的关联性。有趣的是,它给了我 8 的关联性。为什么呢?这将给出 192 个条目的集合大小,因此没有简单的模 2 次幂索引。那么该指数是如何有效计算的呢?
那是我的程序:
#include <iostream>
#if defined(_MSC_VER)
#include <intrin.h>
#elif defined(__GNUC__)
#include <cpuid.h>
#endif
using namespace std;
unsigned cpuid( unsigned (&cpuidRegs)[4], unsigned code, unsigned ex );
int main()
{
static unsigned const SHORT_WAYS[0x10] = { 0, 1, 2, 0, 4, 0, 8, 0, 16, 0, 32, 48, 64, 96, 128, (unsigned)-1 };
unsigned regs[4];
cpuid( regs, 0x80000006u, 0 …Run Code Online (Sandbox Code Playgroud) L1/L2缓存包含在Intel和L1/L2缓存中是8路相关性,意味着在一组中存在8条不同的缓存线.缓存行作为一个整体操作,意味着如果我想从缓存行中删除几个字节,整个缓存行将被删除,而不是我想要删除的那些字节.我对吗 ?
现在,我的问题是,无论是通过某个其他进程还是使用clflush(手动逐出缓存行/块),从缓存中删除/逐出集合的缓存行,系统是否会将该缓存行的驱逐数据存储在某处(在任何缓冲区,寄存器等),以便下次它可以从该位置加载数据以减少延迟,与从主存储器或更高级别的缓存加载数据相比,或者 它 总是使缓存中的数据无效并且下次加载下一个更高级别的数据.
任何建议或文章的任何链接将受到高度赞赏.提前致谢.
architecture operating-system processor cpu-architecture computer-architecture