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_ioctl
và compat_ioctl
đưa vào 2.6.11. Việc loại bỏ các ioctl
lĩ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à ioctl
có thể được gỡ bỏ.
compat_ioctl
thự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 ioctl
cuộc gọi trên kernel 64 bit. Ý nghĩa của đối số cuối cùng ioctl
phụ 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.
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à astruct 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 saumknod
?