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.

 64
Author: Eric Seppanen,
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 link

W 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;
}
 9
Author: Manish,
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ń

 8
Author: fbp,
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:

  1. name – nazwa sterownika, który jest unikalny wśród wszystkich sterowników PCI w kernel. Pojawi się pod /sys/bus/pci/drivers.

  2. pci_device_id – Tabela danych identyfikacyjnych urządzeń składa się z układów obsługiwanych przez ten sterownik.

  3. probe – adres Funkcji xxx_probe().

  4. 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 .

 1
Author: Sunil Bojanapally,
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.

 0
Author: Yûvʀʌj Sɩŋʛʜ,
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

  1. 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śmy rmmod i insmod 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.

  2. 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ć, gdy probe 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 tylko insmod Moduł

  • dmesg zawiera linię typu: pci 0000:00:04: [1234:11e8] ..., która pokazuje, że nasze urządzenie zostało sondowane do BDF 0000: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 od insmod, pokazując, czym się różnią.

    • Jeśli nie: probe jest wywoływana natychmiast po insmod

 0
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
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