來自指南Understanding The Linux Kernel, 3rd Edition,章節8.2.12。分配板對象,存在下面的代碼段:Linux中的指針計算內核分配實現
void * kmem_cache_alloc(kmem_cache_t *cachep, int flags)
{
unsigned long save_flags;
void *objp;
struct array_cache *ac;
local_irq_save(save_flags);
ac = cache_p->array[smp_processor_id()];
if (ac->avail)
{
ac->touched = 1;
objp = ((void**)(ac+1))[--ac->avail];
} else
objp = cache_alloc_refill(cachep, flags);
local_irq_restore(save_flags); return objp;
}
現在,看看行((void**)(ac+1))[--ac->avail]
,根據引導:
因爲本地高速緩存陣列後的權利存儲ac描述符, ((void **)(ac + 1))[ - ac-> avail]獲取該自由對象的地址,並減少ac-> avail的值。
但是,因爲ac
是鍵入struct array_cache
一個指針,它包含下列字段(按此次序) -
[類型]無符號整型
[名稱]利用
[描述]指向本地緩存中可用對象的指針數量。 該字段還充當緩存中第一個空閒插槽的索引。
[類型]無符號整型
[名稱]限制
本地高速緩存即是[描述]大小,在本地緩存中的指針的最大數量。
[類型]無符號整型
[名稱] batch_count
[描述]塊大小爲本地高速緩存再填充或排空。
【類型】無符號整型
[名]感動
[說明]標誌設置爲1,如果本地緩存最近已被使用。
所以ac+1
將指向到avail
值(或在相反的情況下,尾段第3字節)的第二個字節,這使得沒有任何意義。
我得到這個錯誤的方式?
你能否提供更常見的用法和這種編碼的例子?我會期望使用另一個封裝這些數據的結構體,而這個封裝體結構體將有一個指向另一個結構體的指針的字段,另一個指向其他數據的字段。這種方式乾淨清晰。爲什麼要使用這種代碼到底有什麼好處呢? – user2162550