3

mallocがポインタ(データブロックの仮想アドレス)を返す場合、

char *p = malloc (10);

pには仮想アドレスがあります(たとえばx)。そしてp、10個のアドレスのブロックの仮想アドレスを保持します。これらの仮想アドレスがyからy+10であるとします。

これらの10個のアドレスはページに属し、仮想->物理マッピングはページテーブルに配置されます。

プロセッサがポインタpを逆参照するとき、たとえばprintf("%c", *p);、プロセッサはどのようにしてアドレスにアクセスする必要があることを認識しますyか?

ポインタを逆参照するために、ページテーブルに2回アクセスしますか?つまり、?が指すアドレスを出力しpますか?それはどのくらい正確に行われていますか、誰かが説明できますか?

また、スタック変数にアクセスするために、プロセッサはページテーブルを介してスタック変数にアクセスする必要がありますか?スタックポインタレジスタ(SP)は、スタックをまだ指していませんか?

4

2 に答える 2

3

さまざまなレイヤーの混乱があると思います。

まず、ページテーブル:これは、メモリを使用してより多くのメモリへのポインタを提供するデータ構造です。特定の仮想アドレスが与えられると、それをテーブルへのインデックスに分解できます。現在、これはカーネルの内部で行われていますが、これと同じアイデアをユーザースペースに実装することも可能です。

次のステップはプロセスです。各プロセスは独自のメモリビューを取得するため、1セットのページテーブルがあります。プロセッサは、これらの異なるページテーブルがどこにあるかをどのように知るのですか?cr3と呼ばれる特別な制御レジスタ内。プロセスの変更は、コンテキストスイッチと呼ばれることもあります。cr3を設定すると、仮想メモリのプロセスビューが変更されるためです。

しかし、次の質問は、プロセッサが仮想メモリの概念をどのように理解するのかということです。いくつかの古いアーキテクチャ(MIPが頭に浮かぶ)では、システムは最近変換されたメモリのキャッシュを保持し、仮想メモリアクセスを処理する方法のガイダンスを提供します。x86では、キャッシュ(より一般的にはトランスレーションルックアサイドバッファと呼ばれます)は実際にはハードウェアに実装されています。プロセッサはこれらの変換を保存するため、ページテーブルのルックアップを自動的に処理できます。キャッシュミスがある場合は、OSによって設定されたページテーブル構造を実際にトラバースして、参照する必要があるものを検索します。

もちろん、これは、プロセッサに少なくとも2つの異なるモードが必要であることを意味します。1つはアドレスが直接であると想定し、もう1つはページテーブルをトラバースします。最初のモードであるリアルモードは、ブート時に存在し、ブートローダーが仮想モードをオンにして残りのコードの先頭にジャンプする前に、テーブルをセットアップするのに十分な長さしかありません。


私の長い説明に対する簡単な答えは、プロセッサがすでにアドレス変換を持っているため、おそらくページテーブルにはまったくアクセスされないということです。

于 2012-04-13T04:53:47.270 に答える
-1

そして、pは10個のアドレスのブロックの仮想アドレスを保持します。

あなたは混乱しています。 p10バイトブロックのアドレスを保持するポインタです。これらのバイトがどのように解釈されるかは、アプリケーション次第です。

于 2012-04-13T06:19:30.343 に答える