pgalloc.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:1k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/proc-armv/pgalloc.h
  3.  *
  4.  *  Copyright (C) 2001 Russell King
  5.  *
  6.  * Page table allocation/freeing primitives for 32-bit ARM processors.
  7.  */
  8. /* unfortunately, this includes linux/mm.h and the rest of the universe. */
  9. #include <linux/slab.h>
  10. extern kmem_cache_t *pte_cache;
  11. /*
  12.  * Allocate one PTE table.
  13.  *
  14.  * Note that we keep the processor copy of the PTE entries separate
  15.  * from the Linux copy.  The processor copies are offset by -PTRS_PER_PTE
  16.  * words from the Linux copy.
  17.  */
  18. static inline pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address)
  19. {
  20. pte_t *pte;
  21. pte = kmem_cache_alloc(pte_cache, GFP_KERNEL);
  22. if (pte)
  23. pte += PTRS_PER_PTE;
  24. return pte;
  25. }
  26. /*
  27.  * Free one PTE table.
  28.  */
  29. static inline void pte_free_slow(pte_t *pte)
  30. {
  31. if (pte) {
  32. pte -= PTRS_PER_PTE;
  33. kmem_cache_free(pte_cache, pte);
  34. }
  35. }
  36. /*
  37.  * Populate the pmdp entry with a pointer to the pte.  This pmd is part
  38.  * of the mm address space.
  39.  *
  40.  * If 'mm' is the init tasks mm, then we are doing a vmalloc, and we
  41.  * need to set stuff up correctly for it.
  42.  */
  43. #define pmd_populate(mm,pmdp,pte)
  44. do {
  45. unsigned long __prot;
  46. if (mm == &init_mm)
  47. __prot = _PAGE_KERNEL_TABLE;
  48. else
  49. __prot = _PAGE_USER_TABLE;
  50. set_pmd(pmdp, __mk_pmd(pte, __prot));
  51. } while (0)