在Linux内核中,经常会遇到类似于如下的代码

#define __DATA_ALIGN(end, align) (((unsigned int)end+align-1)&(~(align-1)))
#define __MSG_ALIGNED(end)       __DATA_ALIGN(end, 0x10)

光看字面意思,可以知道是字节align大小对齐的作用。原理上是怎么一回事,转载了一篇文章:https://blog.csdn.net/supperwangli/article/details/5142956

1. 引子 
int a;   
int size = 8;
    
如果让a为(size =8)的整数倍表示成二进制应是什么样子呢?那就是让这个数表示成二进制时的最后三位为0.
而要达到这一目标,只要下面这个数与它进行与运算就可以了:
  11111111 11111111 11111111 11111000   
而上面这个数实际下就是 ~ (size - 1),可以将该数称为size的对齐掩码size_mask.   
    
可这样做求出的是比a小的那个最大的8的倍数. 如果要求出比a大的是不是需要加上8就可以了? 
可是如果a本身就是8的倍数, 这样加8不就错了吗, 所以在a基础上加上 size - 1, 然后与size的对齐掩码进行与运算.

这样, 我们可以定义下面的宏, 用于计算一个数a以size为倍数的前后两个值:
#define alignment_down(a, size) (a & (~(size-1)) )
#define alignment_up(a, size) ((a+size-1) & (~ (size-1))) 
  
例如: 
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宏:
/* align addr on a size boundary - adjust address up if needed -- Cort */
#define _ALIGN(addr,size)   (((addr)+(size)-1)&(~((size)-1)))

例2:与页面对齐相关的宏
#define PAGE_SIZE               4096
#define PAGE_MASK               (~(PAGE_SIZE-1)) 
/* to align the pointer to the (next) page boundary */
#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)) 
  
struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask, int fclone)
{
    ......
 
    /* Get the HEAD */
    skb = kmem_cache_alloc(cache, gfp_mask & ~__GFP_DMA);
    if (!skb)
         goto out; 
  
    /* Get the DATA. Size must match skb_add_mtu(). */
    size = SKB_DATA_ALIGN(size);
    data = kmalloc_track_caller(size + sizeof(struct skb_shared_info),  gfp_mask);
    if (!data)
         goto nodata; 
    ......
}

LINUX对齐Align原理相关推荐

  1. 【Linux】Linux的挂载原理 |MOUNT|挂载NAS|自动挂载

    目录 零.常用挂载命令 一.Linux的挂载原理 1.概念 2.举例 3.补充 4.LINUX文件结构和WINDOWS的不同 5.挂载文件系统 6.mount结构与原理 7.mount 和umount ...

  2. [转帖]linux下的X server:linux图形界面原理

    linux下的X server:linux图形界面原理 https://www.cnblogs.com/liangxiaofeng/p/5034912.html linux下的X server:lin ...

  3. Boost:向上对齐align up integral的测试程序

    Boost:向上对齐align up integral的测试程序 实现功能 C++实现代码 实现功能 向上对齐align up integral的测试程序 C++实现代码 #include <b ...

  4. linux下的X server:linux图形界面原理

    linux下的X server:linux图形界面原理 Moblin Core是在Gnome Mobile的平台上建立.我以前玩Linux,提交的都和图像没有关系,连Xwindows都不用启动,开机后 ...

  5. linux系统调用的封装格式,ARM Linux系统调用的原理

    ARM Linux系统调用的原理ARM Linux系统调用的原理 操作系统为在用户态运行的进程与硬件设备进行交互提供了一组接口.在应用程序和硬件之间设置一个额外层具有很多优点.首先,这使得编程更加容易 ...

  6. Linux 输入子系统原理理解(原创)

    linux    输入子系统原理理解(原创) 以前学了单独的按键设备驱动以及鼠标驱动,实际上,在linux中实现这些设备驱动,有一种更为推荐的方法,就是input输入子系统.平常我们的按键,触摸屏,鼠 ...

  7. X server:linux 图形界面原理

    X server: linux 图形界面原理 Moblin Core是在Gnome Mobile的平台上建立.我以前玩Linux,提交的都和图像没有关系,连Xwindows都不用启动,开机后直接进入文 ...

  8. 【内存】内存对齐 的原理

    目录 内存对齐的原因 内存对齐的原理 内存对齐的原因 1.平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的:某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常. ...

  9. Android 6.0 JNI原理分析 和 Linux系统调用(syscall)原理

    JNI原理 引言:分析Android源码6.0的过程,一定离不开Java与C/C++代码直接的来回跳转,那么就很有必要掌握JNI,这是链接Java层和Native层的桥梁,本文涉及相关源码: fram ...

最新文章

  1. 几个比较冷门的prototype扩展方法:去掉html标签、去掉a标签、去掉style样式,以及判断是否为html代码的代码片段
  2. java中有关覆写的总结
  3. Ping命令为什么要加上“-t”参数
  4. 三点到六点是几个小时_环卫工在10吨垃圾里找了6小时,终于找到这张价值19万元的餐巾纸...
  5. 從三種方式看SQL的使用程度
  6. 枚举数据库中所有表的列名(转)
  7. C++解析(31):自定义内存管理(完)
  8. matlab求任意点最短路径,【最短路】求两点间最短路径的改进的Dijkstra算法及其matlab实现...
  9. 使用spring提供的URL多级路径匹配器
  10. NumberFormat格式化数字
  11. WPS表格 JSA 学习笔记
  12. 串联和并联拓扑PI控制器
  13. 08CMS之标识还原
  14. Mobile-Former: Bridging MobileNet and Transformer详解
  15. 深入浅出 CSS 动画
  16. 干货分享 | 全文 40000 字,最强(全) Matplotlib 实操指南
  17. UDA一致正则化和熵最小化
  18. ICPC-TOOLs resolver滚榜单工具使用指南
  19. eclipse如何修改工作空间名称
  20. linux计划任务1

热门文章

  1. 耐磨性在微型导轨中的性能分析
  2. coalesce(coalesce函数的用法)
  3. 怎么手写识别文字?分享几款手写识别软件
  4. 【Codeforces Round #325 (Div. 2)】D. Phillip and Trains
  5. 2015年工作中遇到的问题:61-70
  6. web前端开发——期末大作业网页制作——web网页设计期末课程大作业 HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计
  7. 浙江去年拘留“老赖”3.3万人次 失信黑名单扩容29万条
  8. 华为商城抢手机脚本_出名要趁早!抢在华为前,三星发布折叠屏手机,价格贵到哭...
  9. 工作缺点和不足及措施_关于个人工作不足和改进措施的总结
  10. 淘宝付款服务器没有响应,win10应用商店里购买东西时点击付款无反应的解决方法...