2012-04-25 12 views
5

Trong KEXT, tôi đang nghe tệp gần bằng trình nghe vnode hoặc tệp phạm vi tệp. Đối với một số (rất ít) tập tin, tôi cần phải gửi đường dẫn tập tin đến daemon hệ thống của tôi mà không xử lý một số (điều này đã xảy ra trong daemon) và trả về kết quả trở lại KEXT. Cuộc gọi đóng tập tin cần phải bị chặn cho đến khi tôi nhận được phản hồi từ daemon. Dựa trên kết quả tôi cần một số hoạt động trong cuộc gọi gần và trả lại cuộc gọi gần thành công. Có rất nhiều thảo luận về chủ đề liên quan đến truyền thông KEXT trên diễn đàn. Nhưng họ không kết luận và xuất hiện rất cũ (năm 2002 xung quanh). Yêu cầu này có thể được xử lý bởi FtlSendMessage(...) API Win32. Tôi đang tìm kiếm tương đương của chương trình trên MacCách tốt nhất để giao tiếp từ KEXT tới Daemon và chặn cho đến khi kết quả được trả lại từ Daemon

Dưới đây là những gì tôi đã xem xét và muốn tóm tắt sự hiểu biết của tôi:

  1. Mach nhắn: Cung cấp cách rất tốt thông tin liên lạc hai chiều sử dụng gửi và trả lời các cảng với xếp hàng mechansim. Tuy nhiên, API tin nhắn mach (ví dụ: mach_msg, mach_port_allocate, bootstrap_look_up) dường như không phải là KPI. Có thể sử dụng API mach mach_msg_send_from_kernel, nhưng chỉ riêng điều đó sẽ không giúp liên lạc hai chiều. Sự hiểu biết của tôi có đúng không?
  2. IOUserClient: Điều này có vẻ liên quan nhiều hơn khi giao tiếp từ không gian người dùng đến KEXT và sau đó có một số cuộc gọi lại từ KEXT. Tôi không tìm thấy cách để bắt đầu truyền thông từ KEXT đến daemon và sau đó chờ kết quả từ daemon. Tui bỏ lỡ điều gì vậy?
  3. Ổ cắm: Đây có thể là tùy chọn cuối cùng vì tôi sẽ phải triển khai toàn bộ kênh liên lạc hai chiều từ KEXT đến Daemon.
  4. ioct l/sysctl: Tôi không biết nhiều về chúng. Từ những gì tôi đã đọc, tùy chọn không được đề xuất của nó đặc biệt là cho liên lạc hai chiều
  5. RPC-Mig: Một lần nữa tôi không biết nhiều về chúng. Trông phức tạp từ những gì tôi đã thấy. Không chắc chắn nếu đây là cách được khuyến nghị.
  6. KUNCUserNotification: Điều này dường như chỉ cung cấp thông báo cho người dùng từ KEXT. Nó không đáp ứng yêu cầu của tôi.

Nền tảng được hỗ trợ là (10.5 trở đi). Vì vậy, nhìn vào yêu cầu, ai đó có thể đề xuất và cung cấp một số gợi ý về chủ đề này?

Xin cảm ơn trước.

+0

Bạn có tìm thấy ví dụ về cách triển khai tính năng này với ổ cắm không? – gbdavid

Trả lời

3

Mẫu mà tôi đã sử dụng cho quy trình đó là có quy trình không gian người dùng bắt đầu kết nối socket với KEXT; KEXT tạo ra một luồng mới để xử lý các tin nhắn trên socket đó và ngủ thread. Khi KEXT phát hiện một sự kiện cần thiết để phản hồi, nó sẽ đánh thức luồng tin nhắn và sử dụng socket hiện có để gửi dữ liệu tới daemon. Khi nhận được phản hồi, điều khiển được chuyển lại cho chuỗi yêu cầu để quyết định có nên phủ quyết thao tác hay không.

Tôi không biết bất kỳ tài nguyên nào sẽ mô tả toàn bộ mẫu đó, nhưng KPI có liên quan sẽ được thảo luận trong Mac OS X Internals (có vẻ cũ, nhưng KPI không thay đổi nhiều kể từ khi được viết) và OS X and iOS Kernel Programming (mà tôi là một nhà phê bình công nghệ).

+0

Cảm ơn Graham về các yếu tố đầu vào của bạn. Tôi sẽ khám phá bằng cách sử dụng tùy chọn socket nhân để giao tiếp giữa KEXT và Daemon. Cảm ơn một lần nữa. – RHK

0

Nếu bạn muốn sử dụng ổ cắm được thiết lập với ctl_register() ở phía KExt, hãy cẩn thận: Giao tiếp từ kext tới không gian người dùng (qua ctl_enqueuedata()) hoạt động OK. Tuy nhiên hướng ngược lại là lỗi trên 10.5.x và 10.6.x.

Sau khoảng 70.000 hoặc 80.000 send() cuộc gọi với SOCK_DGRAM trong PF_SYSTEM miền hoàn chỉnh đống vỡ ròng với những hậu quả tai hại cho hệ thống hoàn chỉnh (cứng tắt là lối thoát duy nhất). Điều này đã được sửa trong 10.7.0. Tôi giải quyết bằng cách sử dụng setsockopt() trong dự án của chúng tôi cho hướng từ không gian người dùng đến kext vì chúng tôi chỉ gửi dữ liệu rất nhỏ (chỉ để cho phép/không cho phép một số hoạt động).

0

Đối với những gì nó có giá trị, autofs sử dụng những gì tôi giả sử bạn có nghĩa là bởi "RPC-Mig", vì vậy nó không quá phức tạp (MIG được sử dụng để mô tả các cuộc gọi RPC, và mã còn sơ khai nó tạo xử lý gọi thích hợp Mã gửi và nhận thông điệp Mach, có các tùy chọn đặc biệt để tạo ra các sơ đồ chế độ hạt nhân).

Tuy nhiên, nó không cần thực hiện bất kỳ tra cứu nào, vì automountd (daemon chế độ người dùng mà thư autofs kext gửi tin nhắn) có một "cổng đặc biệt lưu trữ" được gán cho nó. Việc tìm kiếm để tìm một dịch vụ tùy ý sẽ khó hơn.

Các vấn đề liên quan