Một số mã mà viên đạn lên bộ phận để chứng minh (C-cú pháp):Làm thế nào để chia hai số 64 bit trong nhân 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);
}
Bây giờ, nếu này là người sử dụng không gian chúng ta có lẽ sẽ không còn nhận thấy rằng trình biên dịch của chúng tôi là tạo mã cho những nhà khai thác (ví dụ divdi3() để chia). Rất có thể chúng tôi liên kết với 'libgcc' mà không hề biết. Vấn đề là không gian hạt nhân là khác nhau (ví dụ: không có libgcc). Phải làm gì?
thu thập thông tin của Google trong một thời gian, thông báo rằng khá nhiều tất cả mọi người đề cập đến biến unsigned:
#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);
}
tôi biết làm thế nào để sửa lỗi này một: Override udivdi3() và umoddi3() với _do_div () _ từ asm/div64.h. Đã xong rồi? Sai rồi. Đã ký không giống như unsigned, sdivdi3() _ không chỉ đơn giản gọi udivdi3(), chúng là các hàm riêng biệt vì một lý do.
Bạn đã giải quyết được sự cố này chưa? Bạn có biết một thư viện sẽ giúp tôi làm điều này? Tôi thực sự bị mắc kẹt vì vậy bất cứ điều gì bạn có thể thấy ở đây mà tôi chỉ cần không ngay bây giờ sẽ thực sự hữu ích.
Cảm ơn, Chad