- 论坛徽章:
- 0
|
我使用do_mmap在用户空间指定地址addr处建立了一块匿名映射区间,大小0x1000,flag指定为MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED,函数正常返回我指定的addr。接着我使用kernel_read从文件中读取了0x1000的数据到内核中,然后我想使用copy_to_user将这些数据复制到addr处,结果通过printk打印调试信息发现,似乎copy_to_user会出现错误,该函数并没有返回。
附上代码:
map_addr = do_mmap(NULL, addr, 0x1000, prot|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0);
printk("map_addr: 0x%x\n", map_addr); // map_addr = addr
ptmp = (char*)kmalloc(0x1000, GFP_KERNEL);
retval = kernel_read(pfile, 0, ptmp, 0x1000);
printk("kernel_read is done! first char: %x\n", *ptmp); //打印出的first char正确
printk("1\n");
copy_to_user((char*)map_addr, ptmp, 0x1000);
printk("2\n");
结果只打印出了1,却没有打印2,而且模块从现在开始就无法用rmmod卸载了,提示busy。
请问大家我是不是忽略了什么细节?还是这种方法本身就有问题?为什么copy_to_user函数会不返回呢? |
|