对齐多用于内存管理中,为了使得CPU的存取速度更快。给定一个对齐因子,所有的地址都以该对齐因子为基准对齐。即:地址为该对齐因子的整数倍。
在rtems中,有如下代码:
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
if ( remainder != 0 ) {
return value - remainder + alignment;
} else {
return value;
}
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
}
关于对齐,以上是rtems中关于向上对齐和向下对齐的两段代码。之前看到对齐的代码总是觉得不重要,就跳过去了,久而久之就不太清楚其运作方式。其实,稍微看一下就比较清楚了。。从代码中可以看出:
向上对齐,就是按照对齐因子。将要对齐的值一直上浮到正好可以整除对齐因子即可,要求,是上浮的最小值。同理,向下对齐,那就是一直将要对齐的值下降到刚好可以整除对齐因子的值。代码实现也很便捷。
对于向上对齐,首先取得对齐的值关于对齐因子的余数,这余数就是多出来的零头。去掉这个零头,再加上一个对齐因子,对齐因子一定比这个余数大,即上浮的最小值为:对齐因子 - 余数。
对于乡下对齐,也是取得余数,直接将要对齐的值减掉该余数即可。即余数是最小的下浮的值。