#define ALIGN(x,a)    (((x)+(a)-1)&~(a-1))

就是以a为上界对齐的意思。举个例子4k页面边界的例子,即a=4096:如果x = 3888;那么以上界对齐,执行结果就是4096。如果x = 4096;结果是4096.如果x = 4222; 则结果为8192.

另外还有一种以下界对齐的方式#define ALIGN(x,a) ((x)&~(a-1))若x = 3888; 结果为0.如果x = 4096;结果是4096.如果x = 4222; 则结果为4096.你可以把这两种方式理解为“上进”和“丢弃”。

在linux2.6.30.4中,在include/linux/kernel.h文件中,ALIGN宏的定义如下:

#define ALIGN(x,a)      __ALIGN_MASK(x,(typeof(x))(a)-1)

#define __ALIGN_MASK(x,mask)    (((x)+(mask))&~(mask))

上面代码中,typeof(x)表示取x的类型,如果x是int,则typeof(x)为int。

(typeof(x))(a)-1,表明把a转化为x的类型,并减1,作为对齐掩码。

不考虑类型,上述代码可以简化为如下:

#define ALIGN(x,a)    (((x)+(a)-1)&~(a-1))

先来看一段网上的论述:

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))

再看一段说明就很明白了:

#define ALIGN(x,a)    (((x)+(a)-1)&~((a)-1))

就是以a为上界对齐的意思。举个例子4k页面边界的例子,即a=4096: 如果x = 3888;那么以上界对齐,执行结果就是4096。 如果x = 4096;结果是4096. 如果x = 4222; 则结果为8192.

另外还有一种以下界对齐的方式 #define ALIGN(x,a) ((x)&~(a-1)) 若x = 3888; 结果为0. 如果x = 4096;结果是4096. 如果x = 4222; 则结果为4096. 你可以把这两种方式理解为“上进”和“丢弃”。

查看linux4222端口,linux 内核 ALIGN 含义相关推荐

  1. 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的 Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 )

    文章目录 一.下载 Linux 内核 1.下载最新版本 Linux 内核 2.下载指定版本 Linux 内核 二.Linux 内核版本号含义 一.下载 Linux 内核 1.下载最新版本 Linux ...

  2. linux 查看was端口,Linux如何查看端口状态

    查看并发状态 # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 这条语句返回结果如下 LAST_ACK 5 ...

  3. linux 内核编号含义_如何阅读linux内核代码?

    阅读代码从来就是不可行的方法,有篇文章详细讲了这个事,很多人都觉得应该多读代码, 读好的代码,比如Donald Knuth. 但事实上, 只要简单让你描述一下最近读了什么代码,绝大多数人都说不上.文章 ...

  4. linux 内核编号含义_linux内核(kernel)版本号的意义

    转自:http://www.cnblogs.com/jsjliuxing/archive/2011/12/01/2271182.html 在linux下有一个目录,即/usr/src/kernels/ ...

  5. linux 内核编号含义_Linux kernel内核源代码代号:mainline、longterm的含义

    mainline .longterm.stable.linux-next.snapshot这些名词,都是linux kernel source的标记名称,可以理解为代号. mainline mainl ...

  6. linux查看php端口,Linux如何查看端口状态

    Linux如何查看端口状态,相信大家应该都知道我们有的时候需要进行查看当前系统开放了哪些端口,这样子可以查看我们的服务是否正常运行,所以今天小魏给大家分享下在linux服务器下怎么来查看端口的情况. ...

  7. linux 查看snmp端口,linux下的snmp配置及获取信息测试

    1)配置snmp,编辑/etc/snmp/snmpd.conf 1.1)首选是定义一个共同体名(community),这里是public,及可以访问这个public的用户名(sec name),这里是 ...

  8. linux查看运行端口,Linux查看端口使用状态及启动

    LINUX网络性能之管理工具三剑客 本文是介绍管理Linux查看端口这些输出信息,该命令将显示从每个数据包传出的头和来自主机hostname对端口80的编址. Netstat -tln 命令是Linu ...

  9. linux查看apache端口,linux系统下Apache服务启动时80端口报错

    当我们在安装好Apache重启后,在终端启动Apache服务时候出现下面报错: 错误代码: httpd:httpd:Could not reliably determine the servers f ...

最新文章

  1. encodeURIComponent的用法
  2. Groovy的春天从Java7诞生那日开始
  3. 【Android】启动过程:Bootloader-System/Recovery
  4. 关于牛客网运行超时的原因分析
  5. SAP UI5 应用开发教程之四十八 - 如何在 SAP UI5 应用里开发条形码扫描功能
  6. Vue里引入three.js
  7. STL中“大”、“小”和“相等”的概念
  8. efucms搭建教程_EFUCMS E16小说漫画系统源码 最新完美UI设计漫画/听书直播源码程序...
  9. 偏微分方程数值解—ADI格式求解二维抛物型方程
  10. 机电工程专业技术-测量技术
  11. ROS2入门教程—录制/回放数据
  12. 西电计算机学院王宇平,西安电子科技大学计算机学院硕导介绍:王宇平
  13. Win10·不重装系统·扩充C盘
  14. 独家揭秘影响SEO排名的17项核心因素
  15. 2022年最新上海机动车签字授权人模拟考试及答案
  16. 正则表达式详解(贪婪与懒惰、前瞻与后顾、后向引用等)
  17. 自主导航小车实践(二)
  18. 20个强大的正则表达式
  19. simm计算机英语,SIMM
  20. 彩票摇奖 java_用java 实现彩票摇奖,猜拳程序

热门文章

  1. 华为又一战略级生态启程:华为IdeaHub 使能千行百业
  2. 面试: String 五连杀 !你还满血吗 ?
  3. 德国艺术家用99部手机成功在Google地图上制造交通阻塞
  4. Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流
  5. java aio事件模型_IO模型之AIO代码及其实践详解
  6. 帝国cms上传大图片分片大视频大文件webuploader插件
  7. Curve-GCN图像标注
  8. VS调试dll详细过程记录
  9. torch 常用函数
  10. avcodec_encode_video2 AVERROR(EAGAIN)