問題タブ [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.
operating-system - セグメンテーションはページングよりも安全ですか?
この質問は、Galvin でメモリ管理を読んでいるときに発生しましたか? わからない部分が2つありました。
最初の質問は、Galvin からの直接の質問です。
私が理解できなかった答えは、
「セグメンテーションはメモリの物理的な分割ではなく論理的な分割に基づいているため、任意のサイズのセグメントは、各ユーザーのセグメント テーブル内の 1 つのエントリのみと共有できます。ページングでは、共有される各ページのページ テーブル内の共通のエントリ"
1) セグメンテーションで再入可能コードを共有する方が簡単なのはなぜですか?
2) セグメンテーションはページングよりも安全ですか?なぜですか?
assembly - セグメント レジスタ (現在) を使用する利点は何ですか?
私はセグメントレジスタの目的が何であるかを学ぶためにかなりの時間を費やしていましたか? これは、物理メモリが 1 MB しかなかった過去 (8086) に由来することを知っています。しかし、CPU には 16 ビット幅のアドレス レジスタしかありませんでした。これらの 16 アドレス ビットでは、64K バイトしかアドレス指定できません。したがって、1MByte のアドレス空間は、それぞれ 64K サイズのセグメントに分割する必要がありました。
これは、限られたメモリ空間などを回避することを技術者が嫌う過去からの要件のように思えます。しかし、私の質問は、今日のセグメント レジスタの利点は何ですか? どのように、またはどこでレジスターを有用な方法で使用しますか? 説明が必要な場合は、コメントしてください。
operating-system - セグメンテーションの仕組みと、セグメント テーブルから物理メモリ アドレスを計算する方法
オペレーティング システムのセグメンテーションのトピックを調べていました。
メモリにロードされたプロセスのアドレス空間に存在する可能性のある空き領域のために、セグメンテーションの概念が生まれたことを学びました。
最初に、研究から理解したいくつかのことを説明しようとします。何か間違っている場合は修正してください。
たとえば、理想的なケースではないかもしれないセグメンテーションが使用されていない場合を考えてみましょう
メモリにロードされた小さなアドレス空間を持つプロセスがあります。プロセスのアドレス空間が物理メモリの先頭に配置されていない可能性があるため、プログラムコードのアドレスを変換するメカニズムが必要です (コードセグメント、どこからPC が指している命令が実行されます) を実際の物理メモリアドレスに割り当てます。したがって、実行中のプロセスのベース値とバインド値を維持するために、この目的のためにハードウェア レジスタ (MMU) を使用します。実行中のプロセスの最後のアドレス。MMU はグローバルであるため、コンテキストの切り替え中にベース/バウンド値を保存する必要があります。
だからここにphysical memory address = virtual memory address + base;
ここで、大きなアドレス空間を持つプロセスがあるとしましょう。プロセスのアドレス空間には、ヒープとスタック、またはコードとヒープの間に大量の空き領域が含まれている可能性があるため、空き領域をより有効に利用するためのセグメンテーションなどのメカニズムが必要です。
セグメンテーションのために、各プロセスのセグメント テーブルを維持します (コンテキストの切り替え中にテーブルを PCB に保存する必要があります)。
セグメンテーションでは、実行中のプロセス アドレス空間の論理セグメントごとにベース/バウンド値を維持します。そのため、理想的には、コード、スタック、ヒープ セグメントごとにベース/バウンド値を維持し、これらの値をセグメント テーブルに格納します。
したがって、セグメント テーブルは次のようになります。
物理メモリはこのように見えるかもしれません..
プロセッサがコード命令の実行中に仮想メモリ アドレスを物理メモリ アドレスに変換する必要がある場合、セグメント テーブルには多くのベース値が存在する可能性があるため、選択するベース値をどのように知るのでしょうか?
命令がいくつかのスタック変数を更新することであるとしましょう..この場合、スタックのベース値をどのように選択しますか?
物理メモリアドレス=スタックのベースアドレス+命令からの仮想メモリアドレスですか?
また、外部の断片化とは別に、セグメンテーションの欠点は何ですか.
セグメンテーション//ページング/仮想化の概念に関する詳細な説明を含む外部リンクは、非常に役立ちます。
operating-system - プログラマーとオペレーティング システムのセグメンテーション
オペレーティング システムでのセグメンテーションは、さまざまなセグメント (プログラムの場合、これらはシンボル テーブル、ソース テキスト、スタックなどを表すことができます) を論理メモリ アドレス 0 から始まるユニットに分割することに基づいていることを学んでいます。 MMU (?) がオフセットに加えて実数を取得するために使用する仮想アドレス。
セグメンテーションの明らかな利点は、各セグメントがアドレス 0 から開始されるため、複数のプロセスが単一のセグメントを同時に利用できることです (共有ライブラリがその例です)。
ただし、セグメンテーションがプログラマーにどのように役立つかはわかりません。いくつかの例は何ですか?
ありがとう!
c - スタック、データ、および命令セグメントはどこに実装されていますか?
そのため、x86-64 ではメモリ セグメンテーションが廃止されましたが、アセンブリを使用すると、コードで .code および .data セクション/セグメントを指定でき、スタック ポインター レジスタもあります。
また、スタック セグメント、データ セグメント、およびコード セグメント レジスタ。
コード/データ/スタックの分割はどこでどのように行われますか? CPU または OS によって実装されますか?
C プログラムをデバッグして逆アセンブル ビューを表示すると、アドレス空間は分割されずに線形になるためです。
そして、データ セグメントにグローバル、静的、およびヒープの「パーツ」があると彼らが言うとき、これは OS の抽象化ですか?
assembly - アセンブラは、シンボル アドレスのセグメントとオフセットをどのように計算しますか?
コンパイラやアセンブリ言語について学んできたので、演習として自分のアセンブラを書いてみたいと思います。しかし、いくつか質問があります。
@DATA や OFFSET/ADDR VarA などのセグメントのアドレスを計算するにはどうすればよいですか?
例として、簡単なアセンブリ プログラムを取り上げます。
では、アセンブラはセグメントのセグメント アドレスをどのように計算するの@data
でしょうか。
そして、何を即時に入れるべきかをどのように知るのmov dx, offset msg
でしょうか?
x86-16 - セグメンテーションと 8086 Intel のマイクロプロセッサについて誰か助けてくれませんか?
Intel の 8086 のアーキテクチャについて読んでいますが、セグメンテーションに関する次のことがわかりません。しかし、セグメント レジスタの物理アドレスを誰が計算し、どの時点で設定するのでしょうか。また、1 つの物理アドレスに複数の segment:offset ペアがアクセスでき、セグメントがオーバーラップする可能性があるため、何かを上書きしないようにするにはどうすればよいでしょうか? これについての詳細はどこで読めますか?
assembly - セグメント レジスタと段落境界 8086
セグメントレジスタは、ベースアドレスとして使用される物理アドレスを保持しますか、またはセグメントは段落境界でのみ開始できるため、セグメントレジスタはその段落境界の序数のみを保持し、10H を掛けると最終的な物理ベースになります。アドレスが形成され、オフセットが追加されます。私は正しいですか?
x86 - コードセグメントにアクセスする際の特権レベルチェック
Intel x86 アーキテクチャに関するいくつかの詳細を理解しようとしています。私はまだコールゲートのメカニズムを本当に理解していませんが、それがなければ、非準拠のコードセグメントにアクセスするには、DPL が CPL と等しくなければなりません。
DPL < CPL の場合は重要であることは理解していますが、DPL > CPL の場合は禁止されているのはなぜですか? つまり、同じ特権レベルを維持したい場合は、ジャンプ後も CPL を変更せずにそのままにすることができ、特権レベルを下げたい場合は RPL を使用できます。
assembly - ロングモードで amd64 のゼロスタックセグメント
このコード スタブは、Linux カーネル 3.18.3 から抽出されたものarch/x86/boot/compressed/head_64.S
です。ただし、余分なコメントが追加されました。
このコードはすべて、コード セグメント セレクター: 0x10 およびデータ セグメント セレクター: 0x18 を使用してロング モード (64 ビット) で実行されます。
私が知っていることによると、スタック命令 pushq が実行されると、gdt の null 記述子を指す %ss = 0x0 のため、このコードは実行に失敗するはずです。
それにもかかわらず、これは機能しているように見えるので、情報が不足していると思います。なぜこれが機能するのですか?