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