Modelo subyacente del dispositivo Linux

  
 

Sobre el modelo de dispositivo de Linux en línea, hay algunas discusiones. Algunas cosas que solía usar, se han modificado y organizado.

§ 1 KobjectKobject es un nuevo mecanismo de administración de dispositivos introducido en Linux 2.6, representado por struct kobject en el kernel. A través de esta estructura de datos, todos los dispositivos tienen una interfaz unificada en la parte inferior, kobject proporciona una gestión básica de objetos, es la estructura central del modelo de dispositivo Linux2.6, está estrechamente relacionado con el sistema de archivos sysfs, cada objeto kobject registrado en el kernel Ambos corresponden a un directorio en el sistema de archivos sysfs. Kobject es la estructura básica que conforma el modelo de dispositivo. Similar a la clase base en C ++, está incrustado en objetos de objetos más grandes, denominados contenedores, que se utilizan para describir los componentes del modelo de dispositivo. Tales como autobuses, dispositivos, controladores son contenedores típicos. Estos contenedores están conectados por kobject, formando una estructura de árbol. Esta estructura de árbol corresponde a la dirección /sys. La estructura kobject proporciona una gestión básica de objetos para algunas estructuras de datos grandes y subsistemas, evitando la implementación repetitiva de funciones similares. Estas funciones incluyen: recuento de referencias de objetos. Mantener la lista de objetos vinculados (colección). Bloqueo de objetos. Representación en el espacio del usuario. La estructura de Kobject se define como:
struct kobject {char * k name; Puntero al nombre del dispositivo nombre char [KOBJ NOMBRE LEN]; nombre del dispositivo struct kref kref; entrada de encabezado de la lista de la estructura del recuento de objetos; unidad unida al kset en el padre kset * parent; puntero al objeto padre struct kset * kset El puntero al kset es struct kobj type * ktype; el puntero a su tipo de objeto descriptor struct dentry * dentry; el puntero de ruta del nodo del archivo correspondiente al objeto en el sistema de archivos sysfs};

donde el campo kref indica la referencia del objeto Count, el kernel implementa la gestión de conteo de referencias de objetos a través de kref. El kernel proporciona dos funciones kobject_get () y kobject_put () para aumentar y disminuir el conteo de referencia respectivamente. Cuando el conteo de referencia es 0, se liberan todos los recursos utilizados por el objeto. El campo Ktype es un puntero a la estructura de tipo kobj, que indica el tipo del objeto.

Funciones relacionadas con void kobject_init (struct kobject * kobj); //función de inicialización de kobject. Int kobject_set_name (struct kobject * kobj, const char * format, ...); //Establece el nombre del kobject especificado. Struct kobject * kobject_get (struct kobject * kobj); //Agrega un recuento de referencia del objeto kobj a 1 y devuelve un puntero al objeto. Void kobject_put (struct kobject * kobj); //Reduce el recuento de referencia del objeto kobj en 1. Si el recuento de referencia cae a 0, se llama a kobject release () para liberar el objeto kobject. Int kobject_add (struct kobject * kobj); //Añade el objeto kobj a la jerarquía de dispositivos de Linux. El objeto kobject se engancha en la cadena de la lista de kset, se incrementa el recuento de referencia de kobject //en el directorio principal, se crea el nodo de archivo en el directorio al que apunta el padre y se inicia la función hotplug del objeto de núcleo del tipo. Int kobject_register (struct kobject * kobj); //función de registro de kobject. El kobj se inicializa llamando a kobject init (), y se llama a kobject_add () para completar el registro del objeto del kernel //. Void kobject_del (struct kobject * kobj); //Eliminar el objeto kobj de la jerarquía (jerarquía) de dispositivos de Linux. Void kobject_unregister (struct kobject * kobj); //función de cierre de sesión de kobject. Al contrario de kobject register (), primero llama a kobject del para eliminar el objeto de la jerarquía de dispositivos. //Llame a kobject put () para reducir el recuento de referencia del objeto. Si el recuento de referencia cae a 0, se libera el objeto kobject.

§ 2 Kobj type
struct kobj_type {void (* release) (struct kobject *); struct sysfs_ops * sysfs_ops; struct attribute ** default_attrs;};

