假设我们有一个系统调用write
,它接收一个缓冲区作为参数。该缓冲存储器是用户地址空间的一部分。
write调用如何进一步成功?
假设如果我假设整个缓冲区被复制到内核空间并且现在进程被抢占并且其他一些进程获得了 CPU 并且新进程现在发出不同的系统调用,这可能会覆盖缓冲区之前的 write
调用。
如何处理这种情况?或者有一种完全不同的机制,其中没有从用户空间到内核空间的数据副本?
最佳答案
通常您不需要从用户空间复制到内核(整体内核)。对于虚拟内存系统,分配给进程的页面是内核可读写的。另一方面,数据确实需要复制,因为进程无法访问分配给内核的页面。
如果您以使用 x86-64 的 linux 的 write
系统调用为例,该进程使用文件描述符、缓冲区地址和大小调用 write。 write
方法将系统调用号放入rax
(1),参数放入寄存器(rdi
, rsi
, rdx
[, r10
, r8
]),并执行syscall
指令(进入内核)。该调用被分派(dispatch)到处理程序,该处理程序将寄存器压入内核堆栈,并执行调用编号。指针内的数据没有显式复制到内核内存中。
但微内核(Mach、L4 等...)有所不同。
- Anatomy of a System Call (这可能有帮助)
关于linux-kernel - 系统调用期间将数据复制到内核空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26127578/