1. 程式人生 > >LINUX驅動手動綁定和解綁定

LINUX驅動手動綁定和解綁定

linux

Linux內核從2.6.13-rc3開始,提供了在用戶空間,可動態的綁定和解綁定設備和設備驅動之間關系的功能。在這之前,只能通過insmod(modprobe)和rmmod來綁定和解綁,而且這種綁定和解綁都是針對驅動和所有設備的。而新的功能可以設置驅動和單個設備之間的聯系。
  這裏,我們以pci總線的nvme ssd為例,首先執行lspci顯示所有的nvme ssd。

# lspci | grep memory01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a802 (rev 01)09:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a802 (rev 01)

  有如上這麽多nvme ssd,那麽我們就可以在/dev下看到多個nvme設備(OS啟動後默認加載nvme驅動)。

# ls /dev/nvme*/dev/nvme0 /dev/nvme0n1p2 /dev/nvme0n1 /dev/nvme0n1p3 /dev/nvme0n1p1 /dev/nvme1 /dev/nvme1n1

  同時,對於所有的nvme設備(這裏我們以pci總線bdf號為09:00.0的ssd為例),都可以在nvme驅動下看到。其中,bind和unbind文件就是涉及到綁定和解綁的關鍵文件。

/sys/bus/pci/drivers/nvme# lltotal 0drwxr-xr-x  2 root root    0 Jan  4 17:10 ./
drwxr-xr-x 30 root root    0 Jan  4 17:10 ../
lrwxrwxrwx  1 root root    0 Jan  4 20:49 0000:01:00.0 -> ../../../../devices/pci0000:00/0000:00:01.0/0000:01:00.0/lrwxrwxrwx  1 root root    0 Jan  4 20:49 0000:09:00.0 -> ../../../../devices/pci0000:00/0000:00:03.0/0000:05:00.0/0000:06:0a.0/0000:07:00.0/0000:08:01.0/0000:09:00.0/--w-------  1 root root 4096 Jan  4 20:46 bind
lrwxrwxrwx  1 root root    0 Jan  4 20:49 module -> ../../../../module/nvme/--w-------  1 root root 4096 Jan  4 20:49 new_id
--w-------  1 root root 4096 Jan  4 20:49 remove_id
--w-------  1 root root 4096 Jan  4 17:10 uevent
--w-------  1 root root 4096 Jan  4 17:10 unbind

  解綁一個nvme設備,只需將設備的pci總線bdf號寫入/sys/bus/pci/drivers/nvme(不同的設備驅動不同)/unbind即可:

/sys/bus/pci/drivers/nvme# echo -n "0000:09:00.0" > unbind解除綁定成功,再查看目錄下文件,該驅動下不再有對應的設備。同時,/dev下也沒有對應的nvme設備了。/sys/bus/pci/drivers/nvme# lltotal 0drwxr-xr-x  2 root root    0 Jan  4 20:51 ./
drwxr-xr-x 30 root root    0 Jan  4 20:49 ../
lrwxrwxrwx  1 root root    0 Jan  4 20:49 0000:01:00.0 -> ../../../../devices/pci0000:00/0000:00:01.0/0000:01:00.0/
--w-------  1 root root 4096 Jan  4 20:46 bind
lrwxrwxrwx  1 root root    0 Jan  4 20:49 module -> ../../../../module/nvme/
--w-------  1 root root 4096 Jan  4 20:49 new_id
--w-------  1 root root 4096 Jan  4 20:49 remove_id
--w-------  1 root root 4096 Jan  4 20:49 uevent
--w-------  1 root root 4096 Jan  4 20:51 unbind

  綁定一個nvme設備,和解綁類似,將設備的pci總線bdf號寫入/sys/bus/pci/drivers/nvme(不同的設備驅動不同)/bind:

/sys/bus/pci/drivers/nvme# echo -n "0000:09:00.0" > bind綁定成功,再次展示該目錄下所有文件,可以發現對應設備再次出現。/sys/bus/pci/drivers/nvme# lltotal 0/sys/bus/pci/drivers/nvme# lltotal 0drwxr-xr-x  2 root root    0 Jan  5 09:13 ./
drwxr-xr-x 30 root root    0 Jan  4 20:49 ../
lrwxrwxrwx  1 root root    0 Jan  4 20:49 0000:01:00.0 -> ../../../../devices/pci0000:00/0000:00:01.0/0000:01:00.0/
lrwxrwxrwx  1 root root    0 Jan  5 09:13 0000:09:00.0 -> ../../../../devices/pci0000:00/0000:00:03.0/0000:05:00.0/0000:06:0a.0/0000:07:00.0/0000:08:01.0/0000:09:00.0/
--w-------  1 root root 4096 Jan  5 09:13 bind
lrwxrwxrwx  1 root root    0 Jan  4 20:49 module -> ../../../../module/nvme/
--w-------  1 root root 4096 Jan  4 20:49 new_id
--w-------  1 root root 4096 Jan  4 20:49 remove_id
--w-------  1 root root 4096 Jan  4 20:49 uevent
--w-------  1 root root 4096 Jan  4 20:51 unbind


LINUX驅動手動綁定和解綁定