我正在实现一个函数,该函数通过调用deallocate_cache(void *ptr)
.
我手头任务的记忆结构如下:
22 typedef struct slab {
23 void *addr;
24 int bm[((SLAB_SIZE/8)/(8*sizeof(int)))+1]; // bitmap
25 struct slab *next;
26 } slab;
39 typedef struct {
40 int alloc_unit;
41 slab S;
42 } cache;
45 typedef struct { // structure for the entire memory
46 cache C[9];
47 region *R;
48 } memory;
因此,我有一个memory M
,其中包含缓存c[0]
、c[1]
、 ...、c[8]
,而这些缓存又包含slabs
. 当一个通过分配填满时,我通过字段slab
分配另一个作为链表元素。slab *next
为了使我deallocate_cache(void *ptr)
的工作正常,我必须首先找出是否ptr
在缓存范围内,如果是,则在哪个缓存范围内。这是我到目前为止所拥有的:
1. // Check if ptr is in the range of (slab_addr, slab_size) for each slab in each cache
2. int ci = 0, counter, coefficient, done, freeable;
3. slab *look_ahead;
4. for(; ci < 9; ci++){
5. void *max_addr = &M.C[ci].S + SLAB_SIZE; // The upper bound of the address range of the first slab
6. counter = 1;
7. look_ahead = &M.C[ci].S;
8. while(look_ahead->next != NULL){
9. if( ptr > look_ahead->addr && ptr > max_addr){ // Check ptr is greater than S.addr. If yes, it's a good bet it's in this cache.
10. look_ahead = look_ahead->next;
11. max_addr += SLAB_SIZE; // Now the upper bound of the address range of the following slab
12. counter++; // slab counter, 1-based counting
13. }
14. else {
15. done = 1;
16. break;
17. }
18. }
19. if(done == 1) break;
20.
21. }
不幸的是,很明显,这并没有按预期工作。有什么方法可以使用这样的指针来比较地址,或者检查指针是否在给定的地址范围内?还是我必须简单地比较我知道分配给的最大范围内的每个地址?任何帮助深表感谢。