HoRain云小助手:个人主页
个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏名称 |
专栏介绍 |
《C语言》 |
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
《网络协议》 |
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
《docker容器精解篇》 |
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
《linux系列》 |
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
《python 系列》 |
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
《试题库》 |
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录
⛳️ 推荐
专栏介绍
1. 宏定义
2. 实现原理
3. 使用场景
4. 对比其他对齐方式
5. 注意事项
6. 示例代码
在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)。addr
加上PAGE_SIZE - 1
,再与PAGE_MASK
按位与操作,舍去低位。 aligned_addr = (addr + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
PAGE_SIZE
整数倍的最小地址。示例:
PAGE_SIZE = 4096
(十六进制0x1000
):
addr = 0x1234
→ 0x1234 + 0xFFF = 0x2233
→ 0x2233 & 0xFFFFF000 = 0x2000
。addr = 0x2000
(已对齐) → 结果仍为0x2000
。PAGE_MASK
按位与: #define PAGE_ALIGN_DOWN(addr) ((addr) & PAGE_MASK)
ALIGN(addr, n)
可对齐任意n
字节边界。addr
接近0xFFFFFFFF
,加PAGE_SIZE-1
可能导致溢出。内核通常通过类型(如unsigned long
)和地址合法性检查规避。#include
void example() {
unsigned long addr = 0x1234;
unsigned long aligned_addr = PAGE_ALIGN(addr);
// aligned_addr = 0x2000
}
通过PAGE_ALIGN
宏,Linux内核确保了内存操作的效率和硬件兼容性,是内存管理中的基础工具。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!
如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!
Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!