embeddedlwp 发表于 2011-09-08 11:48

pud_page(pud)宏问题

对于 pud_page(pud)宏 ULK3 P68上的解释是:
通过页上级目录项pud产生相应的页中间目录的线性地址。在两级分页系统中,该宏等价于pmd_page(),后者是应用与页中间目录项。

但是跟了一下linux 2.6.11的代码确是这样:

在include/asm-i386/pgtable-3level.h中
#define pud_page(pud) \
((struct page *) __va(pud_val(pud) & PAGE_MASK))

在include/asm-generic/pgtable-nopud.h中
#define pud_val(x) (pgd_val((x).pgd))

在include/asm-i386/page.h中
#define pgd_val(x) ((x).pgd)

怎么也把kernel中的代码与书上的解释对应不上阿,求解惑!

muzi19861113 发表于 2011-09-08 12:25

兄台 代码不是很清晰吗?
能不能把你的疑惑具体说一下?

embeddedlwp 发表于 2011-09-08 12:43

本帖最后由 embeddedlwp 于 2011-09-08 12:44 编辑

把这几个宏展开,怎么没有看到“通过页上级目录项pud产生相应的页中间目录的线性地址”

muzi19861113 发表于 2011-09-08 13:14

#define pud_page(pud) \
((struct page *) __va(pud_val(pud) & PAGE_MASK))

pud_val(pud) & PAGE_MASK得到的是PGD_TABLE的页面物理地址。
__va将这个物理地址转换为线性地址。

embeddedlwp 发表于 2011-09-08 13:34

展开后,#define pud_page(pud)((struct page *) __va(((pud).pgd.pgd) & PAGE_MASK)) 这是何意思阿?

与"通过页上级目录项pud产生相应的页中间目录的线性地址"有什么关系吗?

muzi19861113 发表于 2011-09-08 13:59

本帖最后由 muzi19861113 于 2011-09-08 14:08 编辑

在没有pud_table的系统中,
pud_val这个宏中的x.pgd是对应的线性地址x在
pgd_table中多对应的entry.
pgd_val返回这个entry中的物理地址部分。
两个.pgd的意义不一样。

embeddedlwp 发表于 2011-09-09 09:20

回复 6# muzi19861113


    非常感谢ls的解释,但是您的解释好像与"通过页上级目录项pud产生相应的页中间目录的线性地址"没有什么关系阿?

embeddedlwp 发表于 2011-09-13 08:36

沉了,顶起来!

yiltoncent 发表于 2018-12-28 11:32

有同样的疑问,正好找到这个帖子,发现没有人解答,找了一下源码commit记录,找到了有人提交的记录,这是一个bug。
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-2.6.28.y&id=ab00fee30cddf975200b3c97aef25bea144a0d89

正确如下:
-#define pud_page(pud) ((struct page *) __va(pud_val(pud) & PTE_PFN_MASK))
+#define pud_page(pud) pfn_to_page(pud_val(pud) >> PAGE_SHIFT)

yiltoncent 发表于 2018-12-28 11:42

怎么回了不显示?
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-2.6.28.y&id=ab00fee30cddf975200b3c97aef25bea144a0d89
这儿显示已经被修复了,11上这个宏是个bug。
页: [1]
查看完整版本: pud_page(pud)宏问题