拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

math PFN_DOWN

math PFN_DOWN PFN_DOWN是 Linux 内核中用于将物理地址转换为页帧号PFNPage Frame Number的宏。它定义在include/linux/pfn.h中是内存管理中地址转换的基础工具。定义与原理#define PFN_DOWN(x) ((x) PAGE_SHIFT)它的核心逻辑是将地址右移PAGE_SHIFT位相当于除以PAGE_SIZE通常是 4096 字节。在 x86 架构下PAGE_SHIFT为 12因此PFN_DOWN(addr) addr / 4096核心作用将物理地址转换为它所在的页帧号。页帧号是物理内存管理的基本单位内核用 PFN 来索引struct page数组即vmemmap。表达式结果说明PFN_DOWN(0)0地址 0 属于第 0 页PFN_DOWN(4095)0仍在第 0 页内PFN_DOWN(4096)1进入第 1 页PFN_DOWN(0x100000)2561MB 地址对应第 256 页配套宏PFN_DOWN通常与以下宏配合使用宏作用示例PFN_DOWN(x)地址 → 页帧号向下取整PFN_DOWN(4095) 0PFN_UP(x)地址 → 页帧号向上取整PFN_UP(4095) 1PFN_PHYS(x)页帧号 → 物理地址PFN_PHYS(1) 4096PFN_ALIGN(x)地址向上对齐到页边界PFN_ALIGN(4095) 4096它们之间的关系可以用一个公式概括PFN_PHYS(PFN_DOWN(addr)) addr PFN_PHYS(PFN_UP(addr))内核中的典型用途建立页帧号与struct page的映射struct page *page pfn_to_page(PFN_DOWN(phys_addr));计算内存区域包含的页数nr_pages PFN_DOWN(end) - PFN_DOWN(start);DMA 和内存映射将设备物理地址转换为页帧号以便进行内存管理操作。使用注意PFN_DOWN是向下取整意味着地址落在某页的任意位置都返回该页的页帧号。如果需要向上取整例如计算覆盖某段内存所需的页数应使用PFN_UP。该宏假设输入是物理地址不适用于虚拟地址。虚拟地址到页帧号的转换需要使用virt_to_pfn等函数。
返回列表