【问题标题】:Cursor jumping in cmd when switching context [closed]切换上下文时光标在cmd中跳转[关闭]
【发布时间】:2016-12-25 13:13:30
【问题描述】:

我遇到了手动上下文切换的问题。我通过手动保存堆栈段和堆栈指针并恢复它们,在 C 中使用汇编代码实现多线程内核。简单的任务可以工作,但尝试执行位于代码更深处的函数表现不佳。发生的情况是,正在运行程序的cmd.exe 中的光标开始从左上角跳到左下角,并且代码会自行重写。

你能建议什么可以做这样的事情吗?是什么让光标一直向上?

【问题讨论】:

  • pfff...我是新来的,我不知道“hi”会被自动删除.. :/
  • 因为你是新人:help centerminimal reproducible example。请澄清您的问题:cmd.exe 与自定义内核有什么关系?
  • 我正在将内核模型制作为用 C 语言编写的 .exe 程序。所以它在 cmd.exe 中打开。它的作用是像线程一样启动、暂停和继续功能。
  • 请再次发送minimal reproducible example 或至少换位思考。我们如何在没有看到一行代码和任何有用信息的情况下合理地回答您的问题?你是如何抢占这些功能的?你保存什么上下文?你如何处理堆栈?站在这个问题上是无法回答的。
  • 对不起,细节不够。但是我的代码都在类中,你要通过它真的很痛苦。我的问题是什么可能导致 cmd 中的光标从底部跳到顶部,以便我可以分析我的代码并找到错误在哪里。感谢您的宝贵时间!

标签: c windows assembly context-switch


【解决方案1】:

考虑到“cmd.exe”,我假设您将“内核”作为 Windows 中的用户模式程序运行。

在这种情况下,嫌疑人是堆栈保护页面。 Windows 不会为整个堆栈分配 RAM;在分配的 RAM 末尾有一个页面会触发页面错误。 Windows 拦截此页面错误,增加堆栈,然后继续,就好像堆栈已经分配了内存一样。这主要取决于您将堆栈增加超过一页。

如果您手动弄乱堆栈,则保护页面可能会损坏,并且可能会发生奇怪的事情。您不能让两个内核(Windows 和您自己的)管理同一个堆栈。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多