2016-08-18 8 views
0

手動のコンテキスト切り替えに問題があります。私は、スタックセグメントとスタックポインタを手動で保存し、それらを復元することにより、アセンブリコードを使ってCでマルチスレッドのカーネルを実装しています。単純なタスクは機能しますが、コード内に深く配置された関数を実行しようとしても、うまく動作しません。何が起こるかは、プログラムが実行されているcmd.exeのカーソルが左上から左下にジャンプし始め、コードが上書きされます。コンテキストを切り替えるときにcmdでカーソルがジャンプする

あなたは何かそのようなことをすることができますか?カーソルがどんどん上がっていくのですか?

+0

pfff ...ここに新しい、私は "ハイ"が自動的に削除されていることを知らなかった..:/ – tokyo

+0

あなたは新しいです:[ヘルプ]と​​[mcve]です。あなたの質問を明確にしてください: 'cmd.exe'はカスタムカーネルと何をする必要がありますか? –

+0

imは、C言語で書かれた.exeプログラムとしてカーネルのモデルを作っています。したがって、cmd.exeで開きます。それはスレッドのように機能を開始、一時停止、継続することです。 – tokyo

答えて

0

「cmd.exe」を考慮すると、Windowsでユーザーモードプログラムとして「カーネル」を実行することを前提としています。

この場合、容疑者はスタックガードページです。 Windowsはフルスタック用にRAMを割り当てません。割り当てられたRAMの最後にページフォールトをトリガする1つのページがあります。 Windowsはこのページフォルトをインターセプトし、スタックを拡張し、スタックに既にメモリが割り当てられているかのように処理を続けます。これは非常にあなたに依存しますは1ページ以上でスタックを成長させません。

スタックを手作業で操作すると、ガードページが破損し、奇妙なことが起こる可能性があります。同じスタックを2つのカーネル(Windowsと自分自身)で管理することはできません。