想象一下用户空间线程(通过WinApi创建)。
除了:
我听说它拥有内核模式堆栈 - 12 KB - x86,24 KB - x64
q1:什么是内核堆栈的问题?
据我所知,当我们进行系统调用时:
在我们的上下文中使用值或指针填充寄存器
通过INT或甚至CALL(保护模式下的远程呼叫)启动中断
这里我们处于内核的中断服务程序中。
q2:我想 OS阻止用户线程,直到OS未完成任务。是这样吗?
也许我们现在部分是设备I / O控制管理器(如果我们发送irp数据包)。也许在其他一些(如果我们决定创建信号量)。如果这段代码是可重入的,那么系统我认为可以从池中获取一个内核线程。
q3:我认为内核线程与启动所有这些工作的用户空间线程没有任何共享。我错了吗?
答案 0 :(得分:0)
我对问题进行了一些调查:
q1:什么是内核堆栈的问题?
a:与用户线程相关的内核堆栈。由于异常纤维不是 一个真正的线程,不包含内核堆栈。
问题2:我认为操作系统会阻止用户线程,直到操作系统未完成任务。是这样吗?
a:如果用户线程执行syscall,或者“陷阱”,那么我们进入内核模式,内核代码将在上下文中执行,称为“异常上下文陷阱”,而且这段代码可以看到用户空间进程的所有内存,线程发起它。实际上可以说它是类似的线程。
q3:我认为这个线程与启动所有这些工作的用户空间线程没有任何关系。我错了吗?
a:在这种“异常上下文陷阱”中,kenrel代码查看用户空间线程进程所有者的完整用户空间内存。当来自用户空间的线程执行I / O请求时,I / O Dispatcher(在内核模式下)执行一个工作驱动程序例程的调用...(它将在用户空间线程的上下文中执行)。它的设计就是......
但它在内核中存在其他两个上下文:
中断上下文,没有关于maped内存的保证
Kerenel模式线程上下文。如msdn中所述,关于PsCreateSystemThread “这样的系统线程没有TEB或用户模式上下文,只能在内核模式下运行。”
文献:
Windows 2000设备驱动程序书,第二版,Art Baker,Jerry Lozano 第3章,内核模式I / O处理
Microsoft®Windows®2000,第三版,David A. Solomon和Mark E. Russinovich,第6章。
p.s。我不会提供书籍链接,因为它受到stackoverflow策略的限制。有人给了我更多的弊端,由于愚蠢的问题和愚蠢的链接,我将在这个论坛中被封锁......