2010-07-20 25 views
6

Tôi là người mới tham gia lập trình Mô-đun hạt nhân Linux. Từ các tài liệu mà tôi đã đọc cho đến nay, tôi đã phát hiện ra rằng có 3 cách cho một chương trình sử dụng để yêu cầu dịch vụ hoặc để giao tiếp với mộtChúng tôi có những tùy chọn nào để liên lạc giữa một chương trình người dùng và một Mô-đun hạt nhân Linux?

  1. một tập tin thiết bị Linux Kernel Module trong/dev
  2. một tập tin trong hệ thống tập tin/proc
  3. ioctl() gọi

Câu hỏi: Những tùy chọn khác nào chúng ta có để giao tiếp giữa chương trình người dùng và mô-đun hạt nhân linux?

Trả lời

6

Tùy chọn 3) thực sự là tùy chọn phụ của tùy chọn 1) - ioctl() là một cách tương tác với tệp thiết bị (read()write() là cách thông thường).

Hai cách khác đáng xem xét là:

  • Các sysfs hệ thống tập tin;
  • Ổ cắm Netlink.
+0

Ổ cắm Netlink trông đầy hứa hẹn nhưng không thể tìm thấy ví dụ hoạt động sử dụng ổ cắm netlink. Quản lý để viết riêng của tôi nhưng vẫn còn rất nhiều câu hỏi chưa được trả lời. – binW

6

Về cơ bản, nhiều cơ chế IPC chuẩn - cf. http://en.wikipedia.org/wiki/Inter-process_communication - có thể được sử dụng:

  1. File và tập tin bộ nhớ ánh xạ: một tập tin thiết bị (như trên) hoặc tập tin đặc biệt tương tự trong/dev, procfs, sysfs, debugfs, hoặc một hệ thống tập tin của riêng bạn, sản phẩm Descartes với đọc/ghi, ioctl, mmap

  2. có lẽ tín hiệu (để sử dụng với một kthread)

  3. Sockets: sử dụng một giao thức của sự lựa chọn: TCP, UDP (cf . knfsd, nhưng nhiều khả năng không phải là quá dễ dàng), PF_LOCAL, hoặc NETLINK (nhiều subinterface - cơ sở netlink, genetlink, Connector, ...)

Hơn nữa,

4. Hệ thống gọi (không thực sự có thể sử dụng từ các mô-đun)

5. Giao diện mạng (tương tự như điều chỉnh).

ví dụ về NETLINK làm việc - chỉ để tên một vài - có thể được tìm thấy ví dụ như trong

  • git: //git.netfilter.org/libmnl (userspace bên)
  • net/core/rtnetlink .c (liên kết mạng cơ bản)
  • net/netfilter/nf_conntrack_netlink.c (nfnetlink)
  • fs/quota/netlink.c (genetlink)
3

Điều này bao gồm tất cả các loại với các ví dụ :)

http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html

+1

Quyền của bạn liên kết chứa rất nhiều thông tin hữu ích nhưng liên kết không phải là câu trả lời. Vui lòng xem http://stackoverflow.com/questions/how-to-answer giải thích tại sao các liên kết đơn giản không phải là những gì SO muốn. – stsquad

+0

i trả lời của bạn "" Chúng tôi có những tùy chọn nào khác để liên lạc giữa chương trình người dùng và mô-đun hạt nhân Linux? "" Một phần của câu hỏi .. nếu bạn đã hỏi các tùy chọn khác và cách chúng hoạt động, tôi đã viết một vài các trang về họ, lý do tại sao tôi đưa cho bạn liên kết đó vì nó có các ví dụ làm việc cùng với chúng, điều mà tôi nghĩ là tự giải thích. – Santi1986

+1

Khi các trang stackoverflow giải thích các liên kết đến các trang bên ngoài có thể tạm thời. Nếu liên kết đến trang biến mất, câu trả lời đột nhiên trở nên vô dụng. Không ai cho rằng bạn cần phải viết một bài luận nhưng một bản tóm tắt các tùy chọn sẽ làm cho nó trở thành một câu trả lời hữu ích hơn. – stsquad

1

This Linux document cho một số trong những cách mà trong đó hạt nhân và sử dụng không gian có thể tương tác (giao tiếp). Họ là những người sau đây.

  • Procfs, sysfs và các cơ chế tương tự. Điều này bao gồm các mục nhập /dev và tất cả các phương pháp trong đó không gian hạt nhân hiển thị tệp trong không gian người dùng (/ proc,/dev, v.v. về cơ bản các tệp được hiển thị từ không gian hạt nhân).
  • Socket cơ chế dựa trên. Netlink là một loại ổ cắm, có nghĩa là đặc biệt cho giao tiếp giữa không gian người dùng và không gian hạt nhân.
  • System calls.
  • Upcalls. Hạt nhân thực hiện một mã trong không gian người dùng. Ví dụ sinh sản một quy trình mới.
  • mmap - Bộ nhớ ánh xạ vùng bộ nhớ hạt nhân tới không gian người dùng. Điều này cho phép cả hạt nhân và không gian người dùng đọc/ghi vào cùng một vùng bộ nhớ.

Ngoài những danh sách này, danh sách sau đây thêm một số cơ chế khác mà tôi biết.

  • Interrupts. Không gian người dùng có thể tăng gián đoạn để nói chuyện với không gian hạt nhân. Ví dụ một số CPU sử dụng int80 để thực hiện cuộc gọi hệ thống (trong khi những người khác có thể sử dụng một cơ chế khác như hướng dẫn syscall). Hạt nhân phải xác định trước trình xử lý ngắt tương ứng.
  • vDSO/vsyscall - Đây là những cơ chế trong hạt nhân Linux để tối ưu hóa việc thực hiện một số cuộc gọi hệ thống. Ý tưởng là có một vùng nhớ chia sẻ, và khi một tiến trình thực hiện một cuộc gọi hệ thống, thư viện không gian người dùng lấy dữ liệu từ vùng này, thay vì thực sự gọi các cuộc gọi hệ thống tương ứng. Điều này giúp tiết kiệm chi phí chuyển đổi ngữ cảnh.