Làm thế nào để libusb truy cập công cụ kernel?


10

Từ những gì tôi hiểu:

  • Nói chung, trình điều khiển chạy trong không gian kernel và có thể được gọi từ không gian người dùng.
  • Chỉ mã trong không gian kernel mới có thể gọi usb ở mức độ thấp / ioctl
  • libusb là một thư viện, vì vậy nó sẽ biên dịch và chạy trong không gian người dùng

Vậy làm thế nào để libusbđạt được USB cấp thấp?

Câu trả lời:


10

Libusb là một thư viện để tương tác với các thiết bị USB theo cách tương tự như một thư viện để tương tác với các thiết bị đầu cuối văn bản, ALSA (chính xác hơn là thành phần libasound của nó) là một thư viện để tương tác với các thiết bị audi, v.v. Hạt nhân xử lý các tương tác phần cứng. Nó cung cấp tập tin thiết bị mà ứng dụng có thể mở để tương tác với phần cứng, thông qua read, writecác cuộc gọi hệ thống .ioctl

ioctl là một cuộc gọi hệ thống: nó cho phép các ứng dụng (mã cấp độ người dùng) đưa ra các yêu cầu là các tiến trình của kernel.

Libusb cho phép các ứng dụng đăng ký các chức năng gọi lại được thực thi khi thiết bị có gì đó để báo cáo. Dưới đây là tổng quan sơ bộ về luồng thông tin dưới mui xe:

  • Tín hiệu điện trên xe buýt kích hoạt một sự kiện trên bộ điều khiển USB.
  • Bộ điều khiển USB tăng tín hiệu ngắt trên bộ xử lý chính.
  • Bộ xử lý thực thi trình xử lý ngắt trong nhân hệ điều hành.
  • Thông báo kernel rằng một quá trình hiện đang trong một ngăn chặn read, writehoặc ioctlgọi hệ thống trên các tập tin thiết bị và gây rằng cuộc gọi hệ thống để trở lại.
  • Trong quy trình sử dụng đất, khi hệ thống gọi lại, mã thư viện được thực thi.
  • Mã thư viện thực thi chức năng gọi lại được đăng ký bởi lập trình viên ứng dụng.

Vì vậy, không cần phải viết trình điều khiển thiết bị cho các thiết bị usb? (trừ khi có thể để tối ưu hóa tốc độ)
Thomas

@Thomas Bạn cần phải viết trình điều khiển hạt nhân nếu bạn muốn cắm vào một khung công tác không phụ thuộc vào vận chuyển: bàn phím, bộ lưu trữ, ethernet, v.v. Nếu không, tôi nghĩ bạn chỉ cần một trình điều khiển nếu độ trễ của chương trình người dùng quá cao.
Gilles 'SO- ngừng trở nên xấu xa'

Nếu một thiết bị không được máy tính nhận ra (không có trình điều khiển cho nó), liệu libusbvẫn có thể truy cập được không?
Thomas

@Thomas Tôi không biết liệu libusb có thể đối phó với tất cả các khía cạnh của giao thức USB hay không, nhưng về nguyên tắc, có. Một chương trình userland có thể giao tiếp với bất kỳ thiết bị nối tiếp RS232 nào, thông qua /dev/ttyS*. USB là nguyên tắc tương tự, chỉ nhanh hơn và phức tạp hơn.
Gilles 'SO- ngừng trở nên xấu xa'

3

Linux sử dụng hai vòng rung 0 được gọi là kernel-level, vòng 3 được gọi là người sử dụng cấp. Kết nối từ người dùng đến kernel được thực hiện (như đã nói) thông qua các tòa nhà chọc trời. Giữa chúng là các thư viện, nhìn từ vùng người dùng. Vì vậy, quyền truy cập cấp thấp nhất vào kernel được triển khai trong các thư viện, vì lý do ổn định, bảo mật, đồng bộ hóa, lưu khoảng cách, v.v. Trình điều khiển hạt nhân cung cấp các giao diện khác nhau cho vùng người dùng: (ioctl, sysfs, socket, ký tự và các thiết bị khối, v.v.) Giao diện không gian người dùng . Vì vậy, nếu bạn muốn, bạn có thể thực hiện quyền truy cập vào trình điều khiển hạt nhân bằng cách tự mình bỏ qua các thư viện hoặc dễ dàng biên dịch nhị phân của bạn với các thư viện được liên kết tĩnh.

Một điểm khởi đầu tốt là để đọc các nguồn libusb, chúng được ghi chép lại.


0

Nó sử dụng các tòa nhà chọc trời (2) và các tệp thiết bị được chuẩn bị bởi kernel ( /dev/bus/usb/*)


Vì vậy, mọi thứ hoạt động như thể kernel tạo trình điều khiển đặc biệt cho các thiết bị không xác định chấp nhận đọc và ghi? Làm thế nào chúng ta được thông báo về các ngắt và như vậy?
Thomas
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.