2016-01-26 15 views
22

Cách thích hợp để xử lý thời gian trong mã C cho 32-bit nhúng Linux (ARMLinux) là gì để đảm bảo rằng mã tiếp tục hoạt động đúng sau 03:14:07 UTC ngày 19 tháng 1 năm 2038 (khi một32 bit đã ký) tràn)? Cho rằng time_t được ký 32 bit trên hệ thống tôi phải sử dụng, các lựa chọn thay thế là gì?Giải pháp năm 2038 cho Linux nhúng (32 bit)?

Một lượng đáng kể googling đã phát hiện ra không có gì sử dụng thực tế. Mọi người dường như cho rằng tất cả chúng ta sẽ sử dụng hệ điều hành 64 bit, nhưng điều này không đúng với các hệ thống nhúng.

Trên hệ thống, tôi được yêu cầu sử dụng, __kernel_time_t được định nghĩa là long. Có lẽ có nghĩa là không có cơ sở hạt nhân cho thời gian 64 bit. Phiên bản của uClibc là 0.9.29.

Tôi không thể tin mình là người duy nhất có vấn đề này và tôi không muốn phát minh lại bánh xe.

+1

Mặc dù tôi đồng ý đây là một câu hỏi hay nhưng nó có thể quá rộng đối với SO. Bạn đã tìm kiếm LKML hoặc đăng một yêu cầu chưa? – Olaf

+0

@Olaf: Tôi đã đọc về những gì các tác giả hạt nhân Linux đang làm, nhưng tất cả đều xoay quanh các hệ thống 64 bit. Tôi không nghĩ câu hỏi này quá rộng; thẳng thắn, tôi nghi ngờ rằng có nhiều cách khác nhau để làm điều đó anyway, và câu trả lời có thể hoàn toàn có thể là "Chỉ đơn giản là không có giải pháp phổ quát hiện nay cho các hệ thống nhúng." –

+0

Đã hơn 20 năm kể từ bây giờ –

Trả lời

8

Không có đạn bạc, thủ thuật hoặc giải pháp thông minh. Hoặc sử dụng hệ điều hành có 64 bit time_t hoặc không sử dụng time_t và bất kỳ tiện ích hệ điều hành nào phụ thuộc vào nó (bao gồm hệ thống tệp, bộ hẹn giờ, nửa mạng) hoặc kế hoạch cập nhật phần mềm trong 20 năm tới.

Có ít nhất hai hệ thống giống như Unix với 64 bit time_t trên máy 32 bit: OpenBSD và NetBSD. OpenBSD có một vài cuộc thảo luận giải thích lý do đằng sau nó: http://www.openbsd.org/papers/eurobsdcon_2013_time_t/index.html

+1

Tôi đã đánh dấu phần này là câu trả lời đơn giản vì quyết định cuối cùng của chúng tôi là sống với thời gian 32-bit ngay bây giờ và lo lắng về vấn đề sau này. Không phải là giải pháp tuyệt vời IMO nhưng thành phần tôi đang làm việc không phải là thành phần duy nhất bị ảnh hưởng. –

10

Các thói quen chuyển đổi thời gian sẽ "đơn giản" phải sử dụng 2038-01-19: 03: 14: 07Z làm cơ sở cho thời gian Unix Epoch nếu dấu thời gian dưới một giá trị nhất định.

I.e. nếu hệ thống của bạn hoạt động hiệu quả trong năm 2010-01-01, bạn có thể giả định rằng không có dấu thời gian, không bị tràn, dưới 1262300400 (đây là thời gian kết thúc của ngày đó).

Nếu gặp dấu thời gian thấp hơn, hãy xem dấu thời gian bị tràn và sử dụng 2038-01-19: 03: 14: 07Z làm thời gian cơ bản. So sánh cũng phải được tính đến.

Không phải là giải pháp sạch, nhưng có thể thực hiện được với nỗ lực vừa phải. Chuyển đổi tốt hơn sang dấu thời gian 64 bit (không hoàn toàn cần hệ thống 64 bit, btw).

+1

Đây là một cách tiếp cận khủng khiếp. Trên hệ thống Linux của tôi có khá nhiều tệp có dấu thời gian vào năm 1999 hoặc lâu hơn. Ngoài ra, khi bạn trích xuất các lưu trữ bạn nhận được từ nơi khác (chẳng hạn như từ một gói cập nhật), mtimes có thể được tất cả hơi say lên. – fuz

+4

@FUZxxl Tôi đồng ý;) Nhưng chúng ta đang nói về việc nhúng ở đây, tác động có thể quản lý được – Ctx

+0

Tác động của các dấu thời gian đáng ngờ từ tương lai có thể gây tử vong. Ví dụ, nó hoàn toàn ném ra 'make' hoặc các chương trình sao lưu hoạt động dựa trên dấu thời gian. – fuz

4

Tôi giả định ABI của hệ thống nhúng của bạn xác định long là 32 bit.

Không yêu cầu loại ký hiệu time_t. Có thể bạn có thể làm cho nó unsigned long và mua cho mình và con cháu của bạn thêm 68 năm yên bình? Thay đổi điều này sẽ yêu cầu biên dịch lại hạt nhân, thư viện C một d tất cả các chương trình và thư viện sử dụng time_t ... không dành cho người yếu tim! Bạn cũng có thể định nghĩa nó là long long, nhưng điều này sẽ thay đổi nhiều bố cục cấu trúc và thậm chí còn khó khăn hơn.

+3

Nếu bạn đang làm phiền để biên dịch lại mọi nhị phân trên toàn bộ hệ thống, tại sao không nâng cấp !? – cat

+2

@cat: điểm tốt! Nếu OP có đủ quyền kiểm soát ngăn xếp phần mềm hệ thống, anh ta có một số tùy chọn để ngăn chặn vấn đề, nâng cấp là một giải pháp tốt hơn nhiều so với vá với các loại hạt nhân, nếu không, không có nhiều việc có thể làm được. – chqrlie

Các vấn đề liên quan