【问题标题】:What happens to program when it accesses kernel space程序访问内核空间时会发生什么
【发布时间】:2017-07-29 04:28:04
【问题描述】:

我已经阅读了有关用户空间和内核空间以及程序的执行路径如何将其从用户空间带到内核空间的信息,我想一个例子是如果我的程序像这样运行

Poco::Net::SocketAddress sender;
char buffer[64000];
.
.
.
socket.receiveFrom(buffer, sizeof(buffer), sender);

由于这个调用需要访问网卡,我认为它应该进入内核空间。

我的问题是: 当程序调用 socket.receivefrom(...) 时会发生什么

  1. 线程是否进入睡眠状态并放弃其核心,因为它正在运行 到内核​​空间,并且只有在 char 缓冲区被唤醒时才会被唤醒 写了
  2. 写入字符缓冲区后线程是否直接进入内核空间并返回用户空间

【问题讨论】:

标签: linux-kernel


【解决方案1】:
  1. 没有。该线程以内核权限(x86 中的环 0)执行内核代码。线程可能会进入内核内部的“睡眠”(即 CPU 可能会去执行不同的程序,或者会进入空闲状态,这取决于调度程序的决定)。但是,它可能根本不会进入睡眠状态,例如,如果网卡中已经有数据可用。从用户的角度来看,您知道当调用返回时,您的数据在缓冲区中,您可能希望调用需要一段时间。

  2. 这取决于调度程序。您可能随时会受到中断并执行其他操作。但一般来说,是的,你去内核然后返回。

【讨论】:

    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2012-02-08
    • 1970-01-01
    • 2014-04-28
    • 2011-09-03
    相关资源
    最近更新 更多