gpt4 book ai didi

c - Linux 内核系统调用返回未给定的指针

转载 作者:行者123 更新时间:2023-11-30 15:27:18 24 4
gpt4 key购买 nike

我正在尝试实现一个新的系统调用作为实验,但我总是遇到段错误。我认为问题是我尝试返回一个指向不在用户空间中的 char 数组的指针。我尝试使用 GFP_USER 作为 kmalloc 的标志来分配用户空间中的内存,但问题仍然存在。

这就是我调用系统调用的方式,目前无法更改它(通常会分配内存用于返回并将其作为参数提供):

#include <errno.h>
#include <linux/unistd.h>
#include <linux/mysyscall.h>

main() {
printf("Returned: %s\n", mycall("user string arg"));

}

系统调用函数的定义如下所示:

#include <linux/mysyscall.h>
#include <linux/kernel.h>
#include <linux/unistd.h>
#include <linux/slab.h>
#include <asm/uaccess.h>

asmlinkage char* sys_mycall (char * str_in) {
int size = 0;

printk(KERN_INFO "Starting mycall.\n");
size = strnlen_user(str_in, 255);
printk(KERN_INFO "size = %d\n", size);
char str[size];
char *ret;
ret = kmalloc(size, GFP_ATOMIC | GFP_USER);

if(str != NULL){
copy_from_user(str, str_in, size);
printk(KERN_INFO "Copied string.\n");
}else{
printk(KERN_ERR "str is NULL!!!\n");
return -EFAULT;
}

// Doing operations on str

int acc = access_ok(VERIFY_WRITE, ret, size);
if(acc){
printk(KERN_ERR "Not accessible!\n");
return -EFAULT;
}

int len = copy_to_user(ret, str, size);
if(len){
printk(KERN_ERR "Could not copy! len = %d\n", len);
return -EFAULT;
}

return ret;
}

我已经对其进行了很多测试,并且我确信系统调用被正确调用,但它在 copy_to_user 方面存在问题。copy_to_user 始终返回正值(等于大小,因此根本不复制)。
顺便说一句,ret的地址类似于f74ce400和str_in 080484ac。

有人知道出了什么问题吗?

最佳答案

复制的目的地应该是用户空间指针,而指针ret位于内核空间。您应该让用户提供目标指针作为参数。参见示例:

关于c - Linux 内核系统调用返回未给定的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27077757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com