2

私は、プロセスが仮想アドレス空間を持っていることを発見したOS理論を読んでいました(簡単にするために、テクニックベースとリミットレジスタを大まかに使用しています)が、他のアドレスにはアクセスできません。しかし、組み込みシステムでは、placement new または reinterpret_cast (C++) を使用してメモリ マップド IO アドレスにアクセスできますが、プロセスの仮想アドレス空間以外の他のアドレスにアクセスできない場合はどうすればよいでしょうか?

class ControlReg { 
public:
bool ready() const { return readyBit; }
private:
volatile unsigned readyBit :1;
};

ControlReg *pcr = reinterpret_cast<ControlReg*>(0xFFFF0000); // address 0xFFFF0000 is still virtual or absolute physical mapped address?

プロセスが任意のアドレスにアクセスできるようにする命令はありますか? . 私は混乱していると思います。誰かが物事をはっきりと見るのを手伝ってくれませんか?

ありがとう

4

3 に答える 3

4

これは純粋に OS の問題であり、すべての言語 (アセンブラーを含む) に当てはまります。最新の汎用 OS は、ユーザー プロセスのメモリをマップし、マップされたメモリ外へのアクセスを許可しません。ユーザー プロセスは、通常、メモリ マップド IO や、OS が使用するメモリにアクセスすることはできません。ただし、このマッピングはシステムによって行われます。システムには、それを回避できる特別な要求がある場合があります。カーネルレベルのコードは間違いなくそれを回避できます。また、多くの組み込みシステム、特に小規模なものでは、メモリ マッピングがまったくありません。

于 2012-06-19T07:18:23.130 に答える
0

これを実際の仮想メモリ システムで機能させるには、デバイスをプロセスの仮想アドレス空間にマップする必要があります。Unix ライクな OS では、mmap()たとえば、デバイス ファイルの呼び出しでこれを行うことができます。これにより、仮想アドレスを対応する物理アドレスに関連付けるページ テーブル エントリを作成する機会がデバイス ドライバに提供されます。

(ただし、ここでは憶測です。この種の組み込み開発の経験はありません。)

于 2012-06-19T07:18:06.780 に答える
0

少なくとも高水準言語の観点からは、プロセスから見えるすべてのアドレスは仮想アドレスです。Linux を実行している場合はcat /proc/{pid}/maps、コードが仮想アドレスから物理アドレスにどのようにマップされるかを確認できます。

于 2012-06-19T07:22:28.890 に答える