架构:X86、Linux
我已经经历了几个与 and 相关的线程kmalloc()
,vmalloc()
并且我知道它们之间的基本区别,但仍然有一些疑问。我需要你的帮助来理解基本原理。
所以正如我们所知,在 32 位系统中,虚拟地址空间在用户和内核之间划分。高 1GB 内存地址分配给内核,低 3GB 分配给用户空间。
请纠正我我在这里错了:
因此,在 1GB 中,896MB 被 1:1 映射(物理上连续)到内核逻辑地址,而 128MB 用于访问高内存地址意味着通过使用 ? 将其映射到 128MB 来访问超过 896 MB 的物理(RAM)
vmalloc()
?(假设我们有 2GB 的 RAM)如果我们在第 1 点只有 1GB 的物理 RAM 会发生什么。896MB 是内核逻辑地址和通过 kmalloc() 实现的物理地址之间的 1:1 映射。那么 128MB 有什么用,为什么我们还需要
vmalloc()
呢?因此,假设我们有 1GB 的 RAM 完全可以通过内核逻辑地址访问,那么这是否意味着只有当线程/进程请求的内存量可以在物理上连续的地址中分配时才有可能。如果没有可用的物理连续内存,在这种情况下分配的内存将不会是物理连续的,因此我们需要将vmalloc()
它映射到 128MB 的空间中并通过那里访问它?当我们使用 64 位系统时会发生什么?
kmalloc()
两者都vmalloc()
可以拥有大量的地址空间并且可以访问整个RAM ,这是真的吗?