易截截图软件、单文件、免安装、纯绿色、仅160KB

Linux中ALIGN宏的原理

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)  


相关文档:

实战Linux Bluetooth编程(三) HCI层编程

1. HCI层协议概述:
HCI提供一套统一的方法来访问Bluetooth底层。如图所示:
从图上可以看出,Host Controller Interface(HCI)  就是用来沟通Host和Module。Host通常就是PC, Module则是以各种物理连接形式(USB,serial,pc-card等)连接到PC上的bluetooth Dongle。
在Host这一端:application,SDP,L2cap等协议 ......

实战Linux Bluetooth编程(六) L2CAP编程实例

例一:发送Signaling Packet:
Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x0001.
多个Command可以在一个C-frame(control frame)中发送。
 如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接Socket。这样才有机会自己填充Command Code,Identi ......

Linux netfilter源码分析(7)

转贴自:http://alexanderlaw.blog.hexun.com/8968960_d.html
七、 target 匹配
7.1 ipt_target和ipt_entry_target结构      ip_tables.h
ipt_target和ipt_match结构类似:
struct ipt_target
{
      struct list_head list;
 
    & ......

linux diff 命令详解


首页


讲述:我与51CTO不得不说的故事
    博客互动专题 之 2009,痛并快乐着的IT人
博主的更多文章>>

linux diff 命令详解

2009-02-13 14:01:37
 标签:linux
diff
命令
   [推送到技术圈
]


功能说明:比较文件的差异。

  法:di ......

Linux 编译安装 MYSQL 5.1 与 Innodb

Linux 编译安装 MYSQL 5.1 与 Innodb
编译mysql5
代码:
./configure \
--prefix=/usr/local/mysql \
--localstatedir=/usr/local/mysql/data \
--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \
--with-extra-charsets=all \
--with-charset=utf8 \
- ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号