問題タブ [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.
linux-kernel - 異なるプロセスの同じ仮想アドレスを異なる物理アドレスにマップする方法
私はオペレーティング システムの設計と概念に関するコースを受講しており、現在は Linux カーネルを徹底的に研究しようとしています。どうしても捨てられない質問があります。最新のオペレーティング システムでは、各プロセスに独自の仮想アドレス空間 (VAS) があります (たとえば、32 ビット システムでは 0 から 2^32-1 まで)。これには多くの利点があります。しかし、実装では、いくつかの点で混乱しています。例を挙げて説明しましょう。
2 つのプロセス p1、p2 があるとします。p1 と p2 には独自の VAS があります。アドレス0x023f4a54
が異なる物理アドレス (PA) にマップされていますが、どうすればよいでしょうか? この翻訳はどのように行われますか。つまり、変換メカニズムは知っていますが、異なるプロセスのアドレス空間になると、同じアドレスが異なる物理アドレスにマップされることを理解できません。
windows - パフォーマンスの観点から、仮想アドレス空間マッピングをどのように受け入れることができますか?
この質問は、VASモデルを使用するすべてのOSを対象としていますが、Windows ntを指定します。これは、私が最もよく知っているシステムだからです。
ご存知のとおり、デフォルトでは、32ビットウィンドウのプロセスはそれ自体で2GBのメモリを取得します。このメモリは、システムメモリ、スワップファイル、USBドライブなどに配置できます。
これは、複数のプロセスがアドレス0x12345678にメモリを割り当てることができることを意味しますが、もちろん、これを同じ物理メモリにマップすることはできません。
私の質問は、パフォーマンスを完全に壊すことなく、これをどのように行うのかということです。プロセッサには、メモリアドレスをマップするための何らかのメカニズムがありますか?
メモリにアクセスしないたびにマップルックアップを実行するようにOSに要求するのは、とても遅いようです。
windows - Windows x64 の 44 ビット仮想メモリ アドレス制限の背後にある
http://www.alex-ionescu.com/?p=50 .
上記の投稿を読みました。著者は、Windows x64 が単一リンク リストの例で 44 ビットの仮想メモリ アドレスのみをサポートする理由を説明しています。
最初の犠牲は、シーケンス番号のスペースを 16 ビットではなく 9 ビットに減らし、リストが達成できる最大シーケンス番号を減らすことでした。これでもポインター用に 39 ビットしか残っていません。これは 32 ビットよりも平凡な改善です。割り当て時に構造体を強制的に 16 バイト アラインすることで、最下位ビットを常に 0 と見なすことができるようになったため、さらに 4 ビットを獲得できました。
ああ、私は理解できません。
「割り当て時に構造体を強制的に 16 バイト アラインすることで、最下位ビットを常に 0 と見なすことができるようになったため、さらに 4 ビットを獲得できました。」意味?
linux - Linux sk_buffでは、skb-> dataは物理アドレスですか、それとも仮想アドレスですか?
組み込みシステム用のイーサネットドライバのメモリ破損の問題を調査しています。
バスマスタリングDMAコントローラと低速SDRAMの間に問題があるのではないかと思います。そのため、高速SRAMでバウンスバッファを使用したいと思います。これを行うには、2つのことが必要です。SRAMの物理アドレス(バスマスターの観点から)をDMAコントローラーバッファー記述子に配置する必要があります。DMAコントローラーが報告したら、バウンスバッファーからSDRAMのsk_buffにデータをmemcpyする必要があります。着信パケット。
読んでから私が判断できなかったこと
skb->dataが物理アドレスか仮想アドレスかです。つまり、私は呼び出す必要があります
また
パケットをsk_buffに入れて、残りのLinuxネットワークスタックがそれを処理できるようにしますか?
編集:これは問題のドライバーです。仮想アドレスをDMAコントローラーレジスタに渡しているため、機能しないと思いますが、このコードが機能する開発キットがあります。ただし、私のSDRAMはdevkit DDR SDRAMほど良いタイミングではないので、バウンスバッファを実装することを考えています。
memory - ファイル システム - メモリ マップト ファイル
私のオペレーティングシステムクラスの最後の質問の例:
ほとんどのオペレーティング システムは、「メモリ マップ ファイル」をサポートしています。これは、実行中のプロセスのアドレス空間にマップされるファイルを表します。ファイルへの読み取りと書き込みは、メモリの読み取りと書き込みに変換されます。map() と unmap() という 2 つの新しいシステム コールの存在を想像できます。
a) map(); を検討してください。ファイル名と仮想アドレスを受け入れ、オペレーティング システムが仮想アドレスから始まるアドレス空間にファイルをマップするようにします。この呼び出しをサポートするために仮想メモリ システムを使用する方法を説明してください。
b) unmap(); を検討してください。仮想アドレス空間からファイルの関連付けを解除します。このシステム コールを実装するために取得する必要がある統計を記述します。すべての仮定をリストします。
c) 多くの UNIX システムでは、inode はディスクの先頭に保持されます。別の設計では、ファイルの作成時に i ノードを割り当て、その i ノードをファイルの最初のブロックの先頭に配置します。この代替案の長所と短所について話し合います。
d) 空きディスク ブロックに関する情報を含むビットマップまたは空きリストがクラッシュにより完全に失われた場合はどうなりますか? この災害から回復する方法はありますか、それともディスクが使用できなくなりましたか。UNIX および FAT スタイルのディスク ブロック割り当てについて、あなたの答えを議論してください。
これらの質問に関する議論の情報は大歓迎です。
operating-system - Multi-level page tables - hierarchical paging
Example question from a past operating system final, how do I calculate this kind of question?
A computer has a 64-bit virtual address space and 2048-byte pages. A page table entry takes 4 bytes. A multi-level page table is used because each table must be contained within a page. How many levels are required?
How would I calculate this?
linux-kernel - Linuxプロセスのアドレス空間の最後のGBは、同じ物理メモリにマップされますか?
最初の3GBはプロセス用に予約されており、最後のGBはカーネル用に予約されていることを読みました。また、カーネルは物理アドレス空間の2番目のMBからロードされることも読みました(構成によって異なります)。私の質問は、最後の1 GBのマッピングはすべてのプロセスで同じであり、この物理的なメモリ領域にマッピングされるということですか?
もう1つの質問は、プロセスがカーネルモードに切り替わるとき(たとえば、sys呼び出しが発生するとき)、どのページテーブルが使用されるか、プロセスページテーブルまたはカーネルページテーブルですか?カーネルページテーブルが使用されている場合、プロセスに属するメモリ位置にアクセスできません。その場合、カーネルコードとデータへのすべてのアクセスは、プロセスアドレス空間の最後の1 GBのマッピングを介して行われるため、カーネル仮想メモリは明らかに使用されません。これを明確にするのを手伝ってください(有用なリンクがあれば大歓迎です)
process - ユーザー空間からカーネル空間への切り替え中に4GB(VM)アドレス空間がどのように使用されるか
プロセスアドレス空間がプロセス/カーネルに分割される方法に関するオンラインスレッド/チュートリアルがあれば、私はたくさん見ました
例:私はprintfとして呼び出しているHelloworldプログラムをいくつか持っています(次に、カーネル空間に入るために書き込みシステム呼び出しを行います)
カーネルが Helloworld プログラム スタックをどのように使用しているかは疑問です。実行全体がどのように行われるか教えていただけますか...
./helloworld -> printf() -> システムコールの書き込み -> ディスプレイドライバー -> 書き込みから戻る -> helloworld に戻る
ありがとう、アマレンダー
operating-system - 可変パーティション方式の仮想アドレス空間
この質問は、プログラミングよりもOSに関するものであることを知っています。申し訳ありません。
プロセスの仮想アドレス空間のサイズを決定する必要がある可変パーティションを使用したマルチプログラミング方式では??
実行中にプロセスがより多くのメモリを必要としていることが判明した場合はどうなりますか??
可変パーティション スキームとは、セグメンテーションやページングを含まず、カウント割り当てを使用するスキームを意味します。