1

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

4

1 回答 1

1

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

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

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

  • ebx并且edx寄存器将被设置copy_thread()为值fnarg
  • eip将设置为一个小例程,该例程将加载参数和call fn

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

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

于 2014-01-29T17:50:57.540 回答