使用do_mmap_pgoff出现的问题,急!
时间:2007-11-22
来源:互联网
Nov 22 14:22:15 node2 kernel: do_munmap error =-22 invalid argument
Nov 22 14:22:15 node2 kernel: end i=348837
以下为内核模块代码,请大家帮忙看看:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <asm/mman.h>
static int __init tpgoff_init(void)
{
int error = 0;
unsigned long ubuf=0;
size_t count = 0;
unsigned long i=0;
unsigned long t=1000000;
printk("tpgoff kernel module init!\n");
count = 1024 * 1024;
for (i=0;i<t;i++) {
ubuf = 0;
down_write(¤t->mm->mmap_sem);
ubuf = do_mmap_pgoff(NULL, 0, count, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, 0);
up_write(¤t->mm->mmap_sem);
if (ubuf==0) {
printk("ubuf=0\n");
return 0;
}
if (ubuf!=0) {
error = do_munmap(NULL, ubuf, count);
if (error) {
printk("do_munmap error =%d\n",error);
break;
}
}
}
printk("end i=%ld\n",i);
return error;
}
static void __exit tpgoff_cleanup(void)
{
printk("tpgoff kernel module exit!\n");
}
module_init(tpgoff_init);
module_exit(tpgoff_cleanup);
MODULE_LICENSE("Dual BSD/GPL");
作者: 眼眼rhine 发布时间: 2007-11-22

作者: 眼眼rhine 发布时间: 2007-11-22
作者: wuqixuan 发布时间: 2007-11-22
将
error = do_munmap(NULL, ubuf, count);
改为:
error = do_munmap(current->mm, ubuf, count);
即可。
在取消映射时,由于第一个参数传的为NULL,其实并没有取消映射。
但更深层的原因估计还得看do_munmap实现才能确认。
作者: 眼眼rhine 发布时间: 2007-11-23
down_write(¤t->mm->mmap_sem);
和
up_write(¤t->mm->mmap_sem);
作者: 眼眼rhine 发布时间: 2007-11-23
很需要
作者: tigerish_d 发布时间: 2010-04-13
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/kernel.h>
- #include <linux/mm.h>
- #include <asm/mman.h>
- #include <linux/rwsem.h>
- #include <linux/err.h>
-
- static int __init tpgoff_init(void)
- {
- int error = 0;
- unsigned long ubuf=0;
- size_t count = 0;
- unsigned long i=0;
- unsigned long t=1000000;
-
- printk("tpgoff kernel module init!\n");
-
- count = 1024 * 1024;
- for (i=0;i<t;i++)
- {
- ubuf = 0;
-
- down_write(¤t->mm->mmap_sem);
- ubuf = do_mmap_pgoff(NULL, 0, count, PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANON, 0);
- up_write(¤t->mm->mmap_sem);
-
- if (IS_ERR((void*)ubuf))
- {
- printk(KERN_INFO"do_mmap_pgoff failed\n");
- break;
- }
- else
- {
- down_write(¤t->mm->mmap_sem);
- error = do_munmap(current->mm, ubuf, count);
- up_write(¤t->mm->mmap_sem);
- if (error)
- {
- printk("do_munmap error =%d\n",error);
- break;
- }
- }
- }
-
- printk("end i=%ld\n",i);
- return error;
-
- }
-
-
- static void __exit tpgoff_cleanup(void)
- {
-
- printk("tpgoff kernel module exit!\n");
-
- }
-
- module_init(tpgoff_init);
- module_exit(tpgoff_cleanup);
- MODULE_LICENSE("GPL");
作者: todaygood 发布时间: 2011-03-01
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28