私のアプリケーションの1つでは、SATAデバイスドライバーのフローを理解する必要があります。私の理解によれば、SATAデバイスドライバーはLinuxカーネルツリーにあるはずです。 Linux上のデバイスに関連付けられているドライバーモジュールを見つける方法 SATAデバイスのデバイスドライバーを見つける方法を参照しました。
$ readlink /sys/block/sda/device/driver ../../../../../../../bus/scsi/d
上記の場所に移動しましたが、デバイスドライバーファイルが見つかりません。
usr@usr:/sys/bus/scsi/drivers/sd$ ll
total 0
drwxr-xr-x 2 root root 0 Dec 9 17:00 ./
drwxr-xr-x 4 root root 0 Dec 9 17:00 ../
lrwxrwxrwx 1 root root 0 Dec 9 17:47 2:0:1:0 -> ../../../../devices/pci0000:00/0000:00:1f.2/ata3/Host2/target2:0:1/2:0:1:0/
--w------- 1 root root 4096 Dec 9 17:47 bind
--w------- 1 root root 4096 Dec 9 17:47 uevent
--w------- 1 root root 4096 Dec 9 17:47 unbind
usr@usr:/sys/bus/scsi/drivers/sd$
システムのSATAハードドライブに実際にロードされたデバイスドライバーを確認する方法を提案してください。
あなたが言及したリンクに対する他の回答で説明されているように、udevadm info
を使用してください。 /sys
ツリーを逆方向にたどりながら、出力を削減する別のgrepバリアントの例を次に示します。
$ udevadm info -a -n /dev/sda | egrep 'looking|DRIVER'
looking at device '/devices/pci0000:00/0000:00:1f.2/ata1/Host0/target0:0:0/0:0:0:0/block/sda':
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/Host0/target0:0:0/0:0:0:0':
DRIVERS=="sd"
looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/Host0/target0:0:0':
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/Host0':
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1':
DRIVERS==""
looking at parent device '/devices/pci0000:00/0000:00:1f.2':
DRIVERS=="ahci"
looking at parent device '/devices/pci0000:00':
DRIVERS==""
したがって、私のシステムでは、/dev/sda
がSCSIデバイス0:0:0:0
にマップされ、PCIデバイスata1
(ホストアダプタ)の0:00:1f.2
に接続されていることがわかります。
ドライバーsd
はブロックデバイスの処理を担当し、ドライバーahci
はSATAホストアダプターの処理を担当します。
これは、質問の一部、つまりカーネルドライバコードを見つける方法に答えようとするだけです。これをコメントとして追加しますが、長すぎます。
まず、Debianカーネルソースパッケージをインストールします。
apt-get install linux-source-3.16
または、対応するカーネルのバージョンが何であれ。次に、ソースが/usr/src/linux-source-3.16.tar.xz
にインストールされます。
次に、/usr/local/src/linux
ディレクトリを作成し、そこにソースをコピーします。すなわち:
mkdir /usr/local/src/linux
に続く
cp -ar /usr/src/linux-source-3.16.tar.xz /usr/local/src/linux
これで、タールで開梱できます。
tar xvf linux-source-3.16.tar.xz
cd linux-source-3.16
次に、目的のデバイスドライバーに対してfind
を実行します。
/usr/local/src/linux/linux-source-3.16$ find . -name 'sg.c'
./drivers/scsi/sg.c
したがって、問題のドライバーは
/usr/local/src/linux/linux-source-3.16/drivers/scsi/sg.c
lsmod
にリストされているすべてのモジュールは、modname.c
の形式でソースツリーにある必要があります。ここで、modname
はlsmod
リストに表示される名前です。