Linux中_ALIGN宏背后的原理——内存对齐

转载自:

http://englishman2008.blog.163.com/blog/static/2801290720114210254690/

1. 原理
    int a; 
    int size = 8;        <----> 1000(bin)

计算a以size为倍数的下界数:
    就让这个数(要计算的这个数)表示成二进制时,最后三位为0就可以达到这个目标。只要下面这个数与a进行"与运算"就可以了:
    11111111 11111111 11111111 11111000
    而上面这个数实际下就是 ~(size - 1),可以将该数称为size的对齐掩码size_mask.

计算a以size为倍数的上下界数:
    #define alignment_down(a, size) (a & (~(size-1)) )
    #define alignment_up(a, size)   ((a+size-1) & (~ (size-1)))
    注: 上界数的计算方法,如果要求出比a大的是不是需要加上8就可以了?可是如果a本身就是8的倍数,这样加8不就错了吗,所以在a基础上加上(size - 1), 然后与size的对齐掩码进行与运算.

例如:
    a=0, size=8, 则alignment_down(a,size)=0, alignment_up(a,size)=0.
    a=6, size=8, 则alignment_down(a,size)=0, alignment_up(a,size)=8.
    a=8, size=8, 则alignment_down(a,size)=8, alignment_up(a,size)=8.
    a=14, size=8,则alignment_down(a,size)=8, alignment_up(a,size)=16.
    注:size应当为2的n次方, 即2, 4, 8, 16, 32, 64, 128, 256, 1024, 2048, 4096 ...

2. 在linux中的应用
    上面的计算方法在linux等代码中也常常可以看到,下面给出几个例子:
    (1) 当分配地址addr时, 要将该地址以size为倍数对齐, 而且要得到是比addr大的值, 则使用_ALIGN宏:
    #define _ALIGN(addr,size) (((addr)+(size)-1)&(~((size)-1)))

(2) 与页面对齐相关的宏
    #define PAGE_SIZE         4096
    #define PAGE_MASK         (~(PAGE_SIZE-1))
    #define PAGE_ALIGN(addr) -(((addr)+PAGE_SIZE-1) & PAGE_MASK)

(3) 与skb分配时对齐相关的宏
    #define SKB_DATA_ALIGN(X) (((X) + (SMP_CACHE_BYTES - 1)) & ~(SMP_CACHE_BYTES - 1))

时间: 2025-01-11 07:07:42

Linux中_ALIGN宏背后的原理——内存对齐的相关文章

]Linux中的虚拟地址、物理地址和内存管理

Linux中的虚拟地址.物理地址和内存管理方式: http://m.blog.csdn.net/blog/yinjingyu_bisheng/8943650 Linux内存管理之mmap详解 : http://blog.chinaunix.net/uid-26669729-id-3077015.html Linux驱动虚拟地址和物理地址的映射 : http://blog.chinaunix.net/uid-25120309-id-3986354.html

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ 浅谈 Linux

Linux中THIS_MODULE宏定义详解

一直都在耿耿于怀,这个THIS_MODULE到底是个什么玩意,linux内核中无处不在的东西.今天上网搜了一下,算是基本明白了.网上牛人写的已经比较详细,另外目前暂时没有时间往更深层次分析,所以直接贴过来得了... 转帖网址: http://blog.csdn.net/a954423389/archive/2010/12/27/6101369.aspx 源码位置: @ kernel/module.c @ include/linux/module.h 结构体struct module在内核中代表一

Linux中的内存管理(转)

原文:http://blog.chinaunix.net/uid-26611383-id-3761754.html 前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识. 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的技

Linux中内存管理

转载自:http://blog.chinaunix.net/uid-26611383-id-3761754.html 前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识. 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的

转:Linux中的内存管理

前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识. 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这 个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的技术所存在的哪些问题.弄清楚了这些,我们才能比 较清晰的把握某一项技术.有些资料在介绍某个概念的时候直接就介绍这个概

linux中的分段和分页

觉得这篇文章写分段和分页机制还是挺清晰的,在此转载一下. 前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识. 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的技术所存在的哪些问题.弄清楚了这些,我们才能比较清晰的把握某

linux 内存对齐

在最近的项目中,我们涉及到了“内存对齐”技术.对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”.“内存对齐”应该是编译器的 “管辖范围”.编译器为程序中的每个“数据单元”安排在适当的位置上.但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”.如果你想了解 更加底层的秘密,“内存对齐”对你就不应该再透明了. 一.内存对齐的原因大部分的参考资料都是如是说的:1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据 的:某些硬件平台只能在某些地址处取某些特定

c语言中内存对齐问题

在最近的项目中,我们涉及到了“内存对齐”技术.对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”.“内存对齐”应该是编译器的“管辖范围”.编译器为程序中的每个“数据单元”安排在适当的位置上.但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”.如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了. 一.内存对齐的原因 大部分的参考资料都是如是说的: 1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的:某些硬件平台只能在某些地址处取某些特定类