Sum*_*han 3 operating-system copy system-calls linux-kernel address-space
假设我们有一个系统调用write,它接受一个缓冲区作为参数。该缓冲存储器是用户地址空间的一部分。
写调用如何进一步成功?
假设如果我假设整个缓冲区被复制到内核空间,并且现在进程被抢占,并且其他进程获得了 CPU,并且新进程现在发出不同的系统调用,这可能会覆盖先前调用的write缓冲区。
这样的案件如何处理?或者存在一种完全不同的机制,其中不进行从用户空间到内核空间的数据复制?
通常,您不需要从用户空间复制到内核(整体内核)。对于虚拟内存系统,分配给进程的页面可由内核读写。另一方面,数据确实需要复制,因为进程无法访问分配给内核的页面。
如果以writex86-64 的 linux 的系统调用为例,进程会使用文件描述符、缓冲区地址和大小调用 write。该write方法将系统调用号放入rax(1),将参数放入寄存器 ( rdi, rsi, rdx[, r10, r8]),并执行syscall指令(进入内核)。该调用被分派到处理程序,该处理程序将寄存器推送到内核堆栈上,并执行调用号。没有将指针内的数据显式复制到内核内存中。
但微内核(Mach、L4 等)有所不同。