【发布时间】:2013-12-19 08:16:58
【问题描述】:
我确实通过 LDD 书了解到使用 kmalloc 我们可以从高内存中分配。我在这里有一个基本问题。 1)但据我所知,我们不能直接从内核访问高内存(除非它通过kmap()映射到内核空间)。而且我没有看到为 kmalloc() 保留的任何映射区域,但是对于 vmalloc() 它存在。那么,如果从高内存分配 kmalloc() 将映射到内核地址的哪一部分?
这是x86架构,32位系统。
【问题讨论】:
-
如果我理解正确的话,
kmalloc不会从所有内存中分配,而是从内核已经可用的内存中分配,而vmalloc从虚拟内存中分配内存的方式与用户空间相同应用程序。 -
kmalloc()通过slab/slub/等从物理上连续的范围分配。物理到虚拟的映射是一对一的。对于vmalloc(),为每一页分配一个MMU/PTE值;物理到虚拟的映射不是连续的。高内存是一个通常与 Intel x86 架构相关的概念。请说明您的查询是否与x86 明确相关; Linux 可以在大约 30 种不同的架构上运行。 -
架构应该将所有物理内存映射到一个虚拟范围;在最新的 ARM Linux 上,这称为 lowmem。分配给用户进程或vmalloc等的所有内存都与这些物理块别名。宏
virt_to_phys()和phys_to_virt()可以转换此范围内的地址(kmalloc() 或内核代码空间,即 lowmem)。底层 MMU 可能会将此范围分配给 4k 页以外的内容;例如 ARM 上的 1MB 部分。
标签: linux linux-kernel