這幾天做 C socket 有個(gè)朋友遇到問題,答應(yīng)幫忙解決的,于是上網(wǎng)
找找相關(guān)資料,可惜實(shí)在是難找,郁悶上圖書館翻翻書,發(fā)現(xiàn)一本叫
《linux內(nèi)核分析及編程》--倪繼利 的書講到了,呵呵happy;借回來looklook;
順便把要用到的內(nèi)容打出來發(fā)個(gè)文章,有需要的朋友可以看看;改資料雖然
簡短,但我想會(huì)很有用;linux 下的C編程系統(tǒng)源碼有著密切的關(guān)系,我想這
是編程的難度所在本來寒假是想學(xué)點(diǎn)C的,不知道這么搞的搞到j(luò)ava那里去了
,
看來還是要花點(diǎn)時(shí)間學(xué)學(xué)C了,不然就完了;
呵呵,全是廢話來的,看資料吧!
linux下用C實(shí)現(xiàn)緩存分配和使用
kmem_cache_create 函數(shù)是給一個(gè)對象空間分配一個(gè)緩沖區(qū),下面是它的例子(在kernel/fork.c中)

void _init proc_caches_init(void)
{


vm_area_cachep = kmem_cache_create(
"vm_area_struct",
sizeof(vm_area_struct),
SLAB_PANIC,NULL,NULL
);


}
kmem_cache_alloc 是從指定的緩沖區(qū)中分配一個(gè)對象,它的例子如下:

static inline int dup_mmap(struct mm_struct * mm,struct mm_struct *oldmm)
{
struct vm_area_struct *mpnt,*tmp,**pprev;


.
tmp = kmem_cache_alloc(vm_area_cachep,
SLAB_KERNAEL
);


.
}
kmalloc 函數(shù)是分析一個(gè)大小為 size 的內(nèi)存塊,下面是一個(gè)應(yīng)用例子(在kernel/power/pm.c)
struct pm_dev *pm_register(pm_dev_t type,
unsigned long id,
pm_callback callback
)


{
//GEP_KERNEL表示正在運(yùn)行的內(nèi)核態(tài)的進(jìn)程分配空間,可以陷入睡眠
struct pm_dev *dev = kmalloc (sizeof(struct pm_pev),GFP_KERNEL);


..
}
vmalloc 函數(shù)分配一段連續(xù)的 size 大小的虛擬內(nèi)存,其對應(yīng)物理頁可不連續(xù)。下面是一個(gè)應(yīng)用例
子(在security/selinux/ss/avtab.c中):
int avtab_init(struct avtab *h)

{
..
h->htable = vmalloc(sizeof(*(h->htable))*AVTAB_SIZE);
..
}
地震讓大伙知道:居安思危,才是生存之道。
posted on 2007-04-07 22:53
小尋 閱讀(908)
評論(0) 編輯 收藏 所屬分類:
unix program