非特権モードであるにもかかわらず、mmap ' ing / dev / memはどのように機能しますか?
On 2月 9, 2021 by admin私の理解では、ユーザースペースプログラムは非特権モードで実行されるため、メモリやI / Oに直接アクセスすることはできません。
では、ユーザースペースプログラムで/ dev / memをmmapするときに、メモリまたはI / Oの場所に直接アクセスするにはどうすればよいですか?
例:
int fd = 0; u8 leds = 0; fd = open("/dev/mem", O_RDWR|O_SYNC); leds = (u8 *)mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x80840000);
これは組み込みデバイスで非常に一般的に使用されるハックです。
変数leds
をオンザフライで使用してアクセスできるようになりました0x80840000に存在する可能性のあるすべてのデバイス。
そのアドレスにアクセスするためにシステムコールを使用することはもうありません。
leds[0x20] = val;
動作します。
ただし、I / Oアドレスとの間で直接読み取り/書き込みを行うなどの特権操作は、システムコールを介してプロセッサを特権モードにすることによってのみ可能になります。
ソース。
コメント
ですが、'は単なるコードであり、これが実際に非特権ユーザーとして機能しているという証拠はありません。私の(限られた)経験では、すべてがrootとして実行されます。組み込みデバイス。
root
ユーザーには、従来のオーバーライドを許可するなど、多くの特権があります。ファイルシステムのアクセス許可。一部の"ファイル"は、実際にはデバイス(ディスクやメモリなど)にアクセスでき、通常のユーザーは立ち入り禁止です。 root
ではありません。ただし、root
はユーザースペースで実行されるため、'はシステムモードの完全な権限を享受できません。 (主に特権命令を実行します)。回答
/dev/mem
は確かにセキュリティの問題であり、許可されるべきではありません。
私のシステムでは、ls -l /dev/mem
は次のようになります。
crw-r----- 1 root kmem 1, 1 Sep 8 10:12 /dev/mem
root
は、kmem
グループ(たまたま存在しない)はそれを読み取ることはできますが、書き込むことはできず、他の誰もがそれを開くことはできません。したがって、これは安全である必要があります。
/dev/mem
が私のようなものである場合、特権のないプロセスは、ファイルを開くことさえできなかったはずです。 mmap
それ。
システムの/dev/mem
の権限をチェックして、安全であることを確認してください!
コメント
- しかし、私がこれをルートとして実行していると仮定すると…ルートによって実行されるプロセスがカーネルを取得することを意味しますか?レベルのアクセス権限?
- そうですね、'これをrootとして実行すると、すべてにアクセスできます。 ' "カーネルレベルのアクセス権限"の意味がわかりませんが、 rootは確かに、何らかの方法で(特に、新しいカーネルモジュールを作成して動的にロードすることにより)やりたいことを何でも実行できます。
- はい、その'正解:ファイルをマップすると、後でststem呼び出しを使用せずに&を読み取ってファイルを書き込むことができます。 'は、'通常のディスクファイルまたは
/dev/mem
。必要に応じて、/dev/mem
を開き、read()
およびwrite()
システムコールを発行できます。その場合、システムコールを使用せずにI / Oを送信することはありません。最終結果は同じですが、実行する小さなI / Oがたくさんある場合は、mmap()
と直接アクセスの方が、特にシステムコールは必要ありません!これは通常のファイルにも当てはまります! - @ Stark07あなたは'要点を見逃したと思います。
mmap
(および/dev/mem
)自体は、直接アクセスを提供しません。システムメモリであり、リング4ではこれを行うことはできません。代わりに、プログラムがロードされたときに発生するのと同じように、呼び出しプロセスでファイル(またはリソース)を特定の仮想アドレスにマッピングするだけです/exec
ed(この場合、プログラムイメージは仮想メモリにmmap
されます)。 - TL; DR非特権プロセスはシステムリソースに直接アクセスできませんが、それらのリソースが仮想アドレス空間にマップされている場合はアクセスできます 。 'スタック/ヒープ/データ/その他へのアクセスとカーネルメモリへのアクセスに違いはありません-どちらも最終的には実際の物理メモリにアクセスしますが、後者の場合はたまたまプログラム'の制御。
回答
表示されているアドレスユーザープロセス(rootとして実行されているか非特権ユーザーとして実行されているかに関係なく)には仮想アドレスがあり、ページテーブルを介してMMUによって物理アドレスにマップされます。ページテーブルの設定は特権操作であり、カーネルコードによってのみ実行できます。ただし、ページテーブルが設定されると、メモリへのアクセスはユーザーモードで許可されます。
具体的には、コードはmmap
を使用して、カーネルが特定の範囲の物理メモリへのアクセスを許可するページテーブル。カーネルはプロセスの権限をチェックし(/dev/mem
への読み取り/書き込みアクセス権を持っています)、物理メモリにアクセスできるようにページテーブルを設定します。
回答
leds
の値は仮想アドレスです。ユーザースペースにある限り現在のプロセスのうち、プロセスは、RAM内のどこにこの仮想アドレスがマップされていても、特権モードでなくても、leds[0] = val
などの命令を介して直接アクセスできます。
*
がありません。 “1a3ad27bd2″>