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