問題タブ [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.

0 投票する
2 に答える
9554 参照

assembly - オペコードのアセンブリ セグメント

私は、アセンブリ セグメントがオペコードで使用されていることに気付きました。

例:

「PTR SS:」は、EBP-30 がスタックから来ることを指定するために使用されていると思いますか? (SS: スタック セグメント) 私は正しいですか、それとも完全に間違っていますか? :) そして、上の例との違いを教えてください。

また、オペコードで使用される DS (データ セグメント) はどうですか?

0 投票する
3 に答える
1920 参照

linux - セグメンテーション レジスタの使用

メモリ管理がどのように低レベルになるかを理解しようとしており、いくつか質問があります。

1) Kip R. Irvine によるアセンブリ言語に関する本では、リアル モードでは、プログラムの開始時に、最初の 3 つのセグメント レジスタにコード、データ、およびスタック セグメントのベース アドレスがロードされると述べています。これは私には少しあいまいです。これらの値は手動で指定されていますか、それとも値をレジスタに書き込む命令をアセンブラが生成していますか? 自動的に行われる場合、これらのセグメントのサイズをどのように見つけますか?

2) 私は、Linux がフラット線形モデルを使用していることを知っています。つまり、非常に限られた方法でセグメンテーションを使用しています。また、Daniel P. Bovet と Marco Cesati による「Understanding the Linux Kernel」によると、GDT にはユーザー データ、ユーザー コード、カーネル データ、およびカーネル コードの 4 つの主要なセグメントがあります。4 つのセグメントはすべて、サイズとベース アドレスが同じです。タイプとアクセス権だけが異なる場合、なぜ 4 つが必要なのか理解できません (それらはすべて同じ線形アドレスを生成しますよね?)。それらの 1 つだけを使用して、その記述子をすべてのセグメント レジスタに書き込んでみませんか?

3) セグメンテーションを使用しないオペレーティング システムは、どのようにプログラムを論理セグメントに分割しますか? たとえば、セグメント記述子のないコードとスタックを区別する方法などです。ページングを使用してそのようなことを処理できると読みましたが、その方法がわかりません。

0 投票する
3 に答える
1007 参照

c++ - Visual Studio 2010 - データ セグメントとスタック メモリは同じです

定数リテラル get が (SO から) プログラムのデータ セグメントに配置され、読み取り専用であるため、" s[0] = 'a' " という行でエラーが発生することがわかりました。その行のコメントを外して実行しました。しかし、MS VS のメモリ ウィンドウを調べたところ、変数はすべてメモリ内にまとめて配置されています。彼ら(コンパイラ)が「s」への読み取り専用アクセスをどのように強制するかについて興味がありますか?

編集 1: s_arr (スタック領域に配置する必要があります) に格納されている値を更新して、文字列定数に隣接して配置されていることを明確にします。

編集 2: ページに基づく ro/rw アクセスに関する回答を見ているので、ここではアドレス .. 0x...4f4 は rw 0x...4fc はroで、0x...504 は rw です。彼らはどのようにしてこの粒度を達成するのでしょうか? また、各ページは最小 4kb である可能性があるため、0x4fb は前の ro ページの最後のアドレスである可能性があると主張できます。しかし、いくつかの変数を追加して、それらがすべてメモリ内に連続して配置され、粒度が 8 バイトごとであることを示しました。あなたが言ったように、ページは4kレベルなので、

0 投票する
1 に答える
4505 参照

assembly - Linux x86 64 の MSR_GS_BASE に関する詳細

Linux カーネルにおける MACRO current の詳細を調べてみました。現在の最終的なアセンブリ コードは次のとおりです。

上記のコードは機能します。しかし、%%gs を印刷すると、その値は 0 なので、%%gs は GDT NULL の最初の項目を指します!!?? 使い方?

代わりに、gs のベースは MSR_GS_BASE にあり、現在の値は次のように置き換えることができます。

私の質問は次のとおりです。

%gs は GDT NULL の最初の項目を指しています!!?? MSR_GS_BASE から読み込むとどのように動作するのか、CPU の機能ですか? これについては参考文献が必要です。

0 投票する
2 に答える
1394 参照

x86 - 小さなカーネル用の GDT の設計

現在、いくつかの小さなカーネル コードを書いています。以下は、どこかのカーネル プロジェクトからコピーしたものです。これには、カーネルをメモリ位置 0x1000 にロードし、位置 0x1000 にジャンプするためのコードが含まれています。

以下は GDT.INC にあります。

上記は長い間機能しました。しかし、カーネルが大きくなり始めると、データとコードのセグメントが重複しました。どちらも 0 から始まりますが、データ セグメント内のデータがコード セグメント内のコードと重なっている、またはそのようなものです。このため、メッセージを完全に印刷できませんでした。

データ セグメントとコード セグメントのベース アドレスを変更して、バイナリで最大 1 MB のサイズの小さなカーネルを書き込むために、ベース間にスペースができるようにする方法はありますか?

カーネルへのリンクを添付し、以下に問題を詳しく説明します。

  1. 以下を使用してカーネルを作成します。

    /li>

src フォルダ内

  1. 以下を使用して qemu で起動します。

    /li>
  2. 起動後、次のコマンドを実行して文字列操作を確認します。

    /li>
  3. 次に、次のコマンドを実行すると、メッセージが途中で取り除かれ、特定の行の後に出力されないことがわかります。

    /li>
  4. console.c の次の行にコメントを付けて pcnetops を実行すると、すべての内容が出力されます。

    /li>

これが、コード セグメントとデータ セグメントのベース アドレスを分離する必要があるのではないかと疑う理由です (現時点では両方とも 0 です)。

0 投票する
4 に答える
5412 参照

assembly - アセンブリ言語でCS:IPを変更する

アセンブリ言語で、CSそして両方を強制的に変更するにはどうすればよいですか?IP

ORGディレクティブを使用して、の数を変更できますIPが、どのように変更しCSますか?

基本的に、アセンブリを使用してマルチスレッドを実装したいと思います。

スタックオーバーフローの質問を含む多くのフォーラムは不可能だと言っていますが、アセンブリコードから作成されている場合でも、Cにはどのようにマルチスレッドオプションがありますか?

0 投票する
1 に答える
1388 参照

process - 仮想メモリの概念

仮想メモリに関するいくつかのトピックについて混乱しています。だから、私はそれらを点別にリストし、質問するつもりです. 答えながら、その疑問を解消できるソースもリストしていただければ幸いです。Linux elf 実行可能ファイルを参照して話します。

  1. 32 ビット システムでは、すべてのプロセスに 4GB のアドレス空間があると聞いたことがあります。実行可能な再配置可能ファイルの 1 つの objdump を確認したところ、00000000 から ffffffff までの制限があることがわかりました。また、カーネルスペースも含まれていました。これは、ファイルのアドレス空間です。これは私たちが話している仮想メモリですか?はいの場合、仮想メモリメカニズムにより非常に大きなサイズのプロセスを実行でき、そのプロセスサイズはメインメモリサイズによって制限されないことを読んだことがあります(必要なページをオンデマンドでメインメモリに移動できます-デマンドページング)。では、仮想メモリが 4GB しかない場合、プログラムの最大サイズは 4GB に制限されませんか? また、別のファイルの objdump を確認したところ、同じアドレス (つまり、00000000 から ffffffff) がありました。それで、これはどういう意味ですか?これは、私たちのファイルが、開始アドレスが再び追加されるある種の再配置可能ファイルであることを意味しますか(ただし、これは実行可能な再配置可能オブジェクト ファイルであるため、これはばかげているように思えます)。

  2. セグメンテーションが実装されているメモリで、CPUが仮想(論理)アドレスを生成することを読んだことがあります。このアドレスには、セグメント、セグメント内のオフセットの 3 つの部分があります。また、ここで話されているセグメントは、コード、データ、スタックなどです。

    プロセスのアドレス空間では、これらのセグメントは特定の位置から開始して配置されます。では、CPUの仮想アドレスの内容は?生成される仮想アドレスの範囲は 00000000 から ffffffff ですか? はいの場合、仮想アドレスでコンテンツにアクセスするプロセスは次のとおりです。

    これは、プロセスが常にメインメモリに完全に存在することはできないという事実から生じます。これは、メモリ全体が 1 つのプロセスだけで占有されるためです(プロセスのアドレス空間自体が 4gb であるため)。

    また、すべてのプロセスが 00000000 から ffffffff までのアドレス空間を持ち、一度に複数のプロセスがメイン メモリに存在できる場合、すべてのプロセスは、線形アドレス空間でセグメントのアドレスを返す独自のセグメント記述子テーブルを持つ必要があります。

  3. 起動時にオペレーティング システムがメイン メモリにロードされると読みました。では、そのOS と、特定のプロセスのカーネル空間にあるカーネル コードとの違いは何でしょうか? また、すべてのプロセスは、カーネル空間に独自のカーネル コードのコピーを持っていますか?
0 投票する
2 に答える
660 参照

x86 - x86データセグメントは実際のオペレーティングシステムとプロセスでどのように使用されていますか?

私はx86asmプログラム(ブートローダー)をリアルモードでプログラミングしてきましたが、セグメントやレジスターなどの使い方を知っています。

OllyDbgなどのデバッガーから、DSレジスター、SSなどが明らかに使用されていることがわかります。しかし、通常の「Windowsのような」プロセスはそれらをどのように使用しますか?セグメンテーションが部分的に使用され(ring0をring3から分離するためだけに)、それらのエントリがGDTにあること、ページングが含まれていること、およびアドレスがPDEとPTEで完全に混乱することを知っていますが、完全に「リンク」することはできません。 「すべてをまとめて、追加のセグメントがどのようなデータスタックであるかを理解します。各プロセスには異なるDS / SS / ESがありますか?

0 投票する
1 に答える
247 参照

c - データセグメントが設定された後にGDTにアクセスしますか?

これは本当にばかげた質問ですが、私はそれを解決できないようです。私のOSでは、GDTは、カーネルとリンクアップされたアセンブリコードを介してセットアップされます。その場合、もちろん、GDTがロードされるときにデータセグメントとコードセグメントが設定されます。この情報は、アセンブリコードに次のように格納されます。

すべてのセグメントが完全に設定されていますが、GDT_Contentsを指すポインターを介してGDTにアクセスできません。私はこれをいくつかの方法でテストしました。主に、0(GDT_Contentsの場所)へのポインターを作成し、それらのバイトをエコーアウトするだけです。それらはGDT_Contentsと一致しません。これは、GDTが読み込まれるときに、前のデータセグメント(0x0またはブートローダーによって設定されたもののいずれか)に関連しているためです。しかし、とにかく今はGDTにアクセスする方法がわかりません。TSSを設定したいのですが、TSS構造体へのポインターが必要なため、GDT_Contentsにハードコーディングすることはできません。以前のデータセグメントを復元するのと同じくらい簡単だと思いますが、どうすればそれができるのかわかりません。これは、GDTを設定するアセンブリコードです。

そしてもちろん、これは32ビット保護モードのx86です。

0 投票する
2 に答える
522 参照

assembly - LDT の設定方法

私は 32 ビット オペレーティング システムを開発しており、プログラムがカーネルからセグメントを分離できるようにしたいと考えています。

そのためには SS を作成する必要があり、DS レジスタは実際にはプログラム スタックと .data セクションを指します。

私の調査によると、これはローカル記述子テーブルを設定することによって行われると考えています。

これは GDT と非常によく似ており、LDT は lldt を介してロードされると想定しています。

ただし、セグメントがセットアップされると、これをどのように使用するかわかりません。誰でも説明できますか?