問題タブ [memory-layout]
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.
c - 関数ポインタのインクリメント
関数ポインタ(関数のマシンコードが格納されているアドレスを指すポインタ)について学びました。これにより、マシンコードとそれがメモリにどのように格納されるかについて考えさせられました。
マシンコードはメモリに連続して保存されているので、次/前の関数を指すまでポインタを「手動で」増やすことができますか?
これは、デバッガーが行うことですか?彼は私にプログラムカウンターがマシンコードのどこを指しているのかを「見る」ようにさせてくれますか?
結論:関数ポインターを使用してプリミティブデバッガーをプログラムできますか?
私はこの権利を理解しましたか、それとも私は道を外れていますか?
c - バイト配列との間で浮動小数点値を読み書きする方法は?
この質問は以前に何度も聞かれたと思いますので、簡単に検索したところ、浮動小数点値の構造を説明しているこのウィキペディアのページが見つかりました。
いくつかの浮動小数点値 (ゲーム用) で構成されるネットワークを介してデータを送受信しているため、次の質問が発生します。
- エンディアンを気にする必要はありますか?
*(float*)
エンディアンが重要な場合、キャストやユニオンを行わずにこれらの値を抽出するにはどうすればよいですか? (整数のビットシフトを伴うトリックなど)
前もって感謝します。
c++ - ひし形の多形継承:最も派生したクラスのサイズ
ダイアモンド型の継承はあいまいさを引き起こし、継承を使用することで回避できることを理解してvirtual Base Classes
います。問題はそれに関するものではありません。問題は、クラスがポリモーフィックである場合の、ひし形の階層で最も派生したクラスのサイズについてです。サンプルコードとサンプル出力は次のとおりです。
私が得る出力は次のとおりです。
私が理解しているようBase
に、仮想メンバー関数が含まれているため、
この環境では、sizeof Base=vptrのサイズ=4です。
Derived1
ケースとDerived2
クラスも同様です。
上記のシナリオに関連する私の質問は次のとおりです。クラスオブジェクト
のサイズはどうDerived3
ですか。Derived3クラスに2つのvptrがあるということですか?
クラスはこれらの2つのvptrでどのDerived3
ように機能しますか、それが使用するメカニズムについてのアイデアはありますか?
クラスのsizeofは、コンパイラの実装の詳細として残され、標準では定義されていません(仮想メカニズム自体はコンパイラの実装の詳細であるため)?
windows - Windows プロセスのメモリ マップはどのようなものですか?
これは重複した質問である可能性があります。Windows プロセスのメモリ マップがどのように見えるか知りたいですか? 詳細を探しています。ブログ、記事、その他の関連文献へのリンクを提供してください。
linux - アドレス0x8048080の重要性
gdbでasmsourceをデバッグするときに0x8048080である場合、コードへの開始エントリポイントとして選択されたアドレスはなぜですか?これは単なる相対オフセットであり、命令のメモリへの実際のオフセットではありませんよね?
linux - Linux プロセスのメモリ レイアウトに関する質問
Intel 32 ビット プラットフォームについて話しています。Linux カーネル バージョン 2.6.31-14。
出力:
上記のコードでは、次の混乱があります。0x8048484
たとえば、仮想メモリの先頭近くのどこかではなく、コードがどこかにあるのはなぜ0x00000400
ですか? 私の知る限り、レイアウトは次のようになります。
ローメモリ.................................................................HighMemory
したがって、テキストはメモリの奥深くにあるべきではありません。下位メモリに近いはずですよね?
c - ELF64 / x86_64およびメモリマッピングセグメントの開始アドレス(共有オブジェクトの場合)
私はいくつかのプログラムを作成しましたが、64ビットでコンパイルすると、メモリマッピングセグメント(たとえば、共有オブジェクトと共有メモリが保持される場所)は常に7f9aca84a000-7fff88400000付近にありますが、まったく同じになることはありません。
x86_64アーキテクチャ(ELF64)でこのメモリセグメントの開始アドレスが固定されているかどうか、またはこのセグメントの最大範囲と最小範囲はどれくらいか知りたいのですが。
これが私がこの質問をする理由です。システムをTru64UNIXからLinuxに移行しています。このシステムは、IPC Sys V共有メモリの複雑な固定メモリマッピングを使用し、チェーンリストを使用してこのセグメント内の構造から別の構造に移動しています。このコードのサイズと複雑さ、および手元にある限られた時間で、共有メモリの開始を修正する堅牢な方法を見つけようとしています(セグメントをアタッチするために指定されたアドレスでshmatを効果的に使用します) )。64ビットの仮想アドレス空間は非常に大きいため(48ビットの事実上可能なアドレス)、「安全な」固定アドレスの選択は32ビットよりもはるかに簡単でリスクが少なくなります。
c++ - 3intの構造体のベクトルを配列として解釈する
OpenGLには、BufferData(int array[])
wherearray
の形式などの関数がありますx-y-z x-y-z ...
。
これは単に整数のシーケンスであり、連続する各3タプルが頂点として解釈されます。
これをstd::vectorとして表すのは安全ですか?ここで、頂点は次のように宣言されます:
私の意見では、これにより、何が起こっているのかが意味的に明確になります。しかし、これが機能することを保証することは可能ですか?
そうでない場合、データのよりセマンティックな表現を提供する他の方法はありますか?
linker - 「ld -e」オプションで ELF エントリ ポイント 0x8048000 を変更できないのはなぜですか?
フォローアップELF 実行エントリ ポイントの仮想アドレスが、0x0 ではなく 0x80xxxxx の形式になっているのはなぜですか? Linux バイナリの仮想メモリ アドレスが 0x8048000 から始まるのはなぜですか? ld
、デフォルトとは異なるエントリ ポイントを使用できないのはなぜld -e
ですか?
その場合segmentation fault
、デフォルトのエントリ ポイントに近いアドレスであっても、リターン コード 139 が返されます。なんで?
編集:
質問をより具体的にします。
これを でコンパイルしas program.s -o program.o
て静的にリンクするとld -N program.o -o program
、テキスト セグメントの およびエントリ ポイントとしてreadelf -l program
表示0x0000000000400078
されます。実行すると、「Hello world」が出力されます。VirtAddr
0x400078
しかし、ld -N -e0x400082 -Ttext=0x400082 program.o -o program
(テキストセグメントとエントリポイントを4バイト移動して)リンクしようとすると、プログラムはkilled
. で検査するとreadelf -l
、タイプ の 2 つの異なるヘッダーが表示されます。1LOAD
つは at で0x0000000000400082
、もう 1 つは at0x00000000004000b0
です。
試してみると、すべて機能し、セクション0x400086
は 1 つしかありません。LOAD
- 何が起きてる?
- 選択できるメモリアドレス、選択できないメモリアドレス、およびその理由は?
ありがとうございます。
assembly - Windowsはメモリレイアウトを処理します
それで、私はOllyデバッガーで遊んでいて、ウィンドウについてまだ見つけられないことを嗅ぎ回っていました。そのMボタンを押すと、そのメモリマップウィンドウがポップアップしました。それで私はこの主題に関するいくつかの記事をグーグルで検索しました、そして私は実際に私が試した64K以上のアドレスに書くことができることを知りました..なぜそれはうまくいかないでしょう。これらの下位2GBのスペースについて:
なぜそれらのギャップがあるのですか?たとえば、0x10000-0x1FFFF R / Wableスペースがあり、128Kはなく、読み取り可能なスペースがあります。つまり、これはすでに正しくページングされているので、物理空間のように過去に何かがあったかどうかは実際には問題ではありません(0x20000-0x40000はとにかくr / wに完全に問題ないはずです)、なぜ誰かがそうしないことに決めるのでしょうかランダムにアドレス空間を使用しますか?ollyデバッガーからのメモリマップでは、列に「含む」と表示されている場所に多くの行が空白のままになっているため、混乱している可能性があります。おそらく、私がollyからこのメモリマップに対して置くことができ、どのスペースがどのような目的を持っているのか、したがってこのようにページングされているかどうかを知ることができるいくつかの参照がありますか?
私が実際にメモリ管理について何も台無しにしないと仮定すると、ヒープを使用する代わりにその低いメモリを使用してWindows用のプログラムを作成しても大丈夫ですか、それとも問題が発生する可能性がありますか?
この質問を読んでいただきありがとうございます。
編集
ああ、ここでは0x10000にあるものを使用します。これが、おそらくそのページが書き込み可能になる理由でもあります。