/dev/fb0
Linuxが提供する他のファイルを使用したいです。
これは、GUIフレームバッファベースのデバイスファイルをシステム固有の方法でできるだけ低く読み書き/解釈します。
キーボードイベントにアクセスするなど、低レベルの楽しみのためにこれを行いたいと思います。
答え1
フレームバッファデバイスのファイルディスクリプタを開きioctl()
、FBIOGET_FSCREENINFO
を使用しますFBIOGET_VSCREENINFO
。返された構造では、X解像度、Y解像度、ステップサイズ、およびピクセルあたりのビット数を直接確認できます。
フレームバッファがカーネルの組み込み端末エミュレータと共有され、カーネル仮想端末を表示するために使用される場合は、そのサブシステムとのアクセスをネゴシエートする必要があり、プログラムはこれを実行し、KVTをネゴシエートしながらフレームバッファに文字を描画しないように指示しますする必要があります。別のプロセスに切り替えます。
ピクセルを描くことは、ピクセルアドレス、目的の色、および上記の値を使用して計算を実行し、バイトオフセットと書き込むバイト値を取得する問題です。これはシステムコールを介して行うことができますが、pwrite()
フレームバッファデバイスをプロセスのアドレス空間にメモリマッピングし、メモリマッピングされた領域を簡単に突き刺すことでより効率的に実行できます。
これに基づいて構築する方法の完全な本があります。
ioctl()
使用中のグラフィックモードで事前提供されたフレームバッファを使用せずに、代わりにモード設定を使用して1つ以上のフレームバッファを動的に生成すると、状況がより複雑になります。
追加読書
- https://unix.stackexchange.com/a/178807/5132
- フレームバッファを使ったカーネルモードの設定?
- https://github.com/jdebp/nosh/blob/master/source/FramebufferIO.cpp
- https://github.com/jdebp/nosh/blob/master/source/FramebufferIO.h
- https://github.com/jdebp/nosh/blob/master/source/GraphicsInterface.h#L34
- https://github.com/jdebp/nosh/blob/master/source/GraphicsInterface.cpp#L12
答え2
fb0でマウス/キーボード入力を受け取ることができるかどうかはわかりません。それでも面白いです。そして、Unixの世界で仕事がどのように機能するかについて多くを学びます。
まず、openシステムコールを使用してファイル記述子を開き、次にioctlを使用して必須パラメータを設定します。その後、デフォルトではfbを通常のファイルとして読み書きします。
マッピングファイルを見たいかもしれませんが、配列としてアクセスすることもできます!
ioctlが何をするのかは、マニュアルページで確認するか、/usr/includeにあるファイルを読んで見ることができます。
キーボードとマウスの入力を読むには、開発ファイルシステムにある入力デバイスを使用する必要があります。
これらすべてが奇妙に見えるかもしれませんが、入力システムは非常に強力です。
楽しいハックになろう!
答え3
もちろん、Linuxデバイスを読み、書き、解釈する方法に関する多くのドキュメントや記事があります。たとえば、フレームバッファの場合は、コンソールのコマンドを使用してコンソールcat
からデータを作成して水をテストすることもできます。tty
# cat /dev/urandom >/dev/fb0
読むこれたとえば、どのように動作するかを理解し、次を使用します。C/C++ 言語または何かをより複雑にすること。