线程的上下文保存在哪里,是不是可以通过编程方式访问(无需修改内核)?

Posted

技术标签:

【中文标题】线程的上下文保存在哪里,是不是可以通过编程方式访问(无需修改内核)?【英文标题】:Where is a thread's context saved and can it be accessed programmatically (without modifying the kernel)?线程的上下文保存在哪里,是否可以通过编程方式访问(无需修改内核)? 【发布时间】:2021-12-11 17:22:24 【问题描述】:

Windows Context Switching

调度器为每个线程维护一个可执行线程队列 优先级。这些被称为就绪线程。当一个处理器 变得可用时,系统执行上下文切换。中的步骤 上下文切换是:

保存刚刚完成执行的线程的上下文。 将刚刚执行完毕的线程放在队列末尾以获得其优先级。 找到包含就绪线程的最高优先级队列。 移除队列头部的线程,加载其上下文并执行它。

我对这个话题还不太了解,所以我不知道如何详细说明我的问题。线程的上下文保存在哪里,是否可以通过编程方式访问(编辑:读取)(无需修改内核)?

【问题讨论】:

出于好奇,如果您的程序能够修改自己挂起线程的上下文,您认为它会做什么? @SolomonSlow 可能不会修改,只是为了扫描目的而阅读。网络安全工具。 嗯...我正在删除我之前的评论。我没有想清楚这个问题。 Windows 可能有一个 debugging API。 (调试器如何在受保护模式的操作系统中工作?)我不知道你会在哪里寻找它,但这可能就是你想要的。 @SolomonSlow 确实如此,但恶意和良性程序都试图阻止调试,很容易检测到调试器已附加。 AFAIK,线程上下文存储在内核数据结构中,如果没有特权,您不能直接访问它,而且很可能不是来自用户空间。我不熟悉 Windows 内核,但是 Linux 内核模块可以很容易地访问调度信息,所以我猜内核模式的 Windows 服务也可以做到这一点。 【参考方案1】:

如果您拥有具有所需访问权限的线程的句柄,您可以暂停该线程,然后调用GetThreadContext。当线程运行时,值在实际的 CPU 寄存器中,当它不运行时,上下文存储在内存中,用户模式无法访问。

上下文存储各种 CPU 寄存器的值,它只对调试器和代码注入和错误日志等高级功能有用。

【讨论】:

以上是关于线程的上下文保存在哪里,是不是可以通过编程方式访问(无需修改内核)?的主要内容,如果未能解决你的问题,请参考以下文章

苹果笔记本macpro系统缓存保存在哪里?如何进入查看?

检查给定 UUID 的节点是不是存在

尝试捕获 NSManagedObjectContext 保存是不是有帮助?

在哪里保存核心数据上下文...?

编程中什么叫上下文

编程技巧篇之线程上下文