- 论坛徽章:
- 6
|
回复 33# flikelinux
其实原因在于:如果你开启了PSE,也就是说开启了大尺寸页。那么在这种情况下,pmd就是最后一级页表了,也就没有pte了。
原来的代码中应该做如下修改:
在计算出pmd后,应该调用函数pmd_large()检查一下,是否是大尺寸页。如果不是,则使用原理的流程;如果是则直接进行计算物理地址。代码如下:- if(!pmd_none(*k_pmd))
- {
- if(!pmd_large(*k_pmd)){
- k_pte = pte_offset_kernel(k_pmd, ka);
- if(!pte_none(*k_pte))
- {
- kpa = (pte_val(*k_pte) & PAGE_MASK) |
- (ka & ~PAGE_MASK);
- if(!pte_present(*k_pte))
- printk(KERN_ALERT "k-page not in RAM\n");
- }
- else
- printk(KERN_ALERT "pte is none\n");
- }else{
- printk(KERN_ALERT "Use Large Page. PSE = 1\n");
- kpa = (pmd_val(*(k_pmd)) & PMD_MASK) | (ka & ~PMD_MASK);
- }
- }
复制代码 |
|