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.
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
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. –