1. 在linux内核中,经产会看到对齐ALIGN的调用,常见的如内存管理中page对齐,net_device中私有数据的获取等,本文是对ALIGN宏的一个简单分析。

1.1. 内核调用:在e100.c中,网卡irq处理函数 irqreturn_t e100_intr(int irq, void *dev_id) 调用netdev_priv(netdev)处理函数获取net_device的私有数据。

2105 static irqreturn_t e100_intr(int irq, void *dev_id)

2106 {

2107 struct net_device *netdev = dev_id;

2108 struct nic *nic = netdev_priv(netdev);

netdev_priv函数和ALIGN宏定义分别如下:

991 static inline void *netdev_priv(const struct net_device *dev)

992 {

993 return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN);

994 }

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

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

1.2 用法解析:

先说ALIGN的用法,ALIGN(x,a) 是为了使x以a为边界对齐,实现原理是给x加上一个最小的数,使x以a为边界对齐。举个例子,a = 8, x=0, ALIGN(x,a) 运算结果为0; a = 8, x = 3, 运算结果为8; a = 8, x = 11, 运算结果为16。

1.3原理分析:

为了便于分析,假设所用到的数字都是16bit,typeof是类型定义分析的时候可以忽略,假设为了使x以8位界对齐。

a = 8, 则上面mask= 7,那么 __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) 用二进制表示为:

X          xxxx xxxx

MASK                 + 0000 0111

进一步,以上公式可以分为x低 三位全为0(加mask后无进位)和低三位不全为0(加mask后有进位)两种情况。

1.3.1. x低三位全为0(加mask无进位)

即 x = xxxx x000,这种情况下,__ALIGN_MASK(x,mask)运算结果仍为x,而x本身就为8的倍数,因此x以8为界对齐。

1.3.2 x低三位不全为0 (加mask有进位)

x + mask 可理解为给x加7使得x向第四低位进位,同时低三位清零,运算后x = xxxx x000,同样为8的倍数,因此x以8为界对齐。

Linux align函数,linux内核中ALIGN解析(示例代码)相关推荐

  1. mock.js 在html中使用demo示例代码

    mock.js 在html中使用demo示例代码 <!DOCTYPE html> <html lang="en"> <head><meta ...

  2. Linux驱动模块编译进内核中

    BQ27501驱动编译进内核 一.       驱动程序编译进内核的步骤 在 linux 内核中增加程序需要完成以下三项工作: 1. 将编写的源代码复制到 Linux 内核源代码的相应目录: 2. 在 ...

  3. Linux进程管理:内核中的优先级继承互斥(rtmutex.h):防止优先级反转

    目录 Priority inheritance in the kernel 译文 Priority inheritance in the kernel https://lwn.net/Articles ...

  4. linux receive函数,Linux网络 - 数据包的接收过程

    的方式写入到指定的内存地址,该地址由网卡驱动分配并初始化.注: 老的网卡可能不支持DMA,不过新的网卡一般都支持. 3: 网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了 4: CPU根据中断表 ...

  5. linux brk函数,Linux sbrk/brk函数使用整理

    sbrk/brk: brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只 ...

  6. linux fork 函数,Linux的fork()系统调用

    Linux的fork()系统调用,就是以父进程为模版创建子进程,是Linux系统的进程管理机制的核心API之一,另一个是调度器函数schedule(),它的用户态API就是之前说自旋锁时提到的sche ...

  7. linux usleep 函数,Linux 高精確的時序(sleep, usleep,nanosleep)

    首先, 我会说不保证你在使用者模式 (user-mode) 中执行的行程 (process) 能够精确地控制时序因为 Linux 是个多工的作业环境. 你在执行中的行程 (process) 随时会因为 ...

  8. linux scandir函数,Linux的scandir函数

    学习目的: 熟悉linux下scandir函数的使用 1.函数的功能 遍历指定目录下满足某种过滤模式的文件,返回结果可通过指定函数进行排序,并将返回的子目录信息(不递归遍历子目录的目录)存放到函数内部 ...

  9. linux sem函数,linux下信号量及其SEM_UNDO标志

    AT&T的贝尔实验室,对Unix早期的进程间通信进行了改进和扩充,形成了"system V IPC",其通信进程主要局限在单个计算机内.IPC对象指的是共享内存(share ...

  10. linux brk函数,linux内存管理之sys_brk实现分析(续)

    unmap_region是整个收缩过程中的核心,它主要完成相应项表项的修改,具体映射页框的释放 代码如下: static void unmap_region(struct mm_struct *mm, ...

最新文章

  1. 公司的API接口被刷了,那是因为你没这样做
  2. python 替换字符串中的元素
  3. 新版蚂蚁网有抄袭怪兽吗?
  4. go1.5及以上版本交叉编译
  5. IplImage, CvMat, Mat 的关系和相互转换(转)
  6. CSS text-decoration 属性
  7. 【CV】计算机视觉入坑必备
  8. laravel-excel文档翻译笔记
  9. Mybatis安装配置使用
  10. 暴风影音播放时如何旋转视频
  11. 2018DeeCamp面试问答
  12. 【学生个人网页设计作品】使用HMTL制作一个超好看的保护海豚动物网页
  13. PHP域名授权查询源码,域名授权系统V1.2完整PHP源码下载_域名授权正版查询系统_源码完全开源...
  14. 电脑技巧:电脑内存不足怎么办?看完你就会了!
  15. 万维网联盟将于2014年推出HTML5标准(四)
  16. 打破垄断!国产服务器操作系统正式发布,微软慌了。。
  17. 计算机网络(16)数据链路层:数据链路层的功能
  18. 因子分析(factor analyis)
  19. Linux下使用wget安装JDK
  20. 常见错误:无效的文件dsn_DSN1COPY错误-SP映射页面错误

热门文章

  1. bugku中的misc题
  2. 小学生计算机房的简笔画,小学生校园风景简笔画图片
  3. Ubuntu安装输入法却不能切换输入法
  4. 前端进行身份证验证(详细)
  5. Worm.Win32.DownLoad.gew病毒清除记
  6. [洛谷1359] 租用游艇
  7. php disable hugepage,禁用Transparent Huge Pages
  8. CKfinder3版本冲突
  9. 游戏服务器是干什么的(大话、浅析)
  10. 关闭和重启脚本合二为一orderlist.sh