![ユーザー空間からハードウェアに直接アクセスできますか?](https://rvso.com/image/23938/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%A9%BA%E9%96%93%E3%81%8B%E3%82%89%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AB%E7%9B%B4%E6%8E%A5%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
職場には、DOS ソフトウェアで制御される組み込みデバイスがいくつかあります。次世代ハードウェアで DOS の代替 OS として Linux を使用するかどうかを評価する責任を負っています。調査の結果、DOS は単にまったく異なるタイプのオペレーティング システムであり、必要に応じて潜在的に危険な操作を実行できるという結論に至りました。私の理解では、ハードウェアに直接アクセスしたい場合は、カスタム ドライバーを作成する必要があります。上司の好奇心を満たすために私が知る必要があるのは次の点です。ユーザー空間からハードウェアに直接アクセスすることは可能でしょうか??
私の推測ではそうではないと思いますが、私よりもはるかに知識のある方々の意見を伺いたいと思います。
答え1
はい、しかし、ほとんど役に立ちません。32 ビット x86 システムでは、システムioperm(2)
コールを使用して、現在のプロセスがポート I/O を直接実行できるように設定できます。これは 64 ビット システムでは機能しないと思います。lseek/read/write
組み合わせを行うこともできます/dev/port
が、これも同様に移植性が低いと思います。http://tldp.org/HOWTO/IO-ポートプログラミング-2.html詳細については、 を参照してください。これらのアプローチは両方とも、デバイス ドライバーを作成するよりもはるかに遅く、柔軟性も低くなります (/dev/port
最も遅い)。これらのユーザー空間メカニズムでは、割り込みなどを処理することはできません。パフォーマンスが問題になる場合は、デバイス ドライバーを作成することになるでしょう。
答え2
あなたの推測は正しいです。カーネルはハードウェア要求を送信できる唯一のソフトウェアです。これは Linux に限ったことではありません。DOS より新しいオペレーティング システムでは、事実上、ハードウェアに直接アクセスすることはできません。これは、あなたが推測しているように、非常に危険だからです。
ただし、独自のドライバーを作成することは問題なく、多くのドキュメントが利用可能です。たとえば、xatlantisのこのチュートリアル最近の(これは重要です!)良い情報源のようです。
答え3
ユーザー空間からハードウェアにアクセスすることは間違いなく可能です。特にハードウェアレジスタがメモリマップされている場合。例:インド。