un código que redondea la división de demostrar (C-sintaxis):¿Cómo dividir dos números de 64 bits en Kernel de Linux?
#define SINT64 long long int
#define SINT32 long int
SINT64 divRound(SINT64 dividend, SINT64 divisor)
{
SINT32 quotient1 = dividend/divisor;
SINT32 modResult = dividend % divisor;
SINT32 multResult = modResult * 2;
SINT32 quotient2 = multResult/divisor;
SINT64 result = quotient1 + quotient2;
return (result);
}
Ahora bien, si este fuera el usuario espacio que probablemente ni siquiera se dio cuenta de que nuestro compilador genere código para aquellos operadores (por ejemplo, divdi3() para la división). Es probable que estemos vinculados con 'libgcc' sin siquiera saberlo. El problema es que Kernel-space es diferente (por ejemplo, no libgcc). ¿Qué hacer?
arrastre de Google durante un tiempo, el aviso de que casi todo el mundo se dirige a la variante sin firmar:
#define UINT64 long long int
#define UINT32 long int
UINT64 divRound(UINT64 dividend, UINT64 divisor)
{
UINT32 quotient1 = dividend/divisor;
UINT32 modResult = dividend % divisor;
UINT32 multResult = modResult * 2;
UINT32 quotient2 = multResult/divisor;
UINT64 result = quotient1 + quotient2;
return (result);
}
sé cómo solucionar éste: Invalidar udivdi3() y umoddi3() con _do_div () _ de asm/div64.h. ¿Bien hecho? Incorrecto. Firmado no es lo mismo que unsigned, sdivdi3() _ no simplemente llama a udivdi3(), son funciones separadas por algún motivo.
¿Ha resuelto este problema? ¿Conoces una biblioteca que me ayude a hacer esto? Estoy realmente atascado así que todo lo que puedas ver aquí que yo no haga en este momento sería realmente útil.
Gracias, Chad