Introducción a las funciones comunes de Linux (3)


obtener hora del día

gettimeofdayes una función, comúnmente utilizada en UNIX y sistemas similares a UNIX, para obtener el valor preciso de la hora y fecha actuales. Se encuentra <sys/time.h>en el archivo de encabezado y se puede llamar con:

#include <sys/time.h>

int gettimeofday(struct timeval *tv, struct timezone *tz);

gettimeofdayLa función acepta dos parámetros: struct timeval *tvy struct timezone *tz. tvEs un timevalpuntero a una estructura utilizada para almacenar el valor de tiempo obtenido. tzes un timezonepuntero a una estructura utilizada para obtener información de zona horaria (en sistemas más nuevos, este parámetro ha quedado obsoleto y se puede pasar NULL).

timevalLa estructura se define de la siguiente manera:

struct timeval {
    
    
    time_t tv_sec;  // 秒数
    suseconds_t tv_usec;  // 微秒数
};

gettimeofdayUna vez que la función se ejecuta correctamente, la información de fecha y hora actuales se almacena en la estructura tva la que apunta el parámetro timeval.

A continuación se muestra un gettimeofdayejemplo sencillo del uso de la función para obtener la hora actual:

#include <stdio.h>
#include <sys/time.h>

int main() {
    
    
    struct timeval tv;
    if (gettimeofday(&tv, NULL) == 0) {
    
    
        printf("Current time: %ld seconds, %ld microseconds\n", tv.tv_sec, tv.tv_usec);
    } else {
    
    
        printf("Failed to get the current time.\n");
    }
    return 0;
}

Tenga en cuenta que gettimeofdayse devuelve 0 en caso de éxito y -1 en caso de error. En caso de éxito, los valores de segundos y microsegundos se pueden obtener accediendo a los campos tv.tv_secy .tv.tv_usec

Vale la pena señalar que gettimeofdayla función proporciona precisión de tiempo en el nivel de microsegundos, pero en algunos sistemas más nuevos, se recomienda utilizar funciones más modernas, como que clock_gettimeproporciona funciones de sincronización de mayor precisión.

kmalloc

kmallocEs una función en el kernel de Linux que se utiliza para asignar dinámicamente memoria espacial del kernel. Es un mecanismo de asignación de memoria proporcionado por el kernel para asignar bloques de memoria en tiempo de ejecución que pueden usarse para el código y los datos del kernel.

kmallocEl prototipo de la función <linux/slab.h>se define en el archivo de encabezado y su uso común es el siguiente:

void* kmalloc(size_t size, gfp_t flags);
  • sizeEl parámetro especifica el tamaño, en bytes, del bloque de memoria que se asignará.
  • flagsLos parámetros son indicadores que se utilizan para controlar el comportamiento de asignación de memoria. Puede ser una de las siguientes banderas o una combinación de ellas:
    • GFP_KERNEL: Indica la asignación de memoria regular del kernel.
    • GFP_ATOMIC: Representa la asignación de memoria atómica, adecuada para asignar memoria en contexto de interrupción o áreas críticas protegidas por bloqueos de giro.
    • GFP_DMA: Indica la asignación de memoria que se puede utilizar para operaciones DMA.
    • Otras banderas: hay otras banderas que se pueden usar para especificar un comportamiento de asignación de memoria específico, como GFP_NOWAIT, GFP_HIGHUSERetc.

kmallocLa función devuelve un puntero al bloque de memoria asignado o regresa si la asignación falló NULL.

Cabe señalar que kmallocdespués de usar la memoria asignada, debe usar la kfreefunción correspondiente para liberar la memoria y evitar pérdidas de memoria.

En definitiva, kmalloces una función utilizada en el kernel de Linux para asignar dinámicamente memoria espacial del kernel, lo que proporciona una forma conveniente de asignar bloques de memoria en tiempo de ejecución y elegir diferentes estrategias de asignación e indicadores según las necesidades.


dev_t

dev_tEs un tipo de datos utilizado para representar números de dispositivos en el kernel de Linux. Un número de dispositivo es un valor que identifica de forma única un dispositivo en el sistema.

En los sistemas Linux, los dispositivos pueden ser dispositivos físicos (como discos duros, puertos serie, etc.) o dispositivos virtuales (como sistemas de archivos virtuales, pseudo terminales, etc.). A cada dispositivo se le asigna un número de dispositivo único, que se utiliza para identificar y acceder al dispositivo dentro del kernel.

dev_tLas variables de tipo suelen constar de dos partes: número mayor y número menor. Los números de dispositivo principales identifican el tipo de dispositivo, mientras que los números de dispositivo menores identifican diferentes instancias o particiones del mismo tipo de dispositivo.

En el espacio de usuario, makedevse pueden utilizar macros para combinar números de dispositivo mayores y menores en un único dev_ttipo de número de dispositivo. Por ejemplo:

dev_t device = makedev(major_number, minor_number);

Luego puede usar MAJORlas MINORmacros y para extraer los números de dispositivo mayor y menor del número de dispositivo. Por ejemplo:

unsigned int major = MAJOR(device);
unsigned int minor = MINOR(device);

En el desarrollo del kernel, dev_tlos números de tipo de dispositivo se utilizan a menudo en los controladores de dispositivos para identificar y operar dispositivos de forma única. El número de dispositivo juega un papel importante al registrar el dispositivo, abrir archivos del dispositivo y realizar operaciones del dispositivo.

Tipo int sin signo , 32 bits, utilizado para definir el número de dispositivo en el controlador, los 12 bits superiores son el número de dispositivo principal y los 20 bits inferiores son el número de dispositivo menor.

En resumen, dev_tes el tipo de datos utilizado para representar el número de dispositivo en el kernel de Linux, que consta de un número de dispositivo mayor y un número de dispositivo menor, y se utiliza para identificar de forma única el dispositivo en el sistema.


alloc_chrdev_region

alloc_chrdev_regionEs una función proporcionada por el kernel de Linux y se utiliza para asignar dinámicamente el rango de números de dispositivos principales de dispositivos de caracteres en el kernel.

En los sistemas Linux, un dispositivo de caracteres es una clase especial de dispositivo que /dev/ttyproporciona acceso al dispositivo a través de un archivo de dispositivo de caracteres (por ejemplo). Cada dispositivo de carácter tiene un número principal único que identifica el tipo de dispositivo.

alloc_chrdev_regionEl prototipo de la función es el siguiente:

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, const char *name);
  • devEs un dev_tpuntero a una variable de tipo que recibe el rango de números de dispositivo asignado.
  • firstminorEs el primer número de dispositivo menor en el rango de números de dispositivo que se asignarán.
  • countEs la cantidad de dispositivos dentro del rango de números de dispositivos que se asignarán.
  • namees un nombre de dispositivo opcional que se utiliza para /proc/devicesmostrar información del dispositivo en formato .

Después de llamar alloc_chrdev_regiona la función, el kernel asigna un rango contiguo de números de dispositivo y los almacena en devla variable señalada por el puntero. El número de dispositivo mayor del rango de números de dispositivo asignado se MAJOR(*dev)obtiene de y el número de dispositivo menor MINOR(*dev)se obtiene de .

A esta función se le debe pasar el primer número de dispositivo menor especificado (generalmente 0), el número de dispositivos que se asignarán y el nombre del dispositivo. El número de dispositivo asignado automáticamente después de llamar a esta función se guarda en dev.
La asignación dinámica de números de dispositivos puede evitar las desventajas de especificar números de dispositivos manualmente, pero también tiene sus propias desventajas, es decir, es imposible predecir la /devcreación nodos de dispositivos.

Una vez que haya terminado de usar el rango de números de dispositivo asignado, deberá usar unregister_chrdev_regionuna función para liberar el rango. Por ejemplo:

unregister_chrdev_region(*dev, count);

alloc_chrdev_regiony unregister_chrdev_regionlas funciones se utilizan normalmente durante las fases de inicialización y limpieza de controladores de dispositivos de caracteres para asignar y liberar rangos de números de dispositivos.

En resumen, alloc_chrdev_regiones una función utilizada en el kernel de Linux para asignar dinámicamente el rango de números de dispositivos principales de dispositivos de caracteres, lo que proporciona una manera conveniente de asignar el rango de números de dispositivos y usarlo para el registro y uso de dispositivos de caracteres.

Hay dos métodos para asignar números de dispositivo: estático y dinámico. Asignación estática ( register_chrdev_region()función) significa aplicar al sistema la asignación de una cierta cantidad de números de dispositivo especificando el primer número de dispositivo (su número de dispositivo menor generalmente es 0) a través de la función de parámetro cuando el número de dispositivo principal del dispositivo se conoce de antemano . La asignación dinámica ( alloc_chrdev_region()) se refiere a configurar solo el primer número de dispositivo menor (generalmente 0, el número de dispositivo principal no se conocerá de antemano) y la cantidad de dispositivos que se asignarán a través de parámetros, y el sistema asigna dinámicamente el número de dispositivo requerido. unregister_chrdev_region()Libere el número de dispositivo asignado (ya sea estático o dinámico) a través de la función.

cdev

Inicialización de la definición de memoria estática:

struct cdev my_cdev;
cdev_init(&my_cdev, &fops);
my_cdev.owner = THIS_MODULE;

Inicialización de la definición de memoria dinámica:

struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &fops;
my_cdev->owner = THIS_MODULE;
int cdev_add(struct cdev *, dev_t, unsigned);  
 注册字符设备,传入 cdev 结构的指针,起始设备编号,
 以及设备编号范围。cdev_del() 函数来释放 cdev 占用的内存。

kstrtoul

kstrtoules una función proporcionada en el kernel de Linux para convertir una cadena en un entero largo sin signo ( unsigned long).

El prototipo de función es el siguiente:

int kstrtoul(const char *s, unsigned int base, unsigned long *res);
  • ses la cadena a convertir.
  • baseEs un número base que especifica la base del valor representado por la cadena, que puede ser un valor entre 2 y 36, o 0 significa que la base se juzga automáticamente según el prefijo de la cadena (como hexadecimal) 0x.
  • resEs un unsigned longpuntero a una variable de tipo utilizada para recibir el resultado convertido.

La función sanaliza la cadena en un largo sin firmar y almacena el resultado en resla variable a la que apunta el puntero. Si la conversión es exitosa, la función devuelve 0; si la conversión falla, se devuelve un código de error apropiado.

kstrtoulLas funciones se utilizan ampliamente en el kernel para analizar parámetros o elementos de configuración pasados ​​por el espacio del usuario. Proporciona una forma segura y confiable de convertir una cadena en un largo sin firmar para procesarla y usarla en el kernel.

En resumen, kstrtoules una función utilizada en el kernel de Linux para convertir una cadena en un entero largo sin signo y, a menudo, se utiliza para analizar parámetros o elementos de configuración pasados ​​por el espacio del usuario. Proporciona una forma segura y confiable de realizar conversiones de cadenas a números.

Supongo que te gusta

Origin blog.csdn.net/qq_44710568/article/details/131953418
Recomendado
Clasificación