プログラムを実行する前に、esp
レジスタが有効なアドレスを指すように設定されていますか? exec
へのコール中にまたはユーザー空間自体に?私はカーネルコードを使いこなし、どこにも見つからないようです。ユーザーモードの一つとカーネルモードのための1:espレジスタはいつlinuxに設定されますか?
答えて
背景
のx86 CPUは、(タスクあたり)2(実際には4つ)のスタックを持っています。
割り込みがユーザモードで発生した場合、CPUは、カーネルのスタックのアドレスにesp
を設定する(詳細については、「TSS」を参照)とesp
の元の値をプッシュする(ユーザモードのスタックの位置()にカーネルの)スタック。 eip
,cs
およびeflags
は、割り込みが発生すると常にスタックにプッシュされます。
割り込みから復帰するとき、iret
命令は、(カーネルの)スタックからの "古い"レジスタ値をポップし、スタックポインタは再びユーザのスタックを指します。
プリエンプティブマルチタスクオペレーティングシステムは、典型的には以下のように動作します:
いくつかのタスクは、このタスクは、時間の非常に少量のCPU負荷の100%を取ることを意味して実行されています。タイマ割込みが発生すると、現在実行中のタスクのレジスタ値が(CPUによって)スタックに格納されます。 OSはpush
の値を他のすべてのレジスタの値に置き換え、esp
の値を別のタスクのカーネルスタック(別のタイマ割り込みが発生したときに保存されたもの)に変更します。次にpops
レジスタを実行し、iret
を実行するので、すべてのレジスタには別のタスクの値が含まれ、他のタスクは実行されます。
Linux(4.12.2)、x86-32では、アセンブリソース "entry_32.S"の関数__switch_to_asm
によって行われます。あなたの質問
へ
直接答え新しいタスクが作成されると2つのスタック(ユーザとカーネルスタックが)そのタスクに割り当てられると、割り込みにpoped
れる初期レジスタ値が書き込まれカーネルスタック。これには、ユーザモードの初期値esp
が含まれます。
一部のタイマーは後で割り込みが発生します(すでに実行中のタスクが再起動されたのと同じ方法で)。
fork()
は、単にカーネルスタックをコピーします。で(古いバージョン)Linuxは、新しいタスクを作成するために使用される二つのコマンドがあります。
fork()
ので、すでに既存のタスクと同じでなければなりません(esp
を含む)すべてのレジスタ値execve()
新しいカーネルスタックを割り当てないであろう(新しいタスクが作成されますが、別の実行ファイルは、現在のタスクで実行されている)既存のタスクを複製します。 Execveは新しいユーザースタックを割り当て、esp
の値をカーネルスタックに上書きします。 (Mark Plotnickのコメントは、これが行われた位置を示しています)
- 1. $ espレジスタが見つかりません
- 2. ESPレジスタとSSレジスタの違いは何ですか?
- 3. tt_news - "newsMoreLink"レジスタはどこに定義されていますか?
- 4. 親ビュー/プレゼンテーションビューコントローラはモーダルビューコントローラにいつ設定されますか?
- 5. Linuxカーネルオペレーティングシステムのレジスタ
- 6. いつSQL ServerにIS_MEMBERが設定されていますか?
- 7. 保存されたEBPはまだEBPレジスタにリンクされていますか?
- 8. Easeljs getBounds、寸法はいつ設定されますか?
- 9. HttpContext.User.Identityはいつ設定されますか?
- 10. 地方辞書はいつ設定されますか?
- 11. 'created_at'と 'updated_at'はいつ設定されますか?
- 12. UITextFieldのテキストプロパティはいつ設定されますか?
- 13. ログバック設定ファイルはいつロードされますか?
- 14. Androidビューの幅はいつ設定されますか?
- 15. いつSqlDataSourceにコントロールが設定されますか?
- 16. システムコールを開始するとき、どのようにユーザモードのssとespが保存されますか? Linuxで?
- 17. これらのレジスタはなぜスタックにプッシュされますか?
- 18. ローカルホスト上のCookieは設定されていますが、ライブサーバーには設定されていませんか?
- 19. solaris/linuxでJNIメソッドのJNIEnvを渡すために使用されたレジスタは?
- 20. MIPS/QtSpimレジスタ1はアセンブラエラー用に予約されています
- 21. asp.net:子コントロールのVisibleプロパティはいつ自動的に設定されますか?
- 22. yii2のcookieはlocalhostに設定されていますが、ライブサーバーには設定されていません
- 23. Linux - 接続されたデバイスにカスタムボーレートを設定する方法
- 24. アラームは正常に設定されますが、予定日は設定されていません
- 25. "リモートペアコーディング"環境のlinuxをlinuxに設定するにはどうすればよいですか?
- 26. PymodbusクライアントのsetValuesが100個のレジスタに限定されています
- 27. ここで、$ PATHはxcodeに設定されていますか?
- 28. 通常$ GEM_PATHはどこに設定されていますか?
- 29. vimの履歴は何に設定されていますか?
- 30. NSMenuItem TitleはStringとNSStringに設定されていますか?