HoRain云--Linux PAGE_ALIGN宏定义的理解

   

HoRain云小助手个人主页

  个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

1. 宏定义

2. 实现原理

3. 使用场景

4. 对比其他对齐方式

5. 注意事项

6. 示例代码



1. 宏定义

在Linux内核源码中,PAGE_ALIGN通常定义如下:

#define PAGE_ALIGN(addr)  (((addr) + PAGE_SIZE - 1) & PAGE_MASK)

或通过通用对齐宏ALIGN实现:

#define PAGE_ALIGN(addr)  ALIGN(addr, PAGE_SIZE)

其中:

  • PAGE_SIZE:页大小(如4KB,即4096)。
  • PAGE_MASK:页掩码(如~(PAGE_SIZE - 1),即低12位为0)。

2. 实现原理

  • 步骤:通过将地址addr加上PAGE_SIZE - 1,再与PAGE_MASK按位与操作,舍去低位。
    aligned_addr = (addr + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
    
  • 作用:确保结果地址是不小于原地址且是PAGE_SIZE整数倍的最小地址。

示例

  • PAGE_SIZE = 4096(十六进制0x1000):
    • addr = 0x12340x1234 + 0xFFF = 0x22330x2233 & 0xFFFFF000 = 0x2000
    • addr = 0x2000(已对齐) → 结果仍为0x2000

3. 使用场景

  • 内存分配:确保分配的缓冲区起始地址对齐页边界(如DMA操作需物理连续且对齐)。
  • 地址转换:将虚拟地址转换为物理页帧号(PFN)时,需对齐地址。
  • 映射操作:创建页表或调整内存映射时,要求地址按页对齐。

4. 对比其他对齐方式

  • 向下对齐:直接与PAGE_MASK按位与:
    #define PAGE_ALIGN_DOWN(addr) ((addr) & PAGE_MASK)
    
  • 通用对齐ALIGN(addr, n)可对齐任意n字节边界。

5. 注意事项

  • 溢出问题:在32位系统中,若addr接近0xFFFFFFFF,加PAGE_SIZE-1可能导致溢出。内核通常通过类型(如unsigned long)和地址合法性检查规避。
  • 物理与虚拟地址:该宏适用于虚拟地址,物理地址对齐需结合具体硬件约束。

6. 示例代码

#include 

void example() {
    unsigned long addr = 0x1234;
    unsigned long aligned_addr = PAGE_ALIGN(addr);
    // aligned_addr = 0x2000
}

通过PAGE_ALIGN宏,Linux内核确保了内存操作的效率和硬件兼容性,是内存管理中的基础工具。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!

如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!

Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!

你可能感兴趣的:(arm开发,javascript,Haproxy,Nginx,开发语言)