上文介绍了页表项和内存之间的映射,这里介绍操作页表项的函数
1、将pte_t等类型转换为unsigned long 的函数
pgd_val,pud_val,pmd_val,pte_val,pgprot_val
以下是ptd_val的代码:
- static inline pteval_t pte_val(pte_t pte)
- {
- pteval_t ret;
- if (sizeof(pteval_t) > sizeof(long))
- ret = PVOP_CALLEE2(pteval_t, pv_mmu_ops.pte_val,
- pte.pte, (u64)pte.pte >> 32);
- else
- ret = PVOP_CALLEE1(pteval_t, pv_mmu_ops.pte_val,
- pte.pte);
- return ret;
- }
这里有个诡异的POVP_CALLEE2和PVOP_CALLE1,按照下面的定义貌似是一段汇编代码,感觉这个功能不是很负责,内核为什么要这么做呢,网上资料很少,只找到下面链接的一条信息,貌似和寄存器有关系,后面再看看。
- #define PVOP_CALLEE2(rettype, op, arg1, arg2) \
- __PVOP_CALLEESAVE(rettype, op, "", "", PVOP_CALL_ARG1(arg1), \
- PVOP_CALL_ARG2(arg2))
2、以上的逆转换,将unsigned long转为pgd_t,pud_t,pmd_t,pte_t,pgprot_t
- static inline pgd_t __pgd(pgdval_t val)
- {
- pgdval_t ret;
-
- if (sizeof(pgdval_t) > sizeof(long))
- ret = PVOP_CALLEE2(pgdval_t, pv_mmu_ops.make_pgd,
- val, (u64)val >> 32);
- else
- ret = PVOP_CALLEE1(pgdval_t, pv_mmu_ops.make_pgd,
- val);
- return (pgd_t) { ret };
- }
这里也用到了那个神奇的调用
阅读(2042) | 评论(0) | 转发(0) |