2013-03-08 14 views
24

Tôi đang tìm cách viết trình điều khiển PWM. Tôi biết rằng có hai cách chúng tôi có thể kiểm soát trình điều khiển phần cứng:Không gian người dùng so với trình điều khiển không gian hạt nhân

  1. Trình điều khiển không gian người dùng.
  2. Kernel tài xế không gian

Nếu nói chung (không xem xét một trường hợp lái xe PWM), chúng tôi phải đưa ra quyết định liệu có nên đi cho không gian sử dụng hoặc điều khiển không gian hạt nhân. Vậy thì những yếu tố nào chúng ta phải xem xét ngoài những yếu tố này?

  1. Trình điều khiển không gian người dùng có thể trực tiếp mmap()/dev/mem bộ nhớ vào không gian địa chỉ ảo của chúng và không cần chuyển ngữ cảnh.
  2. Trình điều khiển vùng người dùng không thể có trình xử lý ngắt được triển khai (Họ phải thăm dò ý kiến ​​gián đoạn).
  3. Trình điều khiển vùng người dùng không thể thực hiện DMA (Do bộ nhớ có khả năng DMA có thể được cấp phát từ không gian hạt nhân).
+1

Bảo mật: quyền truy cập tệp của điều khiển nút thiết bị mà người dùng có thể mở/đọc/ghi vào thiết bị. Thao tác tệp từ chối hoặc cho phép các hoạt động đồng thời. – sawdust

+1

Quyết định có thể phụ thuộc rất nhiều vào những gì bạn đang làm PWM và sử dụng phần cứng nào. –

Trả lời

31

Từ ba yếu tố mà bạn đã liệt kê chỉ là yếu tố đầu tiên thực sự chính xác. Đối với phần còn lại - không thực sự. Có thể cho một mã vùng người dùng để thực hiện các hoạt động DMA - không có vấn đề gì với điều đó. Có rất nhiều công ty thiết bị phần cứng sử dụng kỹ thuật này trong các sản phẩm của họ. Nó cũng có thể có một ứng dụng không gian người dùng được điều khiển gián đoạn, ngay cả khi tất cả các I/O được thực hiện với một vòng bỏ qua toàn nhân. Tất nhiên, nó không phải là dễ dàng chỉ đơn giản là làm một mmap() trên /dev/mem.

Bạn sẽ phải có một phần nhỏ nhất của trình điều khiển trong hạt nhân - cần thiết để cung cấp không gian người dùng của bạn với mức tối thiểu cần thiết từ hạt nhân (vì nếu bạn nghĩ về nó - /dev/mem cũng là được hỗ trợ bởi trình điều khiển thiết bị ký tự).

Đối với DMA, nó thực sự quá dễ darn - tất cả những gì bạn phải làm là xử lý yêu cầu mmap và ánh xạ bộ đệm DMA vào vùng người dùng. Đối với các ngắt - nó phức tạp hơn một chút, ngắt phải được xử lý bởi hạt nhân bất kể cái gì, tuy nhiên, hạt nhân có thể không thực hiện bất kỳ công việc nào và chỉ cần đánh thức quá trình gọi, ví dụ: epoll_wait(). Một cách tiếp cận khác là cung cấp một tín hiệu cho quá trình như được thực hiện bởi DOSEMU, nhưng điều đó rất chậm và không được khuyến khích.

Đối với câu hỏi thực tế của bạn, một yếu tố mà bạn nên xem xét là chia sẻ tài nguyên. Miễn là bạn không phải chia sẻ một thiết bị trên nhiều ứng dụng và không có gì mà bạn không thể thực hiện trong không gian người dùng - hãy chuyển đến không gian người dùng. Bạn có thể sẽ tiết kiệm rất nhiều thời gian trong chu kỳ phát triển khi viết mã không gian người dùng là cực kỳ dễ dàng. Tuy nhiên, khi hai hoặc nhiều ứng dụng cần chia sẻ thiết bị (hoặc tài nguyên của nó) thì rất có thể bạn sẽ dành nhiều thời gian để làm cho nó có thể - chỉ cần tưởng tượng nhiều quy trình forking, crashing, mapping (cùng?) Bộ nhớ đồng thời vv Và sau khi tất cả, IPC thường được thực hiện thông qua hạt nhân, vì vậy nếu ứng dụng sẽ cần phải bắt đầu "nói chuyện" với nhau, hiệu suất có thể làm suy giảm rất nhiều. Tuy nhiên, điều này vẫn được thực hiện trong cuộc sống thực cho một số ứng dụng quan trọng về hiệu suất, nhưng tôi không muốn đi sâu vào các chi tiết đó.

Một yếu tố khác là cơ sở hạ tầng hạt nhân. Giả sử bạn muốn viết trình điều khiển thiết bị mạng. Đó không phải là một vấn đề để làm điều đó trong không gian người dùng. Tuy nhiên, nếu bạn làm điều đó thì bạn sẽ cần phải viết một chồng mạng đầy đủ vì nó sẽ không thể sử dụng một mặc định của Linux sống trong hạt nhân.

Tôi muốn nói về không gian người dùng nếu có thể và nỗ lực làm cho mọi thứ hoạt động ít hơn viết trình điều khiển hạt nhân, và lưu ý rằng một ngày nào đó có thể cần phải di chuyển mã vào hạt nhân . Trong thực tế, đây là một thực tế phổ biến để có cùng một mã được biên dịch cho cả không gian người dùng và không gian hạt nhân tùy thuộc vào việc một số macro được xác định hay không, bởi vì thử nghiệm trong không gian người dùng dễ chịu hơn rất nhiều.

+0

Câu trả lời hay. Tôi đang tìm kiếm thông tin này và câu trả lời của bạn rất hữu ích.! –

+0

Tuy nhiên epoll có một cơ chế nhanh cuối cùng nó là một cấu trúc thăm dò không phải là một trình xử lý ngắt. Nó có thể gây ra vấn đề với các hoạt động thời gian quan trọng. – obayhan

6

Một lưu ý khác: việc gỡ lỗi trình điều khiển không gian người dùng dễ dàng hơn nhiều. Bạn có thể sử dụng gdb, valgrind, vv Heck, bạn thậm chí không cần phải viết trình điều khiển của bạn trong C.

Có một lựa chọn thứ ba ngoài không gian người dùng hoặc trình điều khiển không gian hạt nhân: một số cả hai. Bạn chỉ có thể thực hiện các công cụ không gian hạt nhân trong trình điều khiển nhân và làm mọi thứ khác trong không gian người dùng. Bạn thậm chí có thể không phải viết trình điều khiển không gian hạt nhân nếu bạn sử dụng khung trình điều khiển Linux UIO (xem https://www.kernel.org/doc/html/latest/driver-api/uio-howto.html).

Tôi đã may mắn khi viết trình điều khiển có khả năng DMA gần như hoàn toàn trong không gian người dùng. UIO cung cấp cơ sở hạ tầng để bạn chỉ có thể đọc/chọn/epoll trên một tệp để chờ ngắt.

Bạn nên nhận thức được ý nghĩa bảo mật của việc lập trình mô tả DMA từ không gian người dùng: trừ khi bạn có một số bảo vệ trong thiết bị hoặc IOMMU, trình điều khiển không gian người dùng có thể khiến thiết bị đọc hoặc ghi vào bất kỳ địa chỉ nào trong bộ nhớ vật lý.