2010-06-01 13 views
8

Según entendí después de leer el capítulo relacionado con el modelo de dispositivo de Linux en el Linux Device Drivers 3ª edición, cuando se configura un nuevo dispositivo, el núcleo (2.6) sigue más o menos la siguiente secuencia:¿Cuál es la secuencia seguida por el kernel de Linux para configurar un dispositivo?

  1. El dispositivo está registrada en el núcleo conductor (device_register(), lo que incluye la inicialización del dispositivo)
  2. a kobject se ha registrado en el modelo de dispositivo
  3. se crea una entrada en sysfs y provoca un evento de conexión en caliente
  4. autobús y los conductores se comprueban para ver qué uno coincide con el dispositivo
  5. sonda
  6. dispositivo se enganchan al conductor

Mi principal duda es, en el paso 1, cuando se device_register() llama y qué campos ya debe estar configurado en el device estructura?

¿Lo llama el bus al que está conectado el dispositivo? ¿Algún ejemplo en el código?

¿He entendido mal algo? :)

Respuesta

3

código de conexión en caliente PCI va a llamar pci_do_scan_bus() para pasar por todas las ranuras, a ver si nos encontramos con un dispositivo/puente y añadirlos a nuestro árbol de dispositivos:

unsigned int __devinit pci_do_scan_bus(struct pci_bus *bus) { 
    max = pci_scan_child_bus(bus) //scan bus for all slots and devices in them 
    pci_bus_add_devices(bus); //add what we find 
... 
} 

Los campos de struct device en realidad se completan como parte de una llamada a pci_scan_child_bus(). Aquí está el gráfico de llamadas (tipo de :)):

pci_scan_child_bus> pci_scan_slot (busque ranuras en el bus)> pci_scan_single_device> pci_device_add> device_initialize.

Tenga en cuenta que device_initialize() es la primera parte de device_register(). Verá que los campos del dispositivo struct se completan en pci_device_add después de la llamada a device_initialize(). Puede encontrarlo en drivers/pci/probe.c en las fuentes del kernel. La estructura pci_dev también se completará y luego será utilizada por el controlador específico del dispositivo.

La adición real del kobject a la jerarquía del dispositivo ocurre en pci_bus_add_devices. Aquí está el gráfico de llamadas:

pci_bus_add_devices> pci_bus_add_device> device_add.

Como puede ver, este flujo de llamada completa la segunda parte de la función device_register().

Por lo tanto, en resumen, device_register() consta de: 1. Inicialice el dispositivo y 2. Agregue el dispositivo. pci_device_add hace el paso 1 y el paso 2. pci_bus_add_device hace

archivos de interés son: los conductores/pci/{pci.c, bus.c, probe.c}

0

En struct tipo de bus hay el puntero a la función coincide con, cuyo trabajo es hacer coincidir el controlador asociado con el dispositivo. Entonces, cuando el dispositivo está asociado con un bus, tan pronto como el dispositivo se conecta al bus, es responsabilidad del bus buscar el dispositivo.

Por favor corregirme si ese no es el caso.

Cuestiones relacionadas