Sự khác biệt giữa ioctl (), Unlocked_ioctl () và compat_ioctl () là gì?


38

Đi qua mã nguồn linux 2.6.36 tại lxr.linux.no , tôi không thể tìm thấy ioctl()phương thức trong file_operations. Thay vào đó tôi tìm thấy hai cuộc gọi mới: unlocked_ioctl()compat_ioctl(). Sự khác nhau giữa là gì ioctl(), unlocked_ioctl()compat_ioctl()?

Câu trả lời:


39

Trả lời meta: Tất cả những thứ thô sơ xảy ra với nhân Linux đều đi qua lkml (danh sách gửi thư của nhân Linux) . Để biết tóm tắt, hãy đọc hoặc tìm kiếm lwn (tin tức hàng tuần của Linux) .

Trả lời: Từ cách mới của ioctl () của Jonathan Corbet :

ioctl()là một trong những phần còn lại của kernel chạy dưới Khóa hạt nhân lớn (BKL). Trước đây, việc sử dụng BKL đã giúp ioctl()các phương thức chạy dài có thể tạo ra độ trễ dài cho các quy trình không liên quan.

Theo giải thích về bản vá được giới thiệu unlocked_ioctlcompat_ioctlđưa vào 2.6.11. Việc loại bỏ các ioctllĩnh vực đã xảy ra rất nhiều sau đó, trong 2.6.36.

Giải thích: Khi ioctlđược thực thi, nó đã lấy Khóa hạt nhân lớn (BKL), vì vậy không có gì khác có thể thực thi cùng một lúc. Điều này rất tệ trên một máy đa bộ xử lý, vì vậy đã có một nỗ lực lớn để thoát khỏi BKL. Đầu tiên, unlocked_ioctlđã được giới thiệu. Nó cho phép mỗi nhà văn trình điều khiển chọn khóa để sử dụng thay thế. Điều này có thể khó khăn, vì vậy đã có một giai đoạn chuyển tiếp trong đó các trình điều khiển cũ vẫn hoạt động (sử dụng ioctl) nhưng trình điều khiển mới có thể sử dụng giao diện được cải thiện ( unlocked_ioctl). Cuối cùng, tất cả các trình điều khiển đã được chuyển đổi và ioctlcó thể được gỡ bỏ.

compat_ioctlthực sự không liên quan, mặc dù nó đã được thêm vào cùng một lúc. Mục đích của nó là cho phép các chương trình người dùng 32 bit thực hiện ioctlcuộc gọi trên kernel 64 bit. Ý nghĩa của đối số cuối cùng ioctlphụ thuộc vào trình điều khiển, vì vậy không có cách nào để thực hiện chuyển đổi độc lập với trình điều khiển.


1
Tôi đã xem qua nguồn ioctl mới nhất và thấy rằng tòa nhà chọc trời thực hiện một vài kiểm tra và sau đó nhảy vào đây . Bạn có biết nơi tôi có thể thu thập thêm thông tin về hệ thống ioctl không? Tôi quan tâm đến cách các lệnh ioctl trên các tệp ký tự được chuyển đến trình điều khiển thích hợp. Có phải thông qua unlocked_ioctlđó xảy ra? Thực tế là một con trỏ hàm được sử dụng cho mỗi tệp (trong trường hợp này là a struct file) có vẻ như tôi có thể đóng. Là unlocked_ioctlđăng ký cho các tập tin nhân vật trên khởi tạo trình điều khiển sau mknod?
sherrellbc

1
@sherrellbc Điều khiển thiết bị đăng ký xử lý các phương pháp như tập tin unlocked_ioctltrong một struct file_opskhi nó bắt đầu, và họ được dân cư từ struct file_opsvào đối tượng tập tin khi tập tin được mở ra. mknodkhông có vai trò trong việc này.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi hiểu rồi. Tôi đã nghĩ rằng trình điều khiển thiết bị trước tiên mknodphải hiển thị giao diện của nó thông qua một thiết bị ký tự trước khi chuyển hướng các hoạt động tệp liên quan đến chính nó (thông qua unlocked_ioctl).
sherrellbc

4

Có những trường hợp khi việc thay thế (bao gồm / linux / fs.h) struct file_operations phương thức ioctl () thành compat_ioctl () trong kernel 2.6.36 không hoạt động (ví dụ: đối với một số trình điều khiển thiết bị) và phải sử dụng Unlocked_ioctl ().

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.