Сообщение Re[2]: Разработка драйверов ядра Linux от 01.02.2024 16:46
Изменено 01.02.2024 16:49 AlexGin
Re[2]: Разработка драйверов ядра Linux
Здравствуйте, aik, Вы писали:
aik>Всяческие трейспоинты:
aik>https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/trace
Где-то можно об этом почитать подробнее?
Ну или загуглить по ключевым словам?
aik>Можно ещё попытаться грузиться под KVM+QEMU с включённым gdbstub в QEMU (-s), и при определённой удаче можно даже символы из vmlinux подгрузить в gdb.
То есть — некая эмуляция целевой OS на компьютере разработчика? Верно я это понимаю?
aik>Этих мало что ли? Можно ещё mmap на этих девайсах делать, или создавать внутри другие fd (file descriptor) и возвращать через ioctl. Ещё есть sysfs. Сетевые драйверы PCI устройств вообще ничего в /dev не создают, там свои syscalls.
Может и совсем даже не мало. Просто я полюбопытствовал.
AG> Я в курсе — что есть драйвера, которые можно динамически запускать (загружать) и удалять —
AG>
aik>insmod просто грузит один конкретный .ko файл, и кмк без зависимостей.
aik>modprobe ищет и грузит модуль по имени со всеми зависимостями для запущенного ядра.
Спасибо, буду в курсе!
AG>Но всё же — как принято запускать драйвера ядра? Например — при помощи systemd?
aik>хз. Наверное systemd делает и это теперь, парней уже не остановить — подменяют всё
Я совсем не уверен — делеет ли запуск драйверов подсистема systemd. Я здесь просто высказал предположение.
Как рекомендуется запускать драйвера в Linux, и как это принято классически делать?
aik>Загрузка драйвера и bind к устройствам — разные операции. Обычно драйвер сразу цепляется к девайсам, но какой нибудь vfio-pci — нет. У драйверов есть ноды bind/unbind в sysfs. Например, отцепить драйвер от девайса — "echo 0000:02:00.0 > /sys/bus/pci/drivers/xhci_hcd/unbind", прицепить назад — "echo 0000:02:00.0 > /sys/bus/pci/drivers/xhci_hcd/bind".
Спасиьо, уважаемый aik, благодарю за столь развёрнутый ответ!
aik>Всяческие трейспоинты:
aik>https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/trace
Где-то можно об этом почитать подробнее?
Ну или загуглить по ключевым словам?
aik>Можно ещё попытаться грузиться под KVM+QEMU с включённым gdbstub в QEMU (-s), и при определённой удаче можно даже символы из vmlinux подгрузить в gdb.
То есть — некая эмуляция целевой OS на компьютере разработчика? Верно я это понимаю?
aik>Этих мало что ли? Можно ещё mmap на этих девайсах делать, или создавать внутри другие fd (file descriptor) и возвращать через ioctl. Ещё есть sysfs. Сетевые драйверы PCI устройств вообще ничего в /dev не создают, там свои syscalls.
Может и совсем даже не мало. Просто я полюбопытствовал.
AG> Я в курсе — что есть драйвера, которые можно динамически запускать (загружать) и удалять —
AG>
AG>insmod our_driver.ko
AG>rmmod our_driver
AG>
aik>insmod просто грузит один конкретный .ko файл, и кмк без зависимостей.
aik>modprobe ищет и грузит модуль по имени со всеми зависимостями для запущенного ядра.
Спасибо, буду в курсе!
AG>Но всё же — как принято запускать драйвера ядра? Например — при помощи systemd?
aik>хз. Наверное systemd делает и это теперь, парней уже не остановить — подменяют всё
Я совсем не уверен — делеет ли запуск драйверов подсистема systemd. Я здесь просто высказал предположение.
Как рекомендуется запускать драйвера в Linux, и как это принято классически делать?
aik>Загрузка драйвера и bind к устройствам — разные операции. Обычно драйвер сразу цепляется к девайсам, но какой нибудь vfio-pci — нет. У драйверов есть ноды bind/unbind в sysfs. Например, отцепить драйвер от девайса — "echo 0000:02:00.0 > /sys/bus/pci/drivers/xhci_hcd/unbind", прицепить назад — "echo 0000:02:00.0 > /sys/bus/pci/drivers/xhci_hcd/bind".
Спасиьо, уважаемый aik, благодарю за столь развёрнутый ответ!
Re[2]: Разработка драйверов ядра Linux
Здравствуйте, aik, Вы писали:
aik>Всяческие трейспоинты:
aik>https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/trace
Где-то можно об этом почитать подробнее?
Ну или загуглить по ключевым словам?
Возможно — это упростит и ускорит процесс отладки софта...
aik>Можно ещё попытаться грузиться под KVM+QEMU с включённым gdbstub в QEMU (-s), и при определённой удаче можно даже символы из vmlinux подгрузить в gdb.
То есть — некая эмуляция целевой OS на компьютере разработчика? Верно я это понимаю?
aik>Этих мало что ли? Можно ещё mmap на этих девайсах делать, или создавать внутри другие fd (file descriptor) и возвращать через ioctl. Ещё есть sysfs. Сетевые драйверы PCI устройств вообще ничего в /dev не создают, там свои syscalls.
Может и совсем даже не мало. Просто я полюбопытствовал. Не факт, что это для меня будет иметь практический счысл.
AG> Я в курсе — что есть драйвера, которые можно динамически запускать (загружать) и удалять —
AG>
aik>insmod просто грузит один конкретный .ko файл, и кмк без зависимостей.
aik>modprobe ищет и грузит модуль по имени со всеми зависимостями для запущенного ядра.
Спасибо, буду в курсе!
AG>Но всё же — как принято запускать драйвера ядра? Например — при помощи systemd?
aik>хз. Наверное systemd делает и это теперь, парней уже не остановить — подменяют всё
Я совсем не уверен — делеет ли запуск драйверов подсистема systemd. Я здесь просто высказал предположение.
Как рекомендуется запускать драйвера в Linux, и как это принято классически делать?
aik>Загрузка драйвера и bind к устройствам — разные операции. Обычно драйвер сразу цепляется к девайсам, но какой нибудь vfio-pci — нет. У драйверов есть ноды bind/unbind в sysfs. Например, отцепить драйвер от девайса — "echo 0000:02:00.0 > /sys/bus/pci/drivers/xhci_hcd/unbind", прицепить назад — "echo 0000:02:00.0 > /sys/bus/pci/drivers/xhci_hcd/bind".
Спасиьо, уважаемый aik, благодарю за столь развёрнутый ответ!
aik>Всяческие трейспоинты:
aik>https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/trace
Где-то можно об этом почитать подробнее?
Ну или загуглить по ключевым словам?
Возможно — это упростит и ускорит процесс отладки софта...
aik>Можно ещё попытаться грузиться под KVM+QEMU с включённым gdbstub в QEMU (-s), и при определённой удаче можно даже символы из vmlinux подгрузить в gdb.
То есть — некая эмуляция целевой OS на компьютере разработчика? Верно я это понимаю?
aik>Этих мало что ли? Можно ещё mmap на этих девайсах делать, или создавать внутри другие fd (file descriptor) и возвращать через ioctl. Ещё есть sysfs. Сетевые драйверы PCI устройств вообще ничего в /dev не создают, там свои syscalls.
Может и совсем даже не мало. Просто я полюбопытствовал. Не факт, что это для меня будет иметь практический счысл.
AG> Я в курсе — что есть драйвера, которые можно динамически запускать (загружать) и удалять —
AG>
AG>insmod our_driver.ko
AG>rmmod our_driver
AG>
aik>insmod просто грузит один конкретный .ko файл, и кмк без зависимостей.
aik>modprobe ищет и грузит модуль по имени со всеми зависимостями для запущенного ядра.
Спасибо, буду в курсе!
AG>Но всё же — как принято запускать драйвера ядра? Например — при помощи systemd?
aik>хз. Наверное systemd делает и это теперь, парней уже не остановить — подменяют всё
Я совсем не уверен — делеет ли запуск драйверов подсистема systemd. Я здесь просто высказал предположение.
Как рекомендуется запускать драйвера в Linux, и как это принято классически делать?
aik>Загрузка драйвера и bind к устройствам — разные операции. Обычно драйвер сразу цепляется к девайсам, но какой нибудь vfio-pci — нет. У драйверов есть ноды bind/unbind в sysfs. Например, отцепить драйвер от девайса — "echo 0000:02:00.0 > /sys/bus/pci/drivers/xhci_hcd/unbind", прицепить назад — "echo 0000:02:00.0 > /sys/bus/pci/drivers/xhci_hcd/bind".
Спасиьо, уважаемый aik, благодарю за столь развёрнутый ответ!