Como encontrar o driver (módulo) associado ao dispositivo SATA no Linux?

2

Para um dos meus aplicativos, preciso entender o fluxo do driver de dispositivo SATA. De acordo com o meu entendimento, o driver de dispositivo SATA deve estar presente na árvore do kernel do Linux. Eu me referi como encontrar o módulo do driver associado a um dispositivo no Linux para encontrar o driver de dispositivo para o dispositivo SATA.

$ readlink /sys/block/sda/device/driver ../../../../../../../bus/scsi/d

Eu fui ao local acima, mas não encontrei um arquivo de driver de dispositivo.

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$ 

Por favor, sugerir como posso ver o driver de dispositivo que foi realmente carregar para o disco rígido SATA no meu sistema.

    
por Hemant 10.12.2015 / 09:25

2 respostas

1

Use udevadm info conforme descrito na outra resposta ao link que você mencionou. Veja um exemplo com uma variante do grep diferente para reduzir a saída, enquanto percorre a árvore /sys para trás:

$ 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==""

Você pode ver que no meu sistema, /dev/sda mapeia para o dispositivo SCSI 0:0:0:0 , que está anexado a ata1 no dispositivo PCI 0:00:1f.2 (que é o adaptador host)

O driver sd é responsável por manipular o dispositivo de bloco, enquanto o driver ahci é responsável por manipular o adaptador de host SATA.

    
por 04.02.2017 / 13:06
0

Isso só tenta responder parte da questão, ou seja, como encontrar o código do driver do kernel. Eu adicionaria isso como um comentário, mas é muito longo para um.

Primeiro instale o pacote de fontes do kernel da Debian.

apt-get install linux-source-3.16

ou qualquer que seja a versão correspondente do seu kernel. Então a fonte é instalada em /usr/src/linux-source-3.16.tar.xz .

Agora crie o diretório /usr/local/src/linux e copie sua fonte lá. A saber:

mkdir /usr/local/src/linux 

seguido por

cp -ar /usr/src/linux-source-3.16.tar.xz /usr/local/src/linux

Agora você pode descompactá-lo com tar.

tar xvf linux-source-3.16.tar.xz 
cd linux-source-3.16

Em seguida, execute find para o seu driver de dispositivo desejado, por exemplo:

/usr/local/src/linux/linux-source-3.16$ find . -name 'sg.c'
./drivers/scsi/sg.c

Então o driver em questão está em

/usr/local/src/linux/linux-source-3.16/drivers/scsi/sg.c

Todos os módulos listados em lsmod devem estar na árvore de origem, no formato modname.c , em que modname é o nome que aparece na listagem lsmod .

    
por 19.12.2015 / 17:54