कुछ कोड है कि प्रदर्शन करने के लिए विभाजन अप राउंड (सी-वाक्य रचना):लिनक्स कर्नेल में दो 64-बिट संख्याओं को विभाजित करने के लिए कैसे?
#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 नहीं)। क्या करें?
थोड़ी देर के लिएक्रॉल गूगल, सूचना है कि काफी हर किसी अहस्ताक्षरित संस्करण पते:
#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 साथ () _ एएसएम/div64.h से। सही किया? गलत। हस्ताक्षरित हस्ताक्षर के समान नहीं है, sdivdi3() _ udivdi3() पर कॉल नहीं करता है, वे एक कारण के लिए अलग-अलग कार्य हैं।
क्या आपने इस समस्या को हल किया है? क्या आप एक पुस्तकालय के बारे में जानते हैं जो मुझे ऐसा करने में मदद करेगा? मैं वास्तव में अटक गया हूं, जो भी आप यहां देख सकते हैं कि मैं अभी ठीक नहीं हूं, वास्तव में सहायक होगा।
धन्यवाद, चाड