問題タブ [memory-segmentation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
winapi - ES、GS、FSを使用できるようにするWin32用のAPIはありますか?
アセンブラプログラムでES、FS、およびGSを使用して、3つの個別のアドレス空間を使用できるようにしたいと思います。
LDTをセットアップし、適切なセレクターの値を提供するWin32 APIはありますか?
linux - アセンブリの%gsとは
gccでコンパイルした後、この関数は次のアセンブリコードに変換されます。
私は2行を理解していません:
%gsとは何ですか、そしてこれらの2行は正確に何をしますか?
これはコンパイルコマンドです:
windows - TIB カスタム ストレージ
ここでかなりのグーグル検索といくつかのヒントを提供した後、最終的にセグメントのレイアウトを見つけることができましたFS
(TIBデータを保存するためにウィンドウで使用されます)。特に興味深いのはArbitraryUserPointer
、PSDK で提供されているメンバーです。
この変数を使用することは正確にどのくらい安全ですか (Vista 以降)? x64にはまだ存在しますか?
それに続くのは、この変数へのアクセスです。私は MSVC を使用しているため、__readfsdword
&__readgsqword
組み込み関数にアクセスできますが、MSDNは何らかの理由でこれらを特権命令としてマークしています。
これらの組み込み関数はカーネル モードでのみ使用でき、ルーチンは組み込み関数としてのみ使用できます。
もちろん、それらはカーネルだけではありませんが、なぜそのようにマークされているのですか?ドキュメントが間違っているだけですか? (私のオフライン VS 2008 ドキュメントにはこの句がありません)。
最後に、ArbitraryUserPointer
シングルを介して直接アクセスするのは安全__readfsdword(0x14)
ですか、それともリニア TIB アドレスを介して使用することをお勧めしますか? (これはまだ からの読み取りが必要ですFS
)。
operating-system - 最新のオペレーティングシステムにおけるメモリセグメンテーション
オペレーティングシステムの研究(主にLinuxを参照)では、私が研究した資料では十分に説明されていない点がいくつかあります。
メモリにロードされたプログラムは、仮想メモリが純粋にページングに基づいているLinuxのようなオペレーティングシステムのコンテキストでも、テキスト、データ、スタックなどのセグメントに分割されていると説明されることがよくあります。セグメント化されたと呼ばれるのはプログラムだけであり、メモリ自体ではないというのは事実ですか?もしそうなら、私は用語が混乱していると思います。
データセグメントのサイズを大きくする「sbrk」という呼び出しを使用して、mallocをLinuxに実装できることを確認しました。繰り返しますが、この「データセグメント」は、「実際の」セグメントではなく、慣例によりデータに使用されるメモリの領域にすぎませんか?(追加の質問:「sbrk」は「セグメント」のサイズを縮小できないようです。これは、プロセスが終了する以外にOSにメモリを解放できないことを意味しますか?)
また、最近のオペレーティングシステムが(ページングされた)セグメンテーションを使用していないように見える理由を知りたいと思います。特定の種類の攻撃を防ぎ、コードを独自の保護されたセグメントに配置して、セキュリティを強化しませんか?一方で、これは例えばJITコンパイルを不可能/困難にするでしょうか?
上記の質問に対する「はい」/「いいえ」の回答に加えて、私はこの主題に関する洞察に満ちた詳細に興味があります。
assembly - セグメントの計算:絶対アドレスからのオフセット
Segment:Offset
アドレスはSegment
*0x10+として計算できますOffset
。しかし、どうすれば反対を計算できますか?
たとえば、どのようにから0xF4170
へF400:0170
、から0xACF04
へ行くのABCD:1234
ですか?
memory-management - プロセスマップに関する質問
ここでは、2 つの異なる端末で同じプログラムの 2 つのインスタンスを実行しています。それらのプロセスマップは
最初のターミナルで -
第2ターミナルでは -
私の質問は -
「/lib/x86_64-linux-gnu/ld-2.13.so」このライブラリには、端末 1 と 2 に 2 つの異なるアドレス ( 00007f90f279a000 と 00007f3b0b0cb000 ) があります。このライブラリがメイン メモリに 2 回読み込まれるということですか。
a.out が単純な Hello_World.c プログラムのバイナリであると仮定します
次に、a.out のどの部分に r & w パーミッションがありますか? 簡単に言えば、ソース「0000000000601000 4K rw--- /home/vikram/a.out」のどの部分がこのセグメントに含まれていると思われますか?
anon が他のセグメントのように連続していないのはなぜですか?
What " 00007f90f2590000 2044K ----- /lib/x86_64-linux-gnu/libc-2.13.so " このセグメントには .... 読み取り、書き込み、実行権限がないため、含まれているはずです。
c - Win32 での TIB アクセス
次のような、TIB で動作する Win32 API 関数の実装を掘り下げます。
- TLS アクセス機能:
TlsAlloc
、TlsFree
、TlsSetValue
、TlsGetValue
GetLastError
、SetLastError
- メッセージング サブシステム:
GetMessage
などPeekMessage
。
fs:[0x18]
セレクターの内容を読み取ることによって、それらすべてが TIB (TEB と呼ばれることもあります) にアクセスすることがわかります。
OTOH fs
registerが直接指しているので、これは不要です。この記事と私が実際に見たものによると、registerfs
は TIB 構造の先頭へのアドレスを保持しますが、オフセット 0x18 にはそれ自体へのポインターがあります。
それにもかかわらず、TIB に間接的にアクセスする理由は何でしょうか?
c - バス エラー: 10. C コード、malloc の例
次の C コードをコンパイルしようとすると、バス エラーが発生します。私が memcpy を呼び出した方法と関係があると思いますが、それを理解することはできません。どんな助けでも大歓迎です!
gdb - gdbでFSまたはGSベースで論理アドレスを使用するには?
gdb は、特定の線形アドレスに対して読み取りまたは書き込みを行う機能を提供します。次に例を示します。
しかし、どのように論理アドレスを指定しますか? 次の指示に出くわしました。
gdb の "%gs:0x14" でメモリを読み取る方法、またはこの論理アドレスをx
コマンドで使用できる線形アドレスに変換する方法を教えてください。
注: この命令の後、単に %eax を読み取ることができることはわかっていますが、それは私の関心事ではありません
assembly - 「FS」/「GS」レジスタの目的は何ですか?
だから私は次のレジスタとその使用法が何であるかを知っています:
CS =コードセグメント(IPに使用)
DS =データセグメント(MOVに使用)
ES =宛先セグメント(MOVSなどに使用)
SS =スタックセグメント(SPに使用)
しかし、使用することを目的とした次のレジスタは何ですか?
FS = "ファイルセグメント"?
GS = ???
注:私は特定のオペレーティングシステムについて質問しているのではありません。CPUがそれらを何に使用することを意図していたのかについて質問しています。