Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在Minix 3中,是否有方法从系统调用访问和修改用户数据?我可以在这里使用sys\u datacopy()吗?为什么我的尝试不起作用?_Linux_Pointers_Kernel_System Calls_Minix - Fatal编程技术网

Linux 在Minix 3中,是否有方法从系统调用访问和修改用户数据?我可以在这里使用sys\u datacopy()吗?为什么我的尝试不起作用?

Linux 在Minix 3中,是否有方法从系统调用访问和修改用户数据?我可以在这里使用sys\u datacopy()吗?为什么我的尝试不起作用?,linux,pointers,kernel,system-calls,minix,Linux,Pointers,Kernel,System Calls,Minix,我想在Minix中的PM服务器中实现一个syscall,它可以访问用户空间中的一些数据,并可以对其进行修改 我使用Minix的消息传递机制将数据传递给syscall。在正在传递的消息结构中,我将一个指针分配给要传递的用户空间中变量的地址 例如,在用户程序中 message m; m.m1_p1 = &var; //data to be passed //pass it to the syscall message m; m.m1_p1 = &var; //data to be

我想在Minix中的PM服务器中实现一个syscall,它可以访问用户空间中的一些数据,并可以对其进行修改

我使用Minix的消息传递机制将数据传递给syscall。在正在传递的
消息
结构中,我将一个指针分配给要传递的用户空间中变量的地址

例如,在用户程序中

message m;
m.m1_p1 = &var; //data to be passed
//pass it to the syscall
message m;
m.m1_p1 = &var; //data to be passed
printf("%c\n",*(m.m1_p1)); //gives the value in var
//pass it to the syscall
printf("%c\n",var); //gives the old value of var
在内核中,在syscall函数中,我

char *ptr = m_in.m1_p1;
然而,当我尝试读取或写入数据时,我得到一个错误,内核已经惊慌失措,需要重新启动

我意识到这可能是因为在用户空间中,正在使用特定于用户的虚拟地址,这在系统调用中是无法识别的

进一步搜索后,我发现Linux具有实现这一点的功能

是否有一个等价物是Minix?如果没有,是否有其他方法来实现这一点


在评论中的建议帮助下,我尝试使用了
sys\u datacopy()
。虽然这允许我在系统调用中读取和写入数据,但我所做的更改不会反映回调用系统调用的用户程序中

我最近的尝试如下:

在用户程序中

message m;
m.m1_p1 = &var; //data to be passed
//pass it to the syscall
message m;
m.m1_p1 = &var; //data to be passed
printf("%c\n",*(m.m1_p1)); //gives the value in var
//pass it to the syscall
printf("%c\n",var); //gives the old value of var
在系统调用中

char *ptr = (char*)malloc(sizeof(char));
sys_datacopy(who_e,(vir_bytes)(m_in.m1_p1),SELF,(vir_bytes)(ptr),sizeof(char*)); //or some other version of sys_vircopy()?
printf("Read value of ptr : %c\n",*ptr); //gives correct value
*ptr = //new value
printf("New value of ptr : %c\n",*ptr); //gives modified value
现在,我可以使用
ptr
在系统调用中访问
var
的值,并在系统调用中修改它。但是,从syscall返回后,我发现'var'的基础值没有改变

根据我的理解,应该发生的是
sys\u datacopy()
应该复制了
m\u in.m1\u p1
的等效虚拟,该虚拟位于指向相同物理地址的
ptr
系统调用的地址空间中。因此,
*ptr
应该精确地到达
var
,从而修改它

还是在我使用
sys\u datacopy()
时复制了与地址对应的数据?如果是这种情况,我能想到的一个解决方案是定义一个允许双指针的消息结构,并将
char**
传递给syscall。然后,取消引用一次将确保地址复制到
ptr
。但是,再次,取消引用
ptr
将尝试取消引用属于用户进程地址空间的虚拟地址,这将不起作用

为什么这个方法不起作用?实现这一目标的正确方法是什么

我正在使用Minix 3.2.1


谢谢。

名为
sys\u datacopy
sys\u copy
minix/include/minix/syslib.h
功能能帮助您吗?datacopy,可能是为了实现
read
write
系统调用,下面是包装器。另外,您确定要在内核而不是服务器中实现系统调用吗?还有sys_safecopyfrom/.to/sys_vsafecopy,在&@osgx上列出,谢谢。在我发布了这个之后,我遇到了这些函数。它们看起来非常相关,但我找不到任何关于它们使用的例子。实际上,我遇到了
SYS\u SAFECOPYFROM
SYS\u SAFECOPYTO
,它们需要一个授权id。我读了一些关于内存授权的文章,但还是不知道如何实现它们,也找不到任何示例。我正在服务器中实现系统调用。我是新手,如果我使用了不正确的术语,我很抱歉。我假设一个系统调用在内核模式下运行,特别是当内核在出现任何错误时陷入恐慌时…@osgx
sys\u datacopy
似乎非常有用。但我无法理解它的用法。你能告诉我一个更清楚的例子吗?谢谢。我对Minix及其demons服务一无所知,但+50 rep就是+50 rep。您是否尝试过从一些手册开始,比如“为Minix实现syscall”?一些手册可能有传输数据的有用想法,可能会提到sys_datacopy、sys_copy、sys_vsafecopy、sys_safecopyfrom。另一个知识来源是x-ref系统(如metager)中的minix服务来源。de@osgx谢谢你的建议,我已经尝试过了,并且更新了我的问题。