Linux align函数,linux内核中ALIGN解析(示例代码)
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解析(示例代码)相关推荐
- mock.js 在html中使用demo示例代码
mock.js 在html中使用demo示例代码 <!DOCTYPE html> <html lang="en"> <head><meta ...
- Linux驱动模块编译进内核中
BQ27501驱动编译进内核 一. 驱动程序编译进内核的步骤 在 linux 内核中增加程序需要完成以下三项工作: 1. 将编写的源代码复制到 Linux 内核源代码的相应目录: 2. 在 ...
- Linux进程管理:内核中的优先级继承互斥(rtmutex.h):防止优先级反转
目录 Priority inheritance in the kernel 译文 Priority inheritance in the kernel https://lwn.net/Articles ...
- linux receive函数,Linux网络 - 数据包的接收过程
的方式写入到指定的内存地址,该地址由网卡驱动分配并初始化.注: 老的网卡可能不支持DMA,不过新的网卡一般都支持. 3: 网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了 4: CPU根据中断表 ...
- linux brk函数,Linux sbrk/brk函数使用整理
sbrk/brk: brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只 ...
- linux fork 函数,Linux的fork()系统调用
Linux的fork()系统调用,就是以父进程为模版创建子进程,是Linux系统的进程管理机制的核心API之一,另一个是调度器函数schedule(),它的用户态API就是之前说自旋锁时提到的sche ...
- linux usleep 函数,Linux 高精確的時序(sleep, usleep,nanosleep)
首先, 我会说不保证你在使用者模式 (user-mode) 中执行的行程 (process) 能够精确地控制时序因为 Linux 是个多工的作业环境. 你在执行中的行程 (process) 随时会因为 ...
- linux scandir函数,Linux的scandir函数
学习目的: 熟悉linux下scandir函数的使用 1.函数的功能 遍历指定目录下满足某种过滤模式的文件,返回结果可通过指定函数进行排序,并将返回的子目录信息(不递归遍历子目录的目录)存放到函数内部 ...
- linux sem函数,linux下信号量及其SEM_UNDO标志
AT&T的贝尔实验室,对Unix早期的进程间通信进行了改进和扩充,形成了"system V IPC",其通信进程主要局限在单个计算机内.IPC对象指的是共享内存(share ...
- linux brk函数,linux内存管理之sys_brk实现分析(续)
unmap_region是整个收缩过程中的核心,它主要完成相应项表项的修改,具体映射页框的释放 代码如下: static void unmap_region(struct mm_struct *mm, ...
最新文章
- 公司的API接口被刷了,那是因为你没这样做
- python 替换字符串中的元素
- 新版蚂蚁网有抄袭怪兽吗?
- go1.5及以上版本交叉编译
- IplImage, CvMat, Mat 的关系和相互转换(转)
- CSS text-decoration 属性
- 【CV】计算机视觉入坑必备
- laravel-excel文档翻译笔记
- Mybatis安装配置使用
- 暴风影音播放时如何旋转视频
- 2018DeeCamp面试问答
- 【学生个人网页设计作品】使用HMTL制作一个超好看的保护海豚动物网页
- PHP域名授权查询源码,域名授权系统V1.2完整PHP源码下载_域名授权正版查询系统_源码完全开源...
- 电脑技巧:电脑内存不足怎么办?看完你就会了!
- 万维网联盟将于2014年推出HTML5标准(四)
- 打破垄断!国产服务器操作系统正式发布,微软慌了。。
- 计算机网络(16)数据链路层:数据链路层的功能
- 因子分析(factor analyis)
- Linux下使用wget安装JDK
- 常见错误:无效的文件dsn_DSN1COPY错误-SP映射页面错误