del codice che arrotonda la divisione di dimostrare (C-sintassi):Come dividere due numeri a 64 bit nel kernel 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);
}
Ora, se questo fosse l'utente-spazio che probabilmente non sarebbe nemmeno accorto che il nostro compilatore genera codice per gli operatori (ad esempio, divdi3() per divisione). È probabile che ci colleghiamo a "libgcc" senza neanche saperlo. Il problema è che Kernel-space è diverso (ad es. No libgcc). Cosa fare?
scansione di Google per un po ', si noti che tutti più o meno si rivolge la variante senza segno:
#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);
}
so come risolvere questo: override udivdi3() e umoddi3() con _do_div () _ da asm/div64.h. Fatto bene? Sbagliato. Firmato non è lo stesso di unsigned, sdivdi3() _ non chiama semplicemente udivdi3(), sono funzioni separate per un motivo.
Hai risolto questo problema? Conosci una biblioteca che mi aiuterà a fare questo? Sono davvero bloccato quindi qualsiasi cosa tu possa vedere qui, che proprio ora non sarebbe molto utile.
Grazie, Ciad