La estructura de datos de tipo Kobj contiene tres campos: Se usa un método de liberación para liberar los recursos ocupados por kobject; un puntero a sysfs ops apunta a la tabla de operación sysfs y una lista de atributos predeterminados del sistema de archivos sysfs. La tabla de acciones Sysfs incluye dos funciones, store () y show (). Cuando el modo de usuario lee la propiedad, se llama a la función show (), y la función codifica el valor de propiedad especificado en el búfer y lo devuelve al estado de usuario, y la función store () almacena el valor de propiedad pasado en el estado de usuario. Atributo
struct atributo {char * nombre; struct module * owner; mode_t mode;};

atributo, atributo. Se envía como un archivo al directorio sysfs. Debajo del directorio correspondiente a kobject. El nombre del archivo es nombre. El método de lectura y escritura de archivos corresponde a sysfs ops en tipo kobj. § 3. Lo más importante de ksetkset es establecer la asociación entre el subsistema y el subyacente (kobject). Kobject también lo usará para distinguir a qué tipo pertenece, y luego creará la ubicación correcta del directorio bajo /sys. La prioridad de kset es relativamente alta. Kobject utilizará su propio * kset para encontrar su propio kset, y especificará * ktype como el ktype debajo del kset. A menos que se defina kset, se utilizará ktype para establecer la relación. Kobject está organizado en una estructura jerárquica por kset. Kset es una colección de kobjects del mismo tipo. Está representado por la estructura de datos de kset en el kernel y se define como:
struct kset {struct subsystem * subsys; pointer struct kobj del subsistema Escriba * ktype; puntero a kset objeto descriptor de tipo estructura struct list head; encabeza de cadena struct kobject kobj para conectar todos los kobjects en el kset; kobjectstruct incrustado kset hotplug ops * hotplug ops; apuntando a la tabla de operaciones de conexión en caliente Puntero};

Todos los kobjects contenidos en kset están organizados en una lista circular bidireccional, y el campo de la lista es el encabezado de la lista. El campo Ktype apunta a una estructura de tipo kobj que comparten todos los objetos del kset para indicar el tipo de estos objetos. La estructura de datos de Kset también incrusta un objeto kobject (representado por el campo kobj), y todos los campos primarios del objeto kobject que pertenecen a este punto kset apuntan a este objeto incrustado. Además, kset también confía en kobj para mantener los recuentos de referencia: el recuento de referencia para kset es en realidad el recuento de referencia del objeto kobject incrustado. Consulte la Figura 1, diagrama de relación de kset y kobject


Esta imagen es muy clásica, refleja la conexión de todo el kobject.

La función de correlación es similar a kobject, kset_init () completa la inicialización del kset especificado, y kset_get () y kset_put () incrementan y disminuyen el recuento de referencias del objeto kset, respectivamente. Las funciones Kset_add () y kset_del () implementan respectivamente la adición y eliminación del objeto keset especificado a la jerarquía de dispositivos; la función kset_register () completa el registro del kset y la función kset_unregister () completa el cierre de sesión del kset.

§ 4 subsystem Si kset es una colección de kobjects, el subsistema es una colección de ksets. Describe una clase de subsistemas de dispositivos en el sistema, como los subsistemas de bloques, que representan todos los dispositivos de bloques, correspondientes al directorio de bloques en el sistema de archivos sysfs. De manera similar, los dispositivos subsys se corresponden con el directorio de dispositivos en sysfs y describen todos los dispositivos en el sistema. El subsistema se describe mediante la estructura estructura de datos del subsistema, definida como:
struct subsystem {struct kset kset; objeto kset incrustado struct rw semaphore rwsem; semáforo de acceso mutuamente exclusivo}; se puede ver

, la diferencia entre subsistema y kset Hay un semáforo adicional, por lo que en el código posterior, el subsistema ha sido completamente prohibido por kset.

Cada kset pertenece a un subsistema. Puede agregar un kset al subsistema configurando el campo de subsistema en la estructura de kset para que apunte al subsistema especificado. Todos los ksets conectados al mismo subsistema comparten el mismo semáforo rwsem para el acceso sincrónico a la lista enlazada en kset. Funciones relacionadas
subsistema tiene un conjunto similar de funciones: void subsystem_init (struct subsystem * subsys); int subsystem_register (struct subsystem * subsys); void subsystem_unregister (struct subsystem * subsys); struct subsystem * subsys_get (struct subsystem * Subsys) void subsys_put (struct subsystem * subsys);

Sobre el uso de esas funciones, se analizará en detalle en los siguientes ejemplos. Aquí es sólo una introducción.

Copyright © Conocimiento de Windows All Rights Reserved