Giả sử chúng tôi muốn duy trì một bộ nhớ trong trình điều khiển thiết bị hoặc mô-đun. Làm thế nào mà hồ bơi đó có thể được tạo ra và có sẵn cho nhiều quy trình cho phép nói 4 quy trình, truy cập vào trình điều khiển/mô-đun này.Bộ nhớ trong Trình điều khiển hạt nhân cho nhiều quy trình
Giả sử 1 MB bộ nhớ trong hồ bơi.
Khi tôi đọc LDD, tôi đã xem qua mempool_create của api() nhưng sau đó cũng có kmalloc.
Nếu ai đó đã làm điều như vậy vui lòng chia sẻ kiến thức.
Cách tiếp cận ban đầu của tôi là phân bổ bằng cách sử dụng kmalloc() và sau đó duy trì con trỏ bắt đầu và kết thúc trong đối tượng riêng tư cho mỗi quá trình mở mô-đun.
EDIT: Cảm ơn @kikigood vì đã dành chút thời gian cho việc này. Vì vậy, dựa trên ý kiến của bạn, tôi làm một cái gì đó như thế này.
Cho phép nói rằng tôi đã phân bổ 1MB mempool trong init. Và tôi muốn hạn chế số lượng quy trình thành 4, vì vậy tôi giữ một số lượng. Tăng số lượng này tại mỗi
atomic_t count =0;
open()
{
if(count >4)
return -ENOMEM;
count++;
}
Tôi cũng duy trì bộ đệm trong cấu trúc thiết bị cá nhân của mình cho mỗi quy trình.
Cách chỉ định một số bộ nhớ từ bộ đệm cho bộ đệm này.
Làm cách nào để quản lý việc phân phối bộ nhớ giữa các quá trình bằng mempool_create() hoặc kmem_cache_create(). API của tôi có thể sử dụng trong init() của mô-đun ... những gì cần sử dụng trong mở() cho mỗi quy trình. – RootPhoenix
Bạn có thể làm kmem_cache_create() trong mô đun init và chuyển giá trị trả về (handle) của nó đến phương thức mở.giống như đoạn mã sau: int scull_open (struct inode * inode, struct file * filp) {filp-> private_data = dev;/* cho các phương thức khác * /}. vì vậy bạn có thể chỉ cần lưu trữ các xử lý vào cấu trúc dev của bạn. – kikigood
nhưng nếu bạn hỏi cách thực hiện phương pháp của trình điều khiển thiết bị trong khi xử lý các trường hợp mà nhiều quá trình có thể truy cập cùng một thiết bị hoặc các thiết bị ảo khác nhau thì đó là một thứ khác không liên quan đến cách sử dụng bộ nhớ. – kikigood