有没有办法在Minix 3中访问和修改系统调用中的用户数据?我可以在这里使用sys_datacopy()吗?为什么我的尝试不起作用?

时间:2017-03-10 11:55:38

标签: linux pointers kernel system-calls minix

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

我使用Minix的消息传递机制将数据传递给系统调用。在传递的message结构中,我从我想要传递的用户空间中指定了一个指向变量地址的指针。

例如,在用户程序中,

message m;
m.m1_p1 = &var; //data to be passed
//pass it to the syscall

在内核中,在syscall函数中,我做

char *ptr = m_in.m1_p1;

然而,当我尝试读取或写入数据时,我收到内核惊慌失措的错误,需要重新启动。

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

在进一步搜索时,我发现Linux有函数copy_from_user()copy_to_user()来实现这一点。

是否有相当于这个是Minix?如果没有,还有其他方法可以达到这个目的吗?

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

我最近的尝试如下:

在用户程序中,

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

现在,我可以使用var访问系统调用中ptr的值,并在系统调用中修改它。但是,从系统调用返回后,我发现`var'的基础值没有改变。

根据我的理解,应该发生的事情是sys_datacopy()应该将位于系统调用的地址空间中的等效虚拟m_in.m1_p1复制到ptr,到同一个物理地址。因此,*ptr应该完全达到var,从而对其进行修改。

或者当我使用sys_datacopy()时,是否复制了与地址对应的数据?如果是这种情况,我能想到的一个解决方案是定义一个允许双指针的消息结构,并将char**传递给系统调用。然后,取消引用一次将确保将地址复制到ptr。但是再一次,取消引用ptr将尝试取消引用属于用户进程的地址空间的虚拟地址,这将无效。

  

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

我正在使用Minix 3.2.1。

谢谢。

0 个答案:

没有答案