問題タブ [virtual-address-space]
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.
cpu - POWER8 アーキテクチャーの「フラット」仮想アドレス空間
ここで述べたように、「フラット」な 32 ビット空間の意味を説明できる人はいますか?
怠け者のためのテキスト:
このアーキテクチャのもう 1 つの興味深い機能は、すべてのアドレスを 52 ビット空間にマップする仮想アドレス システムです。このようにして、アプリケーションは「フラットな」32 ビット空間でメモリを共有でき、すべてのプログラムがそれぞれ 32 ビットの異なるブロックを持つことができます。
linux - プロセス領域テーブル & グローバル記述子可能 & 仮想アドレス
ここにあるトレーニング機関の 1 つからの Linux ノートを調べています。そのため、プロセスが作成されるたびに、リージョンがそれに割り当てられます。リージョンには、プロセスのすべてのセグメントが含まれます。
また、リージョンは region-table によって指定されます。リージョン テーブルには、次のエントリが含まれます。 --
仮想アドレスから - 物理アドレス ポインタ + ディスク ブロック ディスクリプタ
ディスク ブロック記述子は、ディスク上のスワップ ファイルまたは exe ファイルを指します。
私が持っている2つのダウト:-----
1> グローバルおよびローカル記述子の役割はどこにありますか。
2> 各プロセスには独自のグローバル記述子テーブルがありますか? そうでなければ、2 つのプロセスの仮想アドレスが同じ物理アドレスを指します。
提案してください
memory - プログラムが同じ仮想アドレス空間を持つ場合はどうなりますか
プログラム foo.c を 2 つの異なる端末で実行し、実行中のローカル変数のアドレスを出力した場合。それらは同じでしょう。ただし、たとえばシェル内でフォークして実行するというコンテキストでは、 foo.c などのプログラムを実行します。シェルのまったく同じコピーを作成し、 foo.c を実行します。それらは同じ仮想アドレス空間を持っていますか。また、プログラムが再帰的に自分自身を呼び出した場合、再帰的に呼び出された同じ変数は同じアドレス空間を持ち、このプログラムは独自のアドレス空間内でどのように成長するのでしょうか?
memory - プロセスの vm 領域へのアクセス
プロセスから vm 領域のアドレスを読み取る必要がある LKM を作成しようとしています。task_struct へのポインターを取得するために pid_task() を使用していますが、それを使用して vmarea の開始アドレスを取得しようとすると、コンパイル エラーが発生します。
そして、「エラー:不完全な型へのポインターを逆参照しています」というエラーが表示されます
私は Linux の初心者であり、LKM の完全な初心者です。
助けていただければ幸いです。
皆さん、ありがとうございました
operating-system - 仮想アドレス空間はどのようにページングできますか?
このウィキペディアの記事http://en.wikipedia.org/wiki/Memory_management_unit#How_it_worksを読んでいるときに、仮想アドレス空間 (プロセッサが使用するアドレスの範囲) をページに分割することに出くわしました。しかし、物理メモリ (RAM) だけがページに分割されていることを知りました。では、プロセスの仮想アドレス空間の分割はどのように行われるのでしょうか?
また、ここでの仮想アドレス空間の定義は、プロセッサが使用するアドレスの範囲として行われます。プロセッサが使用するアドレスの範囲は、プロセッサ内のアドレスバスの長さを意味しますよね? では、アドレス バスが 32 ビットのプロセッサと 4 GB (2^32) の RAM を使用している場合、物理アドレス空間と仮想アドレス空間は同じですか?
質問が素朴すぎる場合はご容赦ください。アドレス空間の明確な視覚化はまだ得られていません。前もって感謝します。
c - c で %p 形式の printf() によって出力されるアドレスはどれですか?
私は次のような簡単なコードを持っています:
上記のプログラムの出力は次のとおりです。
2 回目の実行:
仮想アドレスと物理アドレスについて勉強しています。次の質問があります。
- 変数「a」の出力アドレス(物理/仮想)はどれ?
- 仮想の場合、同じプログラムの実行ごとにどのように変化しますか? 私が理解しているように、コンパイラはコンパイル時に変数に仮想アドレスを提供しますか?
- プログラムの実行ごとにグローバル変数のアドレスが一定なのはなぜですか?
Linux でこのプログラムを実行した場合: 2.6.18-308.el5 x86_64 GNU/Linux
使用してコンパイル: gcc バージョン 4.1.2 20080704 (Red Hat 4.1.2-52)
c - 上位半分のカーネルにジャンプするにはどうすればよいですか
現在、上位半分のカーネルを構築しています。ブートローダーはカーネルを物理アドレス 0x100000(1M) にロードし、ID マッピングは 0 ~ 4MB に設定されています。ここで質問があります: どうすればより高い仮想アドレス (たとえば 3GB) にジャンプできますか?
私はこの質問をグーグルで検索し、2 つの方法を見つけました。1 つはアドレス スペース ワープ アラウンドを使用する方法で、もう 1 つはページ エントリを設定して 3GB ~ 3GB + 4MB を 0 ~ 4MB にマップしてから、より高いアドレスに「ジャンプ」する方法です。使用することにしました。 2番目の方法ですが、それを実装するのに十分な情報が見つかりません. カーネルを逆アセンブルしたところ、すべてのアドレスが絶対アドレスであることがわかったので、単一の「jmp」命令では不十分だと思います。私が考えることができる唯一の方法は、3GBを超える仮想アドレスに関数があり、この関数を下位スペースで呼び出し、上位スペースで実行し、この関数が返されないことです。これが正しい場合、どうすればこれを行うことができますか?
c - 上位 BIOS メモリを仮想アドレス空間にマップしようとすると、mmap が失敗する理由
次のアドレスを仮想アドレス空間に(m)マップしようとしています:
---物理アドレスは 0xf6c50 です --- このアドレスは、EBDA ベース ポインターと上位 Bios メモリ ウィンドウ (ACPI_HI_RSDP_WINDOW_BASE) の合計です。
目的は、ACPI テーブルをプロセスのアドレス空間にマップし、後で使用することです。
ファイル記述子を開いて「/dev/mem」を読み取ります。プリアドを使用してアドレスに到達し、ACPI ヘッダー構造を読み取ります。署名が一致したら、それを仮想アドレス空間にマップしたいのですが、そうするとエラーが発生しますのような:「メモリを割り当てることができません」
FreeBSD 8.x を使用しています。一般的に mmap が機能することを確認できます。エラーにつながる呼び出しは次のとおりです。
MAP_SHARED も使ってみましたが、どうもあまり変わりません。
ここで pa は、「ACPI_HI_RSDP_WINDOW_BASE」マクロによって定義された上記のアドレスです。誰でもこれに光を当てることができますか、またはこれを回避する方法はありますか?
linux - 命令ポインターに基づいてコンテキストを決定する
命令トレースが QEMU エミュレーターから来るシミュレーターを開発しています。トレース内の命令ポインターは、仮想命令ポインターです。
32 ビット Linux オペレーティング システムに関する私の基本的な理解は、4GB のアドレス空間のうち、下位 3GB、つまり 0 ~ 3GB がアプリケーション用に予約され、上位 1GB、つまり 3GB ~ 4GB がカーネル用に予約されているということです。
私の基本的な理解は正しいですか??
カーネルまたはアプリケーションなどの命令のコンテキストを決定するために、単純なチェック ip>3G を使用しています。これは有効ですか??
もう1つ、この単純な方法は64ビットオペレーティングシステムに簡単に拡張できますか??
c++ - Windows の仮想アドレス空間
申し訳ありませんが、私は Windows ドライバー開発の初心者です。WDK からこのドキュメントを読んだ後、理解できないことがありました。
文書によると
プロセスが使用できる仮想アドレスの範囲は、プロセスの仮想アドレス空間と呼ばれます。各ユーザー モード プロセスには、独自のプライベート仮想アドレス空間があります。32 ビット プロセスの場合、仮想アドレス空間は通常、0x00000000 から 0x7FFFFFFF までの 2 ギガバイトの範囲です。64 ビット プロセスの場合、仮想アドレス空間は 0x000'00000000 から 0x7FF'FFFFFFFF までの 8 テラバイトの範囲です。仮想アドレスの範囲は、仮想メモリの範囲と呼ばれることがあります。
それについての私の質問は次のとおりです。
8ギガバイトのメモリバンクを持つコンピュータがあるとします。
- この 8 ギガバイトのメモリからすべての仮想アドレス空間が実際に割り当てられているのでしょうか?
- 1 つのプロセスに 2g の仮想アドレス空間を割り当てる必要がある場合、システムで 4 つのプロセスが実行されていると言えますか。彼らは完全に8ギガバイトのメモリを必要としていますか? 答えが「はい」の場合、そのコンピューターで実行できるプロセスの最大数が 4 であることを意味しますか?
何かを誤解しているかどうかはわかりません。私を修正してください。どうもありがとう。