Làm thế nào để hiểu được luồng phát hiện USB?


14

Tôi muốn hiểu dòng chảy của các sự kiện USB tạo thành không gian Kernel đến không gian Người dùng (chỉ vì tò mò, để biết cách mọi thứ được triển khai).

Để rõ ràng hơn, tôi muốn biết làm thế nào mà cửa sổ bật lên xuất hiện trong máy tính để bàn của tôi khi tôi cắm ổ USB vào hệ thống của mình và cách ổ đĩa được gắn.

Tôi cũng muốn biết làm thế nào nó phát hiện ra nếu một số hình ảnh có trong USB của tôi và nếu "có", làm thế nào nó hỏi tôi có cần mở nó trong GIMP hoặc một số phần mềm khác không?

Tôi biết đó là một câu hỏi rất lớn và rộng, nhưng xin vui lòng hướng dẫn tôi một số gợi ý về cách hiểu toàn bộ ý tưởng đằng sau nó.

Tôi chưa thực hiện duyệt mã lớn, nhưng tôi đảm bảo với bạn rằng tôi không có vấn đề gì khi làm như vậy nếu tôi có thể được hướng dẫn chính xác.

Câu trả lời:


16
  1. Thiết bị được cắm và phần mềm quản lý bus phần cứng cho thiết bị đó nhận được một ngắt (hoặc thông báo khác ở cấp phần cứng) và trình điều khiển xe buýt liệt kê các thiết bị được đính kèm hoặc thực hiện các hành động phần cứng dành riêng cho xe buýt khác để nhận dạng thiết bị.
  2. Kernel yêu cầu tải trình điều khiển cho phần cứng mới bằng cách gọi / sbin / modprobe bằng mã định danh bus / device / etc của phần cứng.
  3. Trong không gian người dùng, modprobe cố gắng tìm một bí danh do trình điều khiển chỉ định phù hợp. (Xem /lib/modules/$(uname -r)/modules.aliasđể biết danh sách đầy đủ.) Chúng sẽ trông khác nhau dựa trên giao diện phần cứng. Ví dụ: pci:v0000102Bd00002527sv*sd*bc*sc*i*đối với nhà cung cấp thiết bị PCI 102B, thiết bị 2527 và bất cứ thứ gì cho subvendor, v.v. hoặc USB : usb:v2040p4982d*dc*dsc*dp*ic*isc*ip*.
  4. khi trình điều khiển thiết bị được tải (hoặc một thiết bị mới đã có trình điều khiển được khởi chạy), trình điều khiển trong kernel sẽ gửi thông báo của thiết bị được tải tới udevtrong không gian người dùng.
  5. udevkhớp với thông báo so với danh sách các quy tắc trong /lib/udev/rules.d//etc/udev/rules.d. Từ đây, hành vi cực kỳ chuyên biệt, dựa trên các quy tắc.
  6. Trong trường hợp đĩa USB, 80-udisks.rulestệp có thể là nơi tốt nhất để làm việc. Các quy tắc này sẽ sử dụng những thứ như blkid và các trình trợ giúp khác để thăm dò loại và nội dung của đĩa, điền vào tất cả các loại giá trị cấu hình bao gồm cả những thứ như ENV{UDISKS_PRESENTATION_HIDE}="1"bỏ qua đĩa vì một số lý do. Xem "man 7 udisks" để biết chi tiết.
  7. Các udisks-daemon đồng hồ cho các thiết bị xuất hiện trong udev cơ sở dữ liệu, và những món quà họ chúng như là một danh sách có thể phát hiện các thiết bị trên dbus. (Xem "udisks --enum Cả".)
  8. Các hành động khác nhau được định cấu hình trong udisks và chính sách cho phép các hành động đó có thể được nhìn thấy trong tệp chính sách /usr/share/polkit-1/actions/org.freedesktop.udisks.policy. (Ai có thể gắn kết, umount, v.v.)
  9. Các dịch vụ quan tâm đến thiết bị sẽ lắng nghe các sự kiện DBus từ udisks và thực hiện các hành động khi chúng thấy các điều kiện nhất định. Ví dụ: Nautilus của Gnome (thông qua màn hình âm lượng gvfs) sẽ yêu cầu tự động đếm cho các thiết bị (thông qua udisks , sẽ kiểm tra chính sách của nó, được đề cập ở trên).
  10. Khi một hệ thống tập tin đã được gắn kết, các dịch vụ nghe tương tự sẽ có nhiều hành động hơn. Ví dụ: Nautilus sẽ hỏi bạn có muốn mở F-Spot không khi DCIMtìm thấy thư mục lưu trữ ảnh chung trên hệ thống tệp.

1
Có lẽ bạn biết điều này khác nhau như thế nào trong khi khởi động (tôi giả sử chỉ có bước 1 là khác nhau)? Tại sao thiết bị không thể được phát hiện trong khi khởi động, nhưng tải chính xác sau khi cắm lại thủ công?
naktinis
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.