7

Tôi đang viết mô-đun hạt nhân được gọi bằng quy trình p1 để ghi đè lên trang dữ liệu thuộc về quá trình đích p2.mô-đun hạt nhân, trong khi được gọi từ một quy trình, ghi vào một trang từ một quy trình khác

Đầu tiên, bên trong mô-đun hạt nhân và trong khi trả lời sự kiện ghi vào hệ thống tệp proc được phát hành bởi p1. Tôi đã sử dụng id quá trình của quá trình đích (p2) để tìm kiếm cấu trúc nhiệm vụ của sau (p2_task).

Để tìm kiếm trang cụ thể tôi đã sử dụng get_user_pages(), rõ ràng đang gọi nó trên (p2_task->mm). Sau đó tôi được gọi là kmap() trên trang được trả về bởi hàm trước đó. Khi tôi nhận được con trỏ, tôi đã sử dụng các chức năng bộ nhớ điển hình (memset()) để ghi vào bộ nhớ đó. Cuối cùng được gọi là kunmap().

Tuy nhiên, khi quá trình bắt đầu chạy lại, tôi có thể thấy rằng những gì tôi đã làm không ảnh hưởng đến quá trình nhắm mục tiêu p2.

Tôi không chắc mình đã làm gì sai. Có ai giúp được không?

Tôi nghi ngờ rằng bằng cách nào đó bạn không thể ghi vào bộ nhớ thuộc về quá trình p2 trong khi trả lời yêu cầu đến từ p2. Vì ở đây chúng ta đang ở trong một ngữ cảnh khác.

Điều này có đúng không, nếu không phải những gì tôi có thể kiểm tra. Nếu nó là vấn đề, có cách nào tôi có thể vượt qua điều đó không?

+1

hiểu biết của tôi rằng 'kmap()' trả về một địa chỉ ảo (trong mem thấp) cho một trang vật lý. Đó là nếu trang vật lý đã có địa chỉ ảo không gian hạt nhân 'kmap()' trả về nó. Nếu không, nó sẽ remaps cùng một trang vật lý tới địa chỉ ảo không gian hạt nhân và sau đó trả về địa chỉ ảo mới này. Vì vậy, không cần trang vật lý mới. Cũng lưu ý rằng địa chỉ ảo mới được tạo trong không gian hạt nhân không nằm trong p2. – hebbo

+0

mọi thứ được thực hiện từ bên trong không gian hạt nhân. – hebbo

+0

Xin lỗi, tôi nghĩ bạn muốn p1 ghi đè lên p2. Tôi thấy bây giờ, bạn chỉ đề cập đến p1 để nói nó được gọi từ ngữ cảnh người dùng khác. Xem http://makelinux.net/ldd3/chp-15-sect-3, đang thực hiện những gì bạn đã nêu ở trên. Sự khác biệt duy nhất tôi thấy là lấy/giải phóng mmap_sem và gọi SetPageDirty(). –

Trả lời

0

Nghe giống như vấn đề TLB với tôi, theo đó p2 có địa chỉ ảo của dữ liệu được lưu trong phần cứng. Trước đây p2 có đọc/ghi trang trong không gian địa chỉ của nó trước khi p1 thay đổi giá trị không?

Hãy thử cách gọi này trong p1 sau khi bạn thay đổi giá trị: flush_tlb_page(struct vm_area_struct * vma, unsigned long address)