2009-01-10 33 views
11

Điều này liên quan đến this question.Quy ước mã hóa để sử dụng dấu phẩy động trong trình điều khiển thiết bị Linux là gì?

Tôi không phải là chuyên gia về trình điều khiển thiết bị Linux hoặc mô-đun hạt nhân, nhưng tôi đã đọc "Trình điều khiển thiết bị Linux" [O'Reilly] bởi Rubini & Corbet và một số nguồn trực tuyến, nhưng tôi chưa đã có thể tìm thấy bất kỳ điều gì về vấn đề cụ thể này.

Khi nào là hạt nhân hoặc mô-đun trình điều khiển được phép sử dụng thanh ghi dấu phẩy động?
Nếu có, ai chịu trách nhiệm lưu và khôi phục nội dung của họ?
(Giả sử kiến ​​trúc x86-64)

Nếu tôi hiểu chính xác, bất cứ khi nào KM đang chạy, nó đang sử dụng ngữ cảnh phần cứng (hoặc chuỗi phần cứng hoặc bộ đăng ký - bất cứ thứ gì bạn muốn gọi). từ một số chuỗi ứng dụng. Nếu bạn viết KM của bạn bằng c, trình biên dịch sẽ bảo đảm chính xác rằng các thanh ghi đa năng được lưu và khôi phục đúng cách (giống như trong một ứng dụng), nhưng điều đó không tự động xảy ra với các thanh ghi dấu phẩy động. Đối với vấn đề đó, rất nhiều KM thậm chí không thể giả định rằng bộ vi xử lý có bất kỳ khả năng dấu phẩy động nào.

Tôi có đúng khi đoán rằng KM muốn sử dụng dấu phẩy động phải cẩn thận lưu và khôi phục trạng thái dấu phẩy động không? Có chức năng hạt nhân chuẩn để thực hiện việc này không?

Quy ước mã hóa có được viết ra ở bất kỳ đâu không?
Chúng có khác nhau đối với các trình điều khiển SMP-non SMP không?
Chúng có khác nhau đối với các hạt nhân không được ưu tiên cũ hơn và các hạt nhân trước mới hơn không?

Trả lời

8

Câu trả lời ngắn: Mã hạt nhân có thể sử dụng dấu phẩy động nếu sử dụng này được bao quanh bởi kernel_fpu_begin()/kernel_fpu_end(). Các hàm này xử lý việc lưu và khôi phục ngữ cảnh fpu. Ngoài ra, họ gọi preempt_disable()/preempt_enable(), có nghĩa là không có lỗi, lỗi trang, vv trong mã giữa các chức năng đó. Google tên hàm để biết thêm thông tin.

Nếu tôi hiểu đúng, bất cứ khi nào một KM đang chạy, nó được sử dụng một phần cứng ngữ cảnh (hoặc chủ đề phần cứng hoặc bộ đăng ký - bất cứ điều gì bạn muốn gọi nó là ) đã được preempted từ số chuỗi ứng dụng.

Không, mô-đun hạt nhân cũng có thể chạy trong ngữ cảnh người dùng (ví dụ: khi không gian người dùng gọi syscalls trên thiết bị do KM cung cấp). Nó có, tuy nhiên, không có liên quan đến vấn đề nổi.

Nếu bạn viết KM của bạn trong c, trình biên dịch sẽ đảm bảo một cách chính xác rằng các thanh ghi mục đích chung được lưu đúng cách và phục hồi (giống như trong một ứng dụng), nhưng điều đó không làm tự động xảy ra với đăng ký dấu phẩy động.

Đó không phải vì trình biên dịch, mà là do mã chuyển đổi ngữ cảnh hạt nhân.

10

Linus's answer cung cấp quote này khá rõ ràng để sử dụng như một phương châm:

Nói cách khác: quy tắc là bạn thực sự không nên sử dụng FP trong kernel.

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