- 论坛徽章:
- 16
|
本帖最后由 embeddedlwp 于 2012-04-16 12:00 编辑
start_kernel->pgtable_cache_init:- 652void __init pgtable_cache_init(void)
- 653{
- 654 if (PTRS_PER_PMD > 1) {
- 655 pmd_cache = kmem_cache_create("pmd",
- 656 PTRS_PER_PMD*sizeof(pmd_t),
- 657 PTRS_PER_PMD*sizeof(pmd_t),
- 658 0,
- 659 pmd_ctor,
- 660 NULL);
- 661 if (!pmd_cache)
- 662 panic("pgtable_cache_init(): cannot create pmd cache");
- 663 }
- 664 pgd_cache = kmem_cache_create("pgd",
- 665 PTRS_PER_PGD*sizeof(pgd_t),
- 666 PTRS_PER_PGD*sizeof(pgd_t),
- 667 0,
- 668 pgd_ctor,
- 669 PTRS_PER_PMD == 1 ? pgd_dtor : NULL);
- 670 if (!pgd_cache)
- 671 panic("pgtable_cache_init(): Cannot create pgd cache");
- 672}
复制代码 所以每次从pgd_cache分配一个对象的时候都会调用pgd_ctor函数,再看看pgd_ctor是个啥:- 198void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused)
- 199{
- 200 unsigned long flags;
- 201
- 202 if (PTRS_PER_PMD == 1)
- 203 spin_lock_irqsave(&pgd_lock, flags);
- 204
- 205 memcpy((pgd_t *)pgd + USER_PTRS_PER_PGD,
- 206 swapper_pg_dir + USER_PTRS_PER_PGD,
- 207 (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
- 208
- 209 if (PTRS_PER_PMD > 1)
- 210 return;
- 211
- 212 pgd_list_add(pgd);
- 213 spin_unlock_irqrestore(&pgd_lock, flags);
- 214 memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
- 215}
- 216
复制代码 |
|