Некоторый код, который округляет деление для демонстрации (C-синтаксис):
#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 );
}
Теперь, если бы это было пространство пользователя, мы, вероятно, даже не заметили бы, что наш компилятор генерирует код для этих операторов (например, divdi3 () для деления). Скорее всего, мы связываемся с 'libgcc', даже не подозревая об этом. Проблема в том, что Kernel-space отличается (например, нет libgcc). Что делать?
Просканируйте Google на некоторое время, обратите внимание, что почти все обращаются к неподписанному варианту:
#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 );
}
Я знаю, как это исправить: переопределить udivdi3 () и umoddi3 () с _do_div () _ из asm / div64.h . Сделано правильно? Неправильно. Signed - это не то же самое, что unsigned, sdivdi3 () _ не просто вызывает udivdi3 () , они являются отдельными функциями по определенной причине.
Вы решили эту проблему? Вы знаете библиотеку, которая поможет мне сделать это? Я действительно застрял, поэтому все, что вы можете увидеть здесь, чего я сейчас не вижу, было бы очень полезно.
Спасибо,
Чад