GNU/Linux >> Tutoriales Linux >  >> Linux

¿Hay alguna forma de obtener time_t de 64 bits en programas de 32 bits en Linux?

Aparentemente, no, no es posible. Para empezar, solo hay un time() función en Linux, sin time32() o time64() .

Después de buscar por un tiempo, puedo ver que no es culpa de libc, pero el culpable es en realidad el kernel.

Para que libc obtenga la hora actual, debe ejecutar una llamada al sistema:

time_t time (t) time_t *t;
{
    // ...
    INTERNAL_SYSCALL_DECL (err);
    time_t res = INTERNAL_SYSCALL (time, err, 1, NULL);
    // ...
    return res;
}

La llamada al sistema se define como:

SYSCALL_DEFINE1(time, time_t __user *, tloc)
{
    time_t i = get_seconds();
    // ...
    return i;
}

La función get_seconds() devuelve un unsigned long , así:

unsigned long get_seconds(void)
{
    struct timekeeper *tk = &timekeeper;

    return tk->xtime_sec;
}

Y timekeeper.xtime_sec en realidad es de 64 bits:

struct timekeeper {
    // ...
    /* Current CLOCK_REALTIME time in seconds */
    u64                     xtime_sec;
    // ...
}

Ahora, si conoces tu C, sabes que el tamaño de unsigned long en realidad depende de la implementación. En mi máquina de 64 bits aquí, es de 64 bits; pero en mi máquina de 32 bits aquí, es de 32 bits. Es posiblemente podría ser de 64 bits en alguna implementación de 32 bits, pero no hay garantía.

Por otro lado, u64 siempre es de 64 bits, por lo que, en la base, el kernel realiza un seguimiento del tiempo en un tipo de 64 bits. Por qué luego procede a devolver esto como un unsigned long , que no se garantiza que sea de 64 bits, me supera.

Al final, incluso si libc obligara a time_t para mantener un valor de 64 bits, no cambiaría nada.

Podría vincular su aplicación profundamente al kernel, pero no creo que valga la pena.


Muchas respuestas anteriores dijeron que esto es imposible, pero eso es totalmente incorrecto . era no era posible en ese momento, pero la gente había estado hablando de arreglarlo durante años. Finalmente, se introdujo el soporte de tiempo de 64 bits en plataformas de 32 bits en el kernel de Linux 5.1 con la adición del nuevo *time64 llamadas al sistema. Mire esta tabla, puede ver que esas llamadas al sistema solo están disponibles en plataformas de 32 bits. Ahora, si está escribiendo código para sistemas de 32 bits, puede llamar al clock_gettime64 directamente (desde ensamblador en línea o C con syscall() ) para obtener la hora actual

Sin embargo, después de eso, estás completamente solo. Si desea un espacio de usuario completo soporte debe estar en Linux 5.6 o superior junto con musl 1.2+ o glibc 2.32+. Simplemente reconstruya su código y su time_t tendrá una longitud de 64 bits

  • Todo el espacio de usuario debe compilarse con un time_t de 64 bits , que será compatible con las próximas versiones musl-1.2 y glibc-2.32, junto con los encabezados del kernel instalados desde linux-5.6 o superior.

  • Las aplicaciones que usan las interfaces de llamada del sistema directamente deben ser portadas para usar el time64 Se agregaron llamadas al sistema en Linux-5.1 en lugar de las llamadas al sistema existentes. Esto afecta a la mayoría de los usuarios de futex() y seccomp() así como lenguajes de programación que tienen su propio entorno de tiempo de ejecución no basado en libc.

https://lkml.org/lkml/2020/1/29/355?anz=web

Para más información

  • Acercándonos al final del juego del año kernel 2038
  • Manejo de símbolos de tiempo de 64 bits en la biblioteca GNU C
  • glibc Y2038 Diseño de prueba
  • Cambiar time_t y clock_t a 64 bits

Linux
  1. Obtenga el código fuente para cualquier comando de Linux

  2. Obtenga el tiempo de creación de archivos con Python en Linux

  3. ¿Hay alguna manera de inspeccionar el rpath actual en Linux?

  4. ¿Hay alguna forma de obtener el UID del usuario en una máquina Linux usando Java?

  5. Espacio de direcciones del proceso de 32 bits en Linux de 64 bits

Cómo saber si la versión de Linux es de 32 bits o de 64 bits

¿Cómo verificar que el sistema Linux sea de 32 bits o de 64 bits?

¿Hay alguna manera de obtener emoji de colores en cualquier emulador de terminal en Linux?

Linux:¿hay alguna forma de identificar la velocidad de su memoria a través del software?

Modo operativo de CPU de 32 bits y 64 bits en Linux

¿Hay alguna manera de obtener la versión del BIOS desde el interior de Linux?