問題タブ [gdt]
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.
intel - GDTがセグメントと見なされないのはなぜですか?
プログラムまたはプロシージャの実行環境を構成するコード、データ、およびスタックセグメントに加えて、アーキテクチャは、タスク状態セグメント(TSS)とLDTの2つのシステムセグメントを定義します。
GDTは、セグメントセレクタおよびセグメント記述子によってアクセスされないため、セグメントとは見なされません。TSSとLDTには、セグメント記述子が定義されています。
--Intel 64およびIA32アーキテクチャソフトウェアマニュアル3A、2.1.2
GDTがセグメントと見なされない理由については少し混乱しています。
誰かが詳細な説明をすることができますか?
memory - これはどういう意味ですか? (サイズとオフセット)
ロード/ストア
IDT は、LIDT アセンブリ命令を使用してロードされます。IDT 記述構造の場所が必要です。
オフセットは、テーブル自体の仮想アドレスです。サイズは、テーブルのサイズから 1 を引いたものです。この構造体は、SIDT 命令で再度メモリに格納できます。
assembly - GDT のアドレスを取得することは可能ですか?
GDT をセットアップするブートローダーがあります。この GDT のアドレスを見つけて使用できるようにすることはできますか?
c - データセグメントが設定された後にGDTにアクセスしますか?
これは本当にばかげた質問ですが、私はそれを解決できないようです。私のOSでは、GDTは、カーネルとリンクアップされたアセンブリコードを介してセットアップされます。その場合、もちろん、GDTがロードされるときにデータセグメントとコードセグメントが設定されます。この情報は、アセンブリコードに次のように格納されます。
すべてのセグメントが完全に設定されていますが、GDT_Contentsを指すポインターを介してGDTにアクセスできません。私はこれをいくつかの方法でテストしました。主に、0(GDT_Contentsの場所)へのポインターを作成し、それらのバイトをエコーアウトするだけです。それらはGDT_Contentsと一致しません。これは、GDTが読み込まれるときに、前のデータセグメント(0x0またはブートローダーによって設定されたもののいずれか)に関連しているためです。しかし、とにかく今はGDTにアクセスする方法がわかりません。TSSを設定したいのですが、TSS構造体へのポインターが必要なため、GDT_Contentsにハードコーディングすることはできません。以前のデータセグメントを復元するのと同じくらい簡単だと思いますが、どうすればそれができるのかわかりません。これは、GDTを設定するアセンブリコードです。
そしてもちろん、これは32ビット保護モードのx86です。
gdt - グローバル記述子テーブルで 2 つの別個のセグメントを作成する方法
グローバル記述子テーブル (GDT) の基本を確認し、 asm を使用して "GDT.inc" を正常に作成したので、ブートローダーに簡単に含めることができます。赤ちゃんのステップとして、メモリ内の最初のバイトからバイト 0xFFFFFFFF (メモリ内の任意の部分) まで読み書きするようにコード記述子とデータ記述子を構成しました。
ここでの目的は、GDT を使用して 2 つの別個のリージョンを作成することです。たとえば、最初の 512B を 1 つのリージョンとして、次の 512B を別のリージョンとして、スペースを未使用のままにします。
そのために何ができますか?
x86 - GDTセグメント化メモリ
私は自分のカーネルを構築しようとしていますが、現在GDTをセットアップしています。ローダー用のアセンブリファイルを使用し、Cで記述されたカーネルを呼び出して、GDTを機能させようとしています。カーネルはGRUBから起動し、GRUBによるGDTセットアップをフラッシュします。GDTエントリを(適切な制限とオフセットを使用して)セグメントとして設定している場合、QEMUとペンドライブから起動するときの両方で、カーネルの再起動時にある種のトリプルフォールトがあると想定しています。
私の質問は次のとおりです。
x86アーキテクチャのセグメント化されたモデルを実装できますか?保護モードで実行する必要がありますか?ジョブが完了したら、保護モードを解除するにはどうすればよいですか?
ここにコードを投稿しますが、そのほとんどはチュートリアルからのものであり、アセンブリとCコードを混同すると、乱雑になります。主なことは、Cカーネルのコードセグメントとデータセグメントの両方のエントリのベース以外を「0」として実行すると、カーネルが再起動するだけであるということです。さらに、4KBページングを無効にするように粒度を設定した場合にも同じことが起こります。必要に応じて、詳細をお尋ねください。ありがとう :) :)
編集:これは、asmブートローダーとCカーネルファイルをリンクするために使用するlinker.ldファイルです。asmファイルとCファイルの両方から、メモリセグメンテーションに関連するセグメントを投稿しました。
リンカ:
GDTとインスタンス化関数を設定するC関数:
最後に、ASMで記述されたGDTフラッシュ関数は次のとおりです。
C関数とASM関数はフラットメモリモデルで動作するため、正しいことを知っています。これに特定の変更を加える必要がありますか。セグメンテーションまたはセグメント化されたページングを設定するためのリンカーファイルについてアドバイスをお願いします。
protected-mode - GDT における DC ビットの役割は何ですか?
これは私のコードです:
gdt の dc ビット (アクセス バイトの 3 番目のビット) がゼロの場合、正しく動作します。1のときに機能しない理由を知りたいですか?
dc ビットはデータ セレクターの方向ビットであり、それが 0 の場合はセグメントが成長し、1 の場合はセグメントが成長することを知っています。しかし、成長と成長が正確に何を意味するのかわかりません。スタックを使用したいときは、成長して成長することを意味します.( ESP++ および ESP-- )
assembly - GDT の内容を確認する方法
逆アセンブルされた dll を分析していて、行でスタックしてしまいました
この命令でebxに書き込まれるデータの正確な物理アドレスを知りたいです。gdbは私にそれを教えてくれますfs = 0x53.
アドレスがモード (保護またはリアル) に依存することは既にわかっており、CPU が保護モードになっていることは確かです ( *を参照)。セグメント fs の開始は、GDT のどこかに格納する必要がありますよね? のアドレスもわかりましたGDT-register (0x009bd5c0007f)
が、gdb ではレジスタにアクセスしたり読み取ったりすることができないため、fs (したがって、のfs:[00000004h]
) の物理アドレスを調べる方法がわかりません。
誰でも私を助けてもらえますか?
私は命令を使用し、smsw ax
その後eax
は0x280031でした。したがって、最後のビットは 1 であり、これは保護モードを意味します。私はそれを正しく理解しましたか?
gdt - xv6-rev7 (JOS) GDT
JOS (xv6-rev7) の GDT (Global Descriptor Table) を理解するのは非常に難しい
例えば
なぜ右に 12 シフトするのですか? なぜ AND 0xffff?
これらの数字は何を意味するのでしょうか?
式の意味は?
リソース、チュートリアル、ヒントを教えてもらえますか?
ここでは、私の問題について次のようにスニペット コードの 2 つの部分を示します。
第一部
第二部
完全な部分: http://pdos.csail.mit.edu/6.828/2012/xv6/xv6-rev7.pdf
assembly - JOSのあるA20線
次のスニペット コードは、JOS の A20 を有効にします。私を混乱させる問題があります。「$0xdf」はコマンドであり、データではありません。コマンド ポートであるポート 0x64 に送信する必要があります。実際には、データ ポートである 0x60 にポートします。ここでは、2 つの方法 (方法 3.1 と方法 3.2) が存在します: http://www.brokenthorn.com/Resources/OSDev9.html
だから、私の質問は: なぜ最後に 0x60 (outb %al, %0x60) に移植するのですか?