+ -
当前位置:首页 → 问答吧 → 求助:关于通过线性地址读取pte

求助:关于通过线性地址读取pte

时间:2010-08-31

来源:互联网

写了如下的代码
  1. int event_write(struct file *filp, char __user *buff, size_t count,
  2.                                 loff_t *f_ops){

  3.         struct mm_struct *mm;
  4.         pgd_t *pgd;
  5.         pte_t *pte;
  6.         int pgd_array;
  7.         int pte_array;
  8.         char buff_k[count];
  9.         int vaddr;


  10.         if(copy_from_user(buff_k,buff,count))
  11.                         return -EFAULT;

  12.         //printk("$$$$$$$$$$$$$$$$$\n");
  13.         printk("buff_k is:%s\n",buff_k);

  14.         if((vaddr = convert_vaddr(buff_k,count))==-EINVAL)    //这里是得到线性地址
  15.                         return -EINVAL;

  16.         printk("vaddr is:0x%x\n",vaddr);
  17.         mm = current->mm;
  18.         pgd = mm->pgd;

  19.         pgd_array = (vaddr >> 22)&(0x3ff);

  20.         pgd = pgd + pgd_array;

  21.         pte = (pte_t *)(((pgd->pgd)>>12)<<12);

  22.         pte_array = ((vaddr & 0x3ff000)>>12)&(0x3ff);

  23.         pte = pte + pte_array;

  24.         printk("pte is %x\n", pte->pte);

  25.         printk("$$$$$$$$$$$$$$$$$\n");   
  26.        
  27.        
  28.        
  29.        
  30.        
  31.         return 0;
  32. }
复制代码
基本意思是写一个模块,可以通过write系统调用传递一个线性地址给这个模块,然后模块把线性地址对应的pte给读出来。这段代码是在x86上实现的,通过write传递线性地址后,内核会报错,请问这段代码错在哪里?我折腾了快一下午了也没搞定。另外,同样的思路,稍微修改后在mips上就能读出pte来。

read_pte.tar (90 KB)

下载次数:1

2010-08-31 15:55

源代码,make后加载模块,用test测试

作者: spongeliu   发布时间: 2010-08-31

sigh~~我表达能力很差么

作者: spongeliu   发布时间: 2010-08-31