求助:关于通过线性地址读取pte
时间:2010-08-31
来源:互联网
写了如下的代码
复制代码
基本意思是写一个模块,可以通过write系统调用传递一个线性地址给这个模块,然后模块把线性地址对应的pte给读出来。这段代码是在x86上实现的,通过write传递线性地址后,内核会报错,请问这段代码错在哪里?我折腾了快一下午了也没搞定。另外,同样的思路,稍微修改后在mips上就能读出pte来。
- int event_write(struct file *filp, char __user *buff, size_t count,
- loff_t *f_ops){
-
- struct mm_struct *mm;
- pgd_t *pgd;
- pte_t *pte;
- int pgd_array;
- int pte_array;
- char buff_k[count];
- int vaddr;
-
-
- if(copy_from_user(buff_k,buff,count))
- return -EFAULT;
-
- //printk("$$$$$$$$$$$$$$$$$\n");
- printk("buff_k is:%s\n",buff_k);
-
- if((vaddr = convert_vaddr(buff_k,count))==-EINVAL) //这里是得到线性地址
- return -EINVAL;
-
- printk("vaddr is:0x%x\n",vaddr);
- mm = current->mm;
- pgd = mm->pgd;
-
- pgd_array = (vaddr >> 22)&(0x3ff);
-
- pgd = pgd + pgd_array;
-
- pte = (pte_t *)(((pgd->pgd)>>12)<<12);
-
- pte_array = ((vaddr & 0x3ff000)>>12)&(0x3ff);
-
- pte = pte + pte_array;
-
- printk("pte is %x\n", pte->pte);
-
- printk("$$$$$$$$$$$$$$$$$\n");
-
-
-
-
-
- return 0;
- }

read_pte.tar (90 KB)
源代码,make后加载模块,用test测试
作者: spongeliu 发布时间: 2010-08-31
sigh~~我表达能力很差么
作者: spongeliu 发布时间: 2010-08-31
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28