Dlaczego metoda probe jest potrzebna w sterownikach urządzeń Linuksowych oprócz init?
W jądrze Linuksa, co robi metoda probe()
, którą dostarcza sterownik? Czym różni się ona od funkcji init
sterownika, tzn. dlaczego w funkcji init
sterownika nie mogą być wykonywane działania funkcji probe()
?
6 answers
Różne typy urządzeń mogą mieć funkcje sondy (). Na przykład urządzenia PCI i USB mają funkcje probe ().
Jeśli mówisz o urządzeniach PCI, polecam przeczytać rozdział 12 Linux Device Drivers , który obejmuje tę część inicjalizacji sterowników. USB jest opisane w rozdziale 13.
Krótsza odpowiedź, zakładając, że PCI: funkcja INIT sterownika wywołuje pci_register_driver()
, która daje jądro listę urządzeń, które jest w stanie obsługiwać, wraz ze wskaźnikiem do probe()
funkcja. Jądro następnie wywołuje funkcję sterownika probe()
raz dla każdego urządzenia.
Ta funkcja sondy rozpoczyna inicjalizację poszczególnych urządzeń: inicjalizację sprzętu, alokację zasobów i rejestrację urządzenia z jądrem jako urządzenia blokowego lub sieciowego lub cokolwiek to jest.
To ułatwia kierowcom urządzeń, ponieważ nigdy nie muszą szukać urządzeń ani martwić się o znalezienie urządzenia, które było podłączone do sieci. Jądro obsługuje tę część i powiadamia o tym prawo sterownik, gdy ma urządzenie do obsługi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-13 12:15:44
@Bandicoot : probe() zostanie wywołane, aby upewnić się, że urządzenie istnieje i funkcjonalność jest w porządku.Jeśli urządzenie nie jest podłączalne na gorąco, funkcjonalność probe() może być umieszczona wewnątrz metody init ().Zmniejszy to zużycie pamięci czasu pracy sterownika. P. s link
Probe() występuje w momencie rozruchu urządzenia lub gdy urządzenie jest podłączone.W przypadku urządzenia" platformowego " funkcja sondy jest wywoływana, gdy urządzenie platformy jest zarejestrowane, a jego nazwa urządzenia jest zgodna z nazwą określone w sterowniku urządzenia. P. s link
Funkcja i2c_detect bada adapter I2C, szukając różnych adresów określonych w strukturze addr_data. Jeśli urządzenie zostanie znalezione, zostanie wywołana funkcja chip_detect. P. S link .
Jeden link, który z pewnością rozwiąże Twoje wątpliwości. P. S linkW kernelu 2.4.29 mogę wam pokazać, jak działa sonda? Zobacz poniżej (nazwa pliku: sterowniki / acorn / char / pcf8583.c )
static struct i2c_driver pcf8583_driver = {
name: "PCF8583",
id: I2C_DRIVERID_PCF8583,
flags: I2C_DF_NOTIFY,
attach_adapter: pcf8583_probe, /* This will be called from i2c-core.c P.S see below function i2c_add_driver()*/
detach_client: pcf8583_detach,
command: pcf8583_command
};
Nazwa pliku: drivers / I2C / I2C-core.c
int i2c_add_driver(struct i2c_driver *driver)
{
........................
........................
/* now look for instances of driver on our adapters
*/
if (driver->flags& (I2C_DF_NOTIFY|I2C_DF_DUMMY)) {
for (i=0;i<I2C_ADAP_MAX;i++)
if (adapters[i]!=NULL)
/* Ignore errors */
driver->attach_adapter(adapters[i]); /*This is a location from where probe is called. Pointer **driver** is of type **pcf8583_driver** which you have passed into this function*/
}
ADAP_UNLOCK();
return 0;
}
Kilka ważnych linków:
1) http://www.slideshare.net/varunmahajan06/i2c-subsystem-in-linux2624
2) http://www.programering.com/a/MjNwcTMwATM.html
3) http://www.linuxjournal.com/article/6717
4) http://www.developermemo.com/2943157/
5) http://free-electrons.com/doc/kernel-architecture.pdf
6) http://www.techques.com/question/1-3014627/Probe-problem-when-writing-a-I2C-device-driver
W PCI dla kernel-2.4.29, jest wywoływany po zidentyfikowaniu identyfikatora dostawcy i urządzenia. Kierowca magistrali PCI zrobi to za Ciebie. Zobacz poniższy kod:
Nazwa pliku: sterowniki / pci / pci.c
static int pci_announce_device(struct pci_driver *drv, struct pci_dev *dev)
{
const struct pci_device_id *id;
int ret = 0;
if (drv->id_table) {
id = pci_match_device(drv->id_table, dev); /* check for device presence*/
if (!id) {
ret = 0;
goto out;
}
} else
id = NULL;
dev_probe_lock();
if (drv->probe(dev, id) >= 0) { /* This is a location from where probe is called*/
dev->driver = drv;
ret = 1;
}
dev_probe_unlock();
out:
return ret;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-03 19:20:07
Init (void) // uruchamia się raz, gdy sterownik/moduł jest wywoływany i ustawia rzeczy na maszynie sterownika jądra.
Sonda (*pdev) / / jest używana przez sterownik jądra w razie potrzeby do wykrywania i instalowania rzeczywistych urządzeń
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-17 17:19:41
Drivery xxx_init_module()
wywołują funkcję pci_register_driver(struct pci_driver *drv)
przekazując odwołanie do struktury typu pci_driver
. struct pci_driver
jest ważną strukturą, którą powinny mieć wszystkie sterowniki PCI, która jest inicjalizowana zmiennymi takimi jak nazwa sterowników, lista tabel urządzeń PCI, które sterownik może obsługiwać, procedury zwrotne dla podsystemu PCI core.
Struktura sterowników pci_driver ma ważne pola member wymienione poniżej:
name
– nazwa sterownika, który jest unikalny wśród wszystkich sterowników PCI w kernel. Pojawi się pod/sys/bus/pci/drivers
.pci_device_id
– Tabela danych identyfikacyjnych urządzeń składa się z układów obsługiwanych przez ten sterownik.probe
– adres Funkcjixxx_probe()
.remove/suspend/resume/shutdown
– adres funkcji, którą wywołuje system PCI core, gdy urządzenie PCI jest odpowiednio usuwane/zawieszane/wznawiane/wyłączane. Zwykle używane przez górne warstwy do zarządzania energią.
Aby uzyskać więcej informacji na temat sposobu sondowania kierowcy wykonywany z rdzenia PCI refer Linux Device Driver INIT .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-16 08:39:31
Sondowanie jest wykonywane, gdy metoda probe () jest wywoływana przez wskaźnik funkcji Wewnątrz struktury, który jest używany do wiązania Urządzenia z domyślnymi lub niestandardowymi danymi platformy dotyczącymi urządzenia. drivers wykorzystuje wiele informacji o urządzeniu, więc sonda dostarcza takie informacje sterownikom, gdy wpis w polu Nazwa id_table pasuje do nazwy urządzenia będzie sonda.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-29 21:27:02
Wiele urządzeń i hotplug
-
Używasz dużego serwera z wieloma podłączonymi akceleratorami GPU PICe. W pewnym momencie zdecydujesz się kupić więcej GPU dla wolnych slotów.
Gdybyśmy użyli
init
, musielibyśmyrmmod
iinsmod
modułu. Wymagałoby to jednak zatrzymania wszystkich podłączonych procesorów graficznych, co powoduje przestoje.Z
probe
, wystarczy podłączyć nowe GPU Zrobić ponowne skanowanie. Hotplug PCIe w przeciwnym razie: https://electronics.stackexchange.com/questions/208767/does-pcie-hotplug-actually-work-in-practice
Przykład urządzenia QEMU edu PCI
[[19]}QEMU posiada edukacyjne urządzenie PCI o nazwie edu, które pozwala nam łatwo przetestować, gdyprobe
jest wywoływany.
Po pierwsze, potrzebujemy do tego minimalnego sterownika PCI jądra Linuksa, który napisałem tutaj .
Możemy zacząć od dołączonego urządzenia:
-device edu
[[19]}ale jeszcze bardziej co ciekawe, możemy również podłączyć i usunąć urządzenie z monitora QEMU, Ctrl + Alt + 2 na SDL GUI lub -monitor telnet::45454,server,nowait
na CLI, za pomocą komend:
device_add edu
device_del edu
Jeśli urządzenie jest podłączone przy rozruchu:
-
probe
jest wywoływany, gdy tylkoinsmod
Moduł -
dmesg
zawiera linię typu:pci 0000:00:04: [1234:11e8] ...
, która pokazuje, że nasze urządzenie zostało sondowane do BDF0000:00:04
.Wiemy, że to nasze urządzenie, ponieważ sprzedawcą jest 0x1234 i identyfikator urządzenia 11e8 w QEMU źródło.
Wnioskujemy więc, że urządzenia PCI są badane podczas rozruchu i przechowywane gdzieś na liście.
Jeśli podłączymy urządzenie po uruchomieniu z monitora:
-
Nic się nie dzieje, dopóki nie zrobimy:
echo 1 > /sys/bus/pci/rescan
Zobacz także: jak można zmusić jądro Linuksa do wyliczenia magistrali PCI-e?
-
Po rescan:
-
/ Align = "left" /
Więc w tym przypadek,
probe
wydarzył się oddzielnie odinsmod
, pokazując, czym się różnią. Jeśli nie:
probe
jest wywoływana natychmiast poinsmod
-
/ Align = "left" /
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-27 21:14:39