据我所知,与用户空间线程/进程相比,linux内核线程没有自己的地址空间。内核线程不会上下文切换到用户空间,但内核线程是可调度和可抢占的。所以我的问题是,如果内核线程没有地址空间,那么内核线程的切换/抢占如何工作?
1397 次
1 回答
1
内核线程基本上执行一个函数。它们是使用函数创建的,该kernel_thread()
函数接收要执行的函数的地址、该函数的参数和一些克隆标志作为参数。
这个函数本质上调用了一个公共函数do_fork()
,将内核模式堆栈的地址传递给它,在那里copy_thread()
将找到内核线程的 CPU 寄存器的初始值。
基本上kernel_thread()
以以下方式构建堆栈:
ebx
并且edx
寄存器将被设置copy_thread()
为值fn
和arg
eip
将设置为一个小例程,该例程将加载参数和call fn
这样新的内核线程开始执行fn(arg)
。
如您所见,内核线程通过fn
. 这个函数通常已经在内核内部的某个地方定义了,通过设置eip
指向那里,这样内核线程就知道要执行的指令。不需要,text segment
因为不需要将可执行文件映射到内存区域。
于 2014-01-29T17:50:57.540 回答