La transmisión de datos en la capa de enlace de la pila de protocolos Linux

  

< < fuga > > episodio tercer trimestre, finalmente, al final de la muy esperada, scofid golpeándolo con una sabiduría se salvó el día, pero en la prisión sona mal cómo iba a escapar? No sabemos esto, pero podemos analizar controlador de red Linux es cómo conseguir que los paquetes de datos a través de esta capa física de interfaz y " la cárcel y " obligado a lograr el propósito de la comunicación :-) I: conocimiento previo de la asignación de memoria de E /S. Aparatos conectados al bus de datos a través del bus de control, el estado del bus y la CPU. El número total de señal de control de transferencia de control, por ejemplo, permitir que la tarjeta de red. Un bus de datos para controlar la transmisión de datos, por ejemplo, tarjetas de transmisión de datos, el número total de estados son generalmente leer el estado actual del dispositivo, tal como la dirección MAC de la tarjeta de lectura. En funcionamiento convencional, el valor leído se consigue mediante un dispositivo se registra. Sin embargo, esto consume reloj de la CPU. Y toma un valor de cada registro debe dispositivo de lectura, lo que resulta en una baja eficiencia. En la moderna
el sistema operativo. Cita mapeo de memoria I /O. Es decir, el valor del registro a la memoria principal del cuerpo mapeado. El funcionamiento de los registros del dispositivo, para convertir el funcionamiento de la memoria principal, mejorando así la eficiencia. Esta es una manera de la DMA en el aparato de procesamiento de datos. método de procesamiento convencional: Cuando un dispositivo recibe los datos, la interrupción informó a la CPU. proceso de interrupción de la CPU, los datos en la memoria. DMA introducido en el sistema operativo moderno significa, el dispositivo de recepción de los datos, los datos se puso a la memoria DMA, la CPU genera una interrupción de nuevo. Esto ahorra una gran cantidad de tiempo de CPU en interrupción suave y NAPI en los sistemas operativos modernos, la velocidad de procesamiento de interrupción se han vuelto cada vez más exigente. En respuesta a las interrupciones que se divide en dos partes, a saber, la mitad superior y la mitad inferior. Empujando la mitad superior de la cola de procesamiento de datos, en respuesta a la interrupción. Y luego completar las tareas que quedan por la mitad inferior de la programación. NAPI es 2.6 introdujo un nuevo concepto, que ocurrió en el momento de la interrupción, deshabilitando las interrupciones. A continuación, procesar los datos. Después de eso, en un momento determinado, tomará la iniciativa si hay datos para ser procesados ​​por la consulta dispositivo. I /O, DMA se discutirá en linux2.6.21 implementadas en el posterior análisis del código. NAPI conocimiento detallado y suave interrupción interrumpirá la manipulación en el momento del análisis, y once a ustedes dos: Hablando desde el controlador de la tarjeta de red. En el Ejemplo Intel controlador 100M NIC recibe una breve visión general de la transmisión de flujo de paquetes. Ver el código (drivers /net /e100.c) tarjeta es un dispositivo PCI pertenece, su inscripción en el registro promedio de dispositivo PCI no es diferente. e100_init_module static int __init (void) {if (((1 < < debug) - 1) &NETIF_MSG_DRV) {printk (KERN_INFO PFX "% s,% s \\ n ", DRV_DESCRIPTION, DRV_VERSION); printk (KERN_INFO PFX "% s \\ n ", DRV_COPYRIGHT);} //registrar PCIreturn pci_module_init (&e100_driver);} donde e100_driver correspondió a pci_driver.static e100_driver struct pci_driver = {//NIC nombre de controlador correspondiente .name = DRV_NAME, //tipo de concordancia .id_table = e100_id_table, //función de detección de .probe = e100_probe, //función quitar, esta función se llama .Remove = __devexit_p (e100_remove) cuando se retira el dispositivo, #ifdef CONFIG_PM.suspend = e100_suspend,. reanudar = e100_resume, #endif}

cuando el número total detectada dispositivo PCI cumple con los parámetros e100_id_table serán llamados e100_probe, inicializar el dispositivo se inició en e100_probe en: static int __devinit e100_probe (struct pci_dev * pdev, const struct pci_device_id * ent) {struct net_device * netdev; struct nic * nic; int err; //asignar y asignar //alloc_etherdev net_device función de distribución net_device para la interfaz Ethernet. Es alloc_netdev función de contenedor si {if (((1 < < depuración) - 1) &NETIF_MSG_PROBE) (! (Netdev = alloc_etherdev (sizeof (nic struct)))) printk (KERN_ERR PFX " fallido Etherdev alloc ., abortar \\ n "); -ENOMEM retorno;}

//valor inicial del puntero de función en netdev netdev- > = abrir e100_open; netdev- > stop = e100_close; netdev- > //el ethtool soporte de la herramienta; hard_start_xmit = e100_xmit_frame; netdev- > get_stats = e100_get_stats; netdev- > set_multicast_list = e100_set_multicast_list; netdev- > set_mac_address = e100_set_mac_address; netdev- > change_mtu = e100_change_mtu; netdev- > do_ioctl = e100_do_ioctl SET_ETHTOOL_OPS eficaces (netdev, &e100_ethtool_ops); netdev- > tx_timeout = e100_tx_timeout; netdev- > watchdog_timeo = E100_WATCHDOG_PERIOD; //función de sondeo netdev- > sondeo = e100_poll; netdev- > peso = E100_NAPI_WEIGHT; #ifdef CONFIG_NET_POLL_CONTROLLERnetdev - > = poll_controller e100_netpoll; #endif //obtener net_device área de datos privada, y su asignación

//tamaño de los datos privados es alloc_ etherdev () parámetro especificado nic = netdev_priv (netdev); NIC- > netdev = netdev; NIC- > PDEV = PDEV; NIC- > msg_enable = (1 < < debug) - 1; pci_set_drvdata (PDEV , netdev); //prepararse para la tarjeta después de la DMA de inicio, I /O de memoria mapeado control de registro //en realidad está asignado a PCI logrado si ((err = pci_enable_device (PDEV))) {DPRINTK (sonda. , ERR, ". no se puede habilitar el dispositivo PCI, abortando \\ n ");

Copyright © Conocimiento de Windows All Rights Reserved