假设我们有一个系统调用write
,它接受一个缓冲区作为参数。此缓冲存储器是用户地址空间的一部分。
写入调用如何进一步成功?
假设如果我假设整个缓冲区被复制到内核空间并且现在该进程被抢占并且给出了一些其他进程,则CPU和新进程现在发出不同的系统调用,这可能会覆盖缓冲区之前的write
电话。
如何处理此类案件?或者有一种完全不同的机制,从用户空间到内核空间没有数据副本?
答案 0 :(得分:3)
通常,您不需要从用户空间复制到内核(单片内核)。对于虚拟内存系统,分配给进程的页面可由内核读取和写入。另一方面,数据确实需要复制,因为进程无法访问分配给内核的页面。
例如,如果您使用x86-64对Linux进行write
系统调用,则进程将使用文件描述符,缓冲区地址和大小调用write。 write
方法将系统调用号放入rax
(1),将参数放入寄存器(rdi
,rsi
,rdx
[,r10
,r8
]),并执行syscall
指令(进入内核)。调用被调度到处理程序,该处理程序将寄存器推送到内核堆栈,并执行调用号。在指针内存中没有明确复制数据。
Microkernels(Mach,L4等......)虽然不同。
答案 1 :(得分:0)
如果内核空间(具有复制的用户空间数据)在两个进程之间是通用的,我们应该为内核空间提供一些锁定机制,以保护它免受数据崩溃或竞争条件的影响。