linux-kernel - 系统调用期间将数据复制到内核空间

标签 linux-kernel operating-system copy system-calls address-space

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

write调用如何进一步成功?

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

如何处理这种情况?或者有一种完全不同的机制,其中没有从用户空间到内核空间的数据副本?

最佳答案

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

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

但微内核(Mach、L4 等...)有所不同。

关于linux-kernel - 系统调用期间将数据复制到内核空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26127578/

相关文章:

linux - 如何将物理地址用作网络以及 DMA 如何连接到它?

c - linux 内核中自旋锁并发导致的内核崩溃

linux - 在 ARM 的其他 cpu 内核中运行内核函数

memory-management - 什么是颠簸?为什么会发生?

c# - 如何在 C# 中复制具有特定日期的文件

Java - 将给定的小数组粘贴到指定位置(或间隔)的另一个更大的数组中

linux - Linux内核虚拟内存中的直接映射

c - fork() 和 ~fork() 有什么区别

assembly - 在 x86 Assembly 中使用 PC 扬声器播放声音

hadoop - 如何从HDFS拷贝文件到本地文件系统