C 在sys调用期间,谁检查地址是否可写 < P> >,考虑返回Strut的系统调用(如 GETTimeFoTe>代码>)。< /P>

C 在sys调用期间,谁检查地址是否可写 < P> >,考虑返回Strut的系统调用(如 GETTimeFoTe>代码>)。< /P>,c,memory,kernel,system,system-calls,C,Memory,Kernel,System,System Calls,现在,我做下面的通话 gettimeoftheday(&time, NULL) 现在,当调用sys调用时,我知道内核会检查是否为syscall传递了正确的参数。但是在这种情况下,检查指针时间是否可写是内核的工作吗?你说的“内核的工作”是什么意思 考虑一段恶意代码试图破坏内核,传递内核中某个内容的地址。如果内核没有适当的机制,它将破坏自己的状态。此外,地址可能完全无效 简而言之,当然内核必须检查它。在linux中,它们确实访问_ok()进行范围检查,并且有单独的u put_user/u

现在,我做下面的通话

gettimeoftheday(&time, NULL)

现在,当调用sys调用时,我知道内核会检查是否为syscall传递了正确的参数。但是在这种情况下,检查指针
时间
是否可写是内核的工作吗?

你说的“内核的工作”是什么意思

考虑一段恶意代码试图破坏内核,传递内核中某个内容的地址。如果内核没有适当的机制,它将破坏自己的状态。此外,地址可能完全无效


简而言之,当然内核必须检查它。在linux中,它们确实访问_ok()进行范围检查,并且有单独的u put_user/u get_user(和其他)原语来实际访问内容-如果无法读/写,这些原语将失败。

这将触发seg故障,就像在任何其他情况下一样,对吗?手册页中记录了这一点:失败时
gettimeofday()
应返回-1,记录失败的唯一原因是:
[EFAULT]参数地址引用了无效内存。