2010-11-09 35 views
5

Theo thiết kế linux trên x86 và ppc, không gian địa chỉ ảo 4g được chia thành 3: 1. Địa chỉ ảo của người dùng đến 3g.Tại sao yêu cầu copy_to/from_user?

Bây giờ nếu ứng dụng người dùng thực hiện một ioctl chuyển con trỏ tới bộ đệm, mô-đun hạt nhân, có thể trực tiếp thực hiện một memcpy, tôi đã thử và nó hoạt động. => Tại sao chúng ta cần người dùng copy_to/copy_from.

Lưu ý: Nếu trang được hoán đổi, trình xử lý pagefault của hạt nhân sẽ đưa nó trở lại và nó không hiển thị với mô-đun hạt nhân.

cần ý tưởng ... ý tưởng

Trả lời

9

Có một số lý do chính đáng mà copy_to_user/copy_from_user là những chức năng đúng để sử dụng:

  • Trên một số kiến ​​trúc đơn giản memcpy() không không công việc, vì vậy sử dụng những chức năng cho phép mã của bạn để làm việc ở đó. Tôi tin rằng ngay cả x86 với tùy chọn cấu hình HIGHMEM được chọn là trong thuyền này.

  • Các chức năng đó thực hiện kiểm tra access_ok() để đảm bảo rằng địa chỉ của không gian người dùng được tham chiếu thực sự địa chỉ không gian người dùng chính hãng. Nếu bạn chỉ cần thực hiện một memcpy(), người gọi của ioctl() có thể cung cấp một dải địa chỉ chồng chéo địa chỉ hạt nhân, đó là một lỗ hổng bảo mật.

  • Tuy nhiên, lý do chính chính là xử lý đúng địa chỉ người dùng xấu. Nếu bạn chỉ sử dụng một số memcpy(), lỗi không được giải quyết sẽ dẫn đến một hạt nhân. Các chức năng truy cập của người dùng sử dụng "fixup" mechanism, cho phép lỗi được xử lý (đọc hoặc ghi ngắn, và thường là EFAULT được trả về không gian người dùng trong trường hợp này).

+0

ok, vì vậy lý do chính là xử lý địa chỉ ** xấu **. – mSO

+0

và nếu địa chỉ hợp lệ (ví dụ như trường hợp tốt nhất, không ai đang làm bất kỳ nghịch ngợm nào) thì memcpy sẽ hoạt động. – mSO

+0

@Manish: Nó không nhất thiết phải là "nghịch ngợm", nó có thể chỉ là một lỗi cũ đơn giản trong không gian người dùng - các lỗi như vậy nên được xử lý một cách duyên dáng bởi hạt nhân. Và 'memcpy()' sẽ chỉ hoạt động trên một số kiến ​​trúc. – caf

0

Bạn đã may mắn khi nó hoạt động.

Không gian người dùng và không gian hạt nhân hoạt động trong các không gian địa chỉ hoàn toàn khác nhau. Khi bạn copy_to_user, hạt nhân sẽ dịch địa chỉ ảo của không gian người dùng thành địa chỉ vật lý thực và sao chép dữ liệu ở đó. Một quá trình tương tự xảy ra theo cách khác.

Có thể bỏ qua trực tiếp bản sao đến/từ các bước nếu phần cứng của bạn hỗ trợ phân tán/thu thập DMA. Ở đây bạn ánh xạ một đoạn bộ nhớ ảo liền kề vào một loạt các trang vật lý và sau đó sử dụng thông tin đó cho DMA trực tiếp vào không gian người dùng. Tất nhiên điều này có những biến chứng nếu bất kỳ không gian địa chỉ ảo nào hiện không được ánh xạ vào bộ nhớ vật lý (nghĩ rằng trao đổi hoặc tập tin được hỗ trợ mmaps).

+0

chia 3g: 1g nên chú ý đến điều đó. Hạt nhân AFAIK không cần dịch và chuyển thành pa để sao chép. – mSO

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