gpt4 book ai didi

linux - 如何在linux内核中测试地址是虚拟的还是逻辑的?

转载 作者:行者123 更新时间:2023-12-04 13:51:36 25 4
gpt4 key购买 nike

我熟悉 Linux 内核内存通常是 1:1 映射的(达到一定的区域限制)。据我了解,为了使这种 1:1 映射更有效,结构页数组是虚拟映射的。
我想检查是否是这种情况。有没有办法测试 - 给定一个地址(可以说是结构页面的地址),检查它是 1:1 映射还是虚拟映射?

最佳答案

64 位机器的地址空间概念包括 2^64地址。这远远大于一台机器中任何现代物理内存量。因此,可以将整个物理内存映射到地址空间,并留出足够的空间。如 this post 中所述并显示 here ,Linux 留下 64 TB 的地址空间用于物理映射。因此,如果内核需要遍历物理内存中的所有字节,它可以只遍历地址 0+offset。至 total_bytes_of_RAM + offset ,其中 offset是直接映射开始的地址(上面链接的 64 位内存布局中的 ffff888000000000)。此外,此直接映射区域位于“在所有进程之间共享”的内核地址范围内,因此此范围内的地址应始终符合逻辑。
您的帖子有两个问题:一个是如何测试地址是逻辑地址还是虚拟地址。正如我提到的,答案是如果地址在直接映射范围内,那么它是合乎逻辑的。否则它是虚拟的。如果是虚拟地址,那么通过页表获取物理地址应该可以让你按照physical_addr + offset逻辑访问地址。数学如上所述。
此外,kmalloc直接使用此逻辑映射分配/保留内存,因此您立即知道如果您使用的地址来自 kmalloc,则它是一个逻辑地址。然而,vmalloc并且任何用户空间内存分配都使用虚拟地址,必须转换这些虚拟地址才能获得逻辑等效项。
您的第二个问题是“逻辑映射页面”是否可以换出。这个问题应该重新表述,因为从技术上讲,RAM 中的所有页面都在逻辑上映射到该直接映射区域中。是的,主内存中的某些页面可以被换出或踢出以供同一页面框架中的另一个页面使用。现在,如果您问是否可以交换仅逻辑映射而非虚拟映射的页面(例如 kmalloc ,其中 gets memory from slab ),我认为答案是它们 can be reclaimed如果没有被使用,但是 aren't generally swapped out .内核页一般不换出,except for hibernation .

关于linux - 如何在linux内核中测试地址是虚拟的还是逻辑的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68940506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com