Process Linux内核代码执行上下文

Process Linux内核代码执行上下文,process,linux-kernel,Process,Linux Kernel,当在用户空间中执行的进程发出系统调用或触发异常时,它进入内核空间,内核开始代表该进程执行。据说内核是在进程上下文中执行的。类似地,当中断发生时,内核在中断上下文中执行。我在内核线程中研究了内核执行,内核进程在后台运行 我的问题是: 内核是否在任何其他上下文中执行 假设用户空间中的进程从不执行系统调用或触发异常或不发生中断,那么内核代码是否执行过 假设用户空间中的进程从不执行系统调用或触发异常或不发生中断,那么内核代码是否执行过 假设您有一个进程p正在运行以下代码:while(1)。这段代码永远不

当在用户空间中执行的进程发出
系统调用
或触发
异常
时,它进入内核空间,内核开始代表该进程执行。据说内核是在
进程上下文中执行的。类似地,当中断发生时,内核在
中断上下文中执行。我在
内核线程
中研究了内核执行,内核进程在后台运行

我的问题是:

  • 内核是否在任何其他上下文中执行

  • 假设用户空间中的进程从不执行系统调用或触发异常或不发生中断,那么内核代码是否执行过

  • 假设用户空间中的进程从不执行系统调用或触发异常或不发生中断,那么内核代码是否执行过

    假设您有一个进程
    p
    正在运行以下代码:
    while(1)。这段代码永远不会调用内核,也不会导致任何错误。(它可能在前面设置了一个
    报警(3)
    ,导致将来发送信号,或者可能超过
    setrlimit(2)
    CPU限制,在这种情况下,内核将向进程发送信号。)

    或者,如果另一个进程通过
    kill(2)
    发送
    p
    信号,内核也会将该信号发送给该进程

    信号传递将导致信号处理程序运行、不执行任何操作(如果信号被忽略或屏蔽),或执行默认的信号操作(可能是不执行任何操作或终止)


    当然,进程的执行可以被中断,这样处理器就可以处理中断;或者一个更高优先级的进程可以抢占它。

    内核定期运行,它设置一个定时器以某种预定义的频率(100Hz(Linux 2.4/x86)、1000Hz(早期的Linux 2.6/x86)、250Hz(更新的Linux 2.6/x86))触发中断

    内核需要这样做才能进行抢占式多任务处理。OTOH,只执行协作多任务的操作系统(Windows 3.1,经典Mac OS)不需要这样做,只需在响应正在运行的任务的某些调用时切换任务(这可能导致失控的任务挂起整个系统)


    请注意,有一些努力可以优化此计时器的使用:当没有可运行的任务时,较新的Linux会更智能,它会在将来尽可能远地设置计时器,以允许CPU睡得更长、更深,并保持电源(
    CONFIG\u NOHZ
    kernel CONFIG选项)。运行
    powertop
    将显示每秒的唤醒次数,在空闲系统上,这可能比传统实现中每秒250次的唤醒次数低得多。

    我认为不可能存在从不执行系统调用的进程。同意。我想只有我在问题中提到的上下文存在于内核代码运行的地方?@balki:
    for(;)\uuuasm\uuuuuuuuuuuuuuvolatile\uuuuu(“nop”)也有NMI上下文,但您几乎可以忽略它。这在单CPU核心系统上是不正确的。如果没有中断、系统调用或异常,内核将如何运行?如果它不能运行,那么就不会有报警、cpu限制检查或其他进程运行。当然,事实是,在linux上,进程无法停止某些中断(例如计时器),而在SMP系统上,其他进程可以在其他线程上运行。@显然,如果您破坏了内核的正常“滴答”机制,它将停止工作。:)嗯,我注意到我上面的评论并不完全有意义,但要点是正确的。