Linux内核线程的调度或抢占如何工作?

时间:2014-01-29 17:31:13

标签: linux multithreading kernel scheduling preemption

据我所知,与用户空间线程/进程相比,linux内核线程没有自己的地址空间。内核线程不会将上下文切换到用户空间,但内核线程是可调度和可抢占的。所以我的问题是,如果内核线程没有地址空间,那么内核线程的切换/抢占是如何工作的?

1 个答案:

答案 0 :(得分:0)

内核线程基本上执行一个函数。它们是使用kernel_thread()函数创建的,该函数接收要执行的函数的地址,该函数的参数以及一些克隆标志作为参数。

这个函数实质上调用一个公共do_fork()传递内核模式堆栈的地址,其中copy_thread()将找到内核线程的CPU寄存器的初始值。

基本上kernel_thread()以下列方式构建堆栈:

  • ebxedx注册将由copy_thread()设置为值fnarg
  • eip将设置为加载参数的小例程call fn

这样新内核线程就开始执行fn(arg)

如您所见,内核线程知道fn地址要执行的代码。这个函数通常已经在内核的某处定义,通过设置eip来指向那里,这样内核线程知道要执行的指令。不需要text segment,因为不需要将可执行文件映射到内存区域。