Tôi biết rằng các chức năng copy_to_user
/copy_from_user
, get_user
/put_user
là dành cho mục đích này.Làm thế nào để truy cập bộ nhớ không gian người dùng từ hạt nhân Linux?
Câu hỏi của tôi là, được cung cấp địa chỉ/con trỏ của không gian người dùng, làm cách nào tôi có thể truy cập vào dữ liệu được trỏ tới bởi địa chỉ từ hạt nhân nói chung?
Tôi có thể tưởng tượng rằng trước tiên tôi phải đảm bảo trang chứa phải nằm trong bộ nhớ vật lý (thay vì trong đĩa).
Bước tiếp theo là gì? Tôi có thể sử dụng *p
, trong đó p
là con trỏ trỏ tới dữ liệu không gian người dùng nào đó, trực tiếp để tham chiếu đến dữ liệu không?
Hoặc trước tiên tôi phải gọi kmap
để ánh xạ khung trang vật lý có chứa vào không gian địa chỉ ảo hạt nhân? Tại sao?
Điểm tốt và logic mã là tốt đẹp. Nhưng tôi đoán có một số bảng băm hoặc cấu trúc dữ liệu tương tự, với một địa chỉ ảo, giúp bạn xác định vị trí trang vật lý một cách nhanh chóng. Có một lỗ hổng: kaddr = __va (paddr); Dòng này chỉ hoạt động khi paddr nằm trong bộ nhớ thấp, phải không? – Infinite
paddr có nghĩa là địa chỉ vật lý, vì vậy, luôn luôn tồn tại trong bộ nhớ. kaddr nghĩa là địa chỉ hạt nhân. Trong định nghĩa hạt nhân Linux là '#define __va (x) ((void *) ((unsigned long) (x) + PAGE_OFFSET))'. Ánh xạ bộ nhớ địa chỉ hạt nhân không phức tạp, chỉ là PAGE_OFFSET. (Nên là 0xC0000000 ở chế độ x86). Có cách khác để lấy địa chỉ. Ứng dụng không gian người dùng có thể truy cập địa chỉ hạt nhân bằng/proc//sơ đồ trang để nhận thông tin trang. Nếu có thể nhận được PFN, nó cũng có thể lấy địa chỉ hạt nhân. –
richliu