Linuxカーネルでのio操作を追跡するために、ブロックioにいくつかのデバッグメッセージを追加しようとしています。
IOは複数のブロックデバイスで発生する可能性がありdev_t
ます。私には価値があります。
からメジャー番号とマイナー番号を取得できますdev_t
。
/dev/
これらのメジャー番号とマイナー番号を使用してdirからデバイスファイル名を取得する方法はありますか?
もちろん、カーネルAPIが必要です。
Linuxカーネルでのio操作を追跡するために、ブロックioにいくつかのデバッグメッセージを追加しようとしています。
IOは複数のブロックデバイスで発生する可能性がありdev_t
ます。私には価値があります。
からメジャー番号とマイナー番号を取得できますdev_t
。
/dev/
これらのメジャー番号とマイナー番号を使用してdirからデバイスファイル名を取得する方法はありますか?
もちろん、カーネルAPIが必要です。
を使用することもできますlibudev
。あなたはすでにdev_t
IDを持っているので、この方法はより簡単です。
#include <libudev.h>
// Create the udev context.
struct udev *udev = udev_new();
// Create de udev_device from the dev_t.
struct udev_device *dev = udev_device_new_from_devnum(udev, 'b', sb.st_dev);
// Finally obtain the node.
const char* node = udev_device_get_devnode(dev);
udev_unref(udev);
一般に、このような単純な逆マッピングを行うことはできません。これは、いくつかのメジャー番号とメジャー番号がわかっているため、いつmknod
でもどこでも有効なデバイスファイルを作成するために使用できます。必ずしも。の下にある必要はありません/dev
。
結局のところ、カーネルは、特定のメジャー/マイナーを持つ特定のデバイスノードがどのようにして発生したかをあまり気にしません。このようなノードは、このハードウェアまたはソフトウェアデバイスを処理できるカーネルデバイスドライバーへのエントリポイントにすぎません。
確かに、最近のほとんどのLinuxシステムでは、ほとんどのデバイスノードは-によって配置/dev
および保守されてudev
いますが、これはユーザースペースデーモンであり、カーネルドライバーは通信できません。udev
また、任意の名前で新しいデバイスノードを作成するように構成できることにも注意してください。