3

假设我们有一个系统调用write,它接受一个缓冲区作为参数。该缓冲存储器是用户地址空间的一部分。

写调用如何进一步成功?

假设如果我假设整个缓冲区被复制到内核空间并且现在该进程被抢占并且一些其他进程被给予 CPU 并且新进程现在发出不同的系统调用,这可能会覆盖先前write调用的缓冲区.

这种情况如何处理?还是有一种完全不同的机制,不会从用户空间复制数据到内核空间?

4

2 回答 2

4

通常,您不需要从用户空间复制到内核(单片内核)。对于虚拟内存系统,分配给进程的页是内核可读写的。反过来,数据确实需要被复制,因为进程无法访问分配给内核的页面。

如果您write以 x86-64 的 linux 系统调用为例,该进程会使用文件描述符、缓冲区地址和大小来调用 write。该write方法将系统调用号放入rax(1),参数放入寄存器(rdi, rsi, rdx[, r10, r8]),并执行syscall指令(进入内核)。调用被分派给将寄存器推送到内核堆栈的处理程序,并执行调用号。没有将指针内的数据显式复制到内核内存中。

微内核(Mach、L4 等)是不同的。

于 2014-09-30T20:26:02.647 回答
0

如果内核空间(将有复制的用户空间数据)在两个进程之间是公共的,我们应该为内核空间提供一些锁定机制来保护它免受数据崩溃或竞争条件的影响。

于 2014-10-07T17:58:16.673 回答