释放(vfree-ing)指向易失性数据的指针

时间:2011-10-18 14:06:46

标签: c linux-kernel volatile vmalloc

volatile似乎是每个人永无止境的问题。我以为我知道一切,但后来遇到了这个:

所以,我在线程之间共享了一块内存,我将它定义为:

volatile type *name;

如果它让你感觉更好,你可以想象type只是int

这意味着我有一些易失性数据指针(不易变)。因此,例如,在优化方面,编译器可以缓存name但不缓存name[0]的值。我是对的吗?

所以,现在我vfree这个指针(它在Linux内核模块中)它告诉我vfree期待const void *我传递它volatile type *

我理解将volatile type *作为type *传递是多么危险,因为在该函数中,name[i]的值可以被缓存(作为优化的结果),这是不可取。

我不明白为什么,vfree希望我将指针发送到非易失性数据。那里有什么我想念的吗?或者只是那些写vfree没有考虑过这种情况的人?

我认为我只是将我的指针投向void *不会造成任何伤害,是吗?

2 个答案:

答案 0 :(得分:2)

vfree函数(以及一般的每个合理的释放函数)并不关心您的实际数据(无论是volatile还是long)。它只需要一个(有效)指针(想一想:将指针作为void *值传递给CPU寄存器。)

根据该值,该函数将:

  1. 调用SLAB / SLUB释放内存
  2. 删除内存映射
  3. 所以是的,投射到{{1}}不会在运行时造成任何伤害。

答案 1 :(得分:0)

我的结论是,仅将指针转换为void *不会导致问题,freevfree不会直接接受指向volatile数据的指针只是被忽视了。