作者VictorTom (鬼翼&娃娃鱼)
看板C_and_CPP
标题Re: [问题] pointer alignment
时间Sat Apr 4 02:21:13 2009
※ 引述《kkdlin (kkdlin)》之铭言:
: 最近在看driver相关的书籍
真好~~小弟学driver是工作以後碰到一点学一点的Orz
: 看到alignment这边 一直有个问题想不通
: 想请教一下各位
: 书里面提到一般在将pointer做alignment的时候
: 是用下面的公式
: [pointer + (page_size - 1)] & ~(page_size - 1)
: 後面的& 的动作可以理解 就是要把後面的位数清成0
: 变成page size的倍数
: 可是前面的加(page_size - 1)的动作一直想不懂?
: 直接将pointer & ~(page_size - 1)不是可以达到一样的效果吗?
: 想了很久的说..^^"
: Thanks in advance
提供一个工作里常见的例子, 基於某些限制....
我们有时需要将资料存放的pointer对齐1K, 2K, 4K....
可是你不能保证malloc回来时pointer一定能对齐这个size....
所以就有可能有大概的code像下面这几行....
///////////////////////////////////////////////////////////////////
const int ALIGN_SIZE = 4*1024; // 有时刚好是一个page.
int iReqSize; // 先assign data需要的size in byte.
byte *ptr_base = malloc( iReqSize + ALIGN_SIZE - 1 );
byte *ptr = (ptr_base + ALIGN_SIZE - 1) & ~(ALIGN_SIZE - 1);
/* 在ptr放入iReqSize这麽多bytes的data, 并送往後续处理. */
free(ptr_base);
///////////////////////////////////////////////////////////////////
代价是, 浪费记忆体是在所难免的样子....Orz
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.174.98
※ 编辑: VictorTom 来自: 220.132.174.98 (04/04 02:23)
1F:推 kkdlin:不好意思 再问一下 那这样去调整指标的位置 04/04 11:14
2F:→ kkdlin:不会有可能去踩到别的已经在heap里面allocate的区段吗? 04/04 11:14
3F:→ VictorTom:看一下malloc的size和原本需求的iReqSize的大小的差异, 04/04 12:11
4F:→ VictorTom:稍微算一下或带几个数试试, 就知道 ALIGN_SIZE-1 除了当 04/04 12:11
5F:→ VictorTom:& ~()的mask以外, 拿来调整alignment时的另一个用途:) 04/04 12:12
6F:推 kkdlin:大感谢! 豁然开朗! 就是确保他不会往前踩 04/04 16:11
7F:→ kkdlin:整个aligned过後的位址还是在allocate的区域内 04/04 16:11
8F:→ VictorTom:再回应您的原文, 加了ALIGN_SIZE-1才&~()同时也确保了 04/04 17:01
9F:→ VictorTom:align过後的ptr也不会往後踩; 不管您前後始指往大或小 04/04 17:02
10F:→ VictorTom:的位址算过去:) 04/04 17:02
11F:推 freelancer:也可以考虑 posix_memalign 04/06 19:37