2

Linuxカーネルでのio操作を追跡するために、ブロックioにいくつかのデバッグメッセージを追加しようとしています。

IOは複数のブロックデバイスで発生する可能性がありdev_tます。私には価値があります。

からメジャー番号とマイナー番号を取得できますdev_t

/dev/これらのメジャー番号とマイナー番号を使用してdirからデバイスファイル名を取得する方法はありますか?

もちろん、カーネルAPIが必要です。

4

3 に答える 3

4

簡単だ:

  1. bdget関数を使用してbyを検索しblock_deviceますdev_t
  2. bdevnameを使用してデバイス名を取得します。
  3. bdputを使用して、デバイス参照を配置します。

楽しむ。

于 2012-12-21T09:04:19.030 に答える
1

を使用することもできますlibudev。あなたはすでにdev_tIDを持っているので、この方法はより簡単です。

#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);
于 2014-05-08T15:41:34.293 に答える
0

一般に、このような単純な逆マッピングを行うことはできません。これは、いくつかのメジャー番号とメジャー番号がわかっているため、いつmknodでもどこでも有効なデバイスファイルを作成するために使用できます。必ずしも。の下にある必要はありません/dev

結局のところ、カーネルは、特定のメジャー/マイナーを持つ特定のデバイスノードがどのようにして発生したかをあまり気にしません。このようなノードは、このハードウェアまたはソフトウェアデバイスを処理できるカーネルデバイスドライバーへのエントリポイントにすぎません。

確かに、最近のほとんどのLinuxシステムでは、ほとんどのデバイスノードは-によって配置/devおよび保守されてudevいますが、これはユーザースペースデーモンであり、カーネルドライバーは通信できません。udevまた、任意の名前で新しいデバイスノードを作成するように構成できることにも注意してください。

于 2012-12-21T08:40:42.173 に答える