当前位置: 技术问答>linux和unix
初学者关于模块编程由虚址找物理地址问题~~急~在线等help~
来源: 互联网 发布时间:2016-10-21
本文导语: 就是我们有一个作业,找到虚拟地址addr对应的物理地址并打印。 一开始我还想得比较简单~就是直接 my_pgd=pgd_offset(my_mm,addr); my_pud=pud_offset(my_pgd,addr); my_pte=pte_offset_kernel(my_pmd,addr); 然后由pte得到page,再加上偏移...
就是我们有一个作业,找到虚拟地址addr对应的物理地址并打印。
一开始我还想得比较简单~就是直接
my_pgd=pgd_offset(my_mm,addr);
my_pud=pud_offset(my_pgd,addr);
my_pte=pte_offset_kernel(my_pmd,addr);
然后由pte得到page,再加上偏移量
但是google了一下,发现有现成的代码,但是版本不太一样……
现在有点不太明白,是不是内核里还有分虚址和物理地址呢?那我们这样给出来的是用户空间的虚址吧?
就这个映射关系我不太明白~~而且,还有一个什么线性地址,啊啊啊…………这些都是啥米东西呐?哪位大虾帮帮我好吗?
还有就是~~
pa = (pte_val(*pte_tmp) & PAGE_MASK) |(va & ~PAGE_MASK);
这是什么意思额?我没看懂……make的时候,好像不认识amp啊…………
拜托拜托~~很急哦,在线等答案哈~O(∩_∩)O~
一开始我还想得比较简单~就是直接
my_pgd=pgd_offset(my_mm,addr);
my_pud=pud_offset(my_pgd,addr);
my_pte=pte_offset_kernel(my_pmd,addr);
然后由pte得到page,再加上偏移量
但是google了一下,发现有现成的代码,但是版本不太一样……
现在有点不太明白,是不是内核里还有分虚址和物理地址呢?那我们这样给出来的是用户空间的虚址吧?
就这个映射关系我不太明白~~而且,还有一个什么线性地址,啊啊啊…………这些都是啥米东西呐?哪位大虾帮帮我好吗?
还有就是~~
pa = (pte_val(*pte_tmp) & PAGE_MASK) |(va & ~PAGE_MASK);
这是什么意思额?我没看懂……make的时候,好像不认识amp啊…………
拜托拜托~~很急哦,在线等答案哈~O(∩_∩)O~
|
pa = (pte_val(*pte_tmp) & PAGE_MASK) |(va & ~PAGE_MASK);
这个是从帖子里面复制出来的吧,好像是csdn的bug,有时候&会变成&
所以这行代码应该是
pa = (pte_val(*pte_tmp) & PAGE_MASK) |(va & ~PAGE_MASK);
假定是4K的页,那么
(pte_val(*pte_tmp) & PAGE_MASK) 得到的是高20位,也就是转换之后的页面地址
(va & ~PAGE_MASK) 得到虚拟地址的低12位,也就是页内偏移量
这个是从帖子里面复制出来的吧,好像是csdn的bug,有时候&会变成&
所以这行代码应该是
pa = (pte_val(*pte_tmp) & PAGE_MASK) |(va & ~PAGE_MASK);
假定是4K的页,那么
(pte_val(*pte_tmp) & PAGE_MASK) 得到的是高20位,也就是转换之后的页面地址
(va & ~PAGE_MASK) 得到虚拟地址的低12位,也就是页内偏移量