10

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.

Trả lời

4

Để tạo ra một hồ bơi bộ nhớ, Bạn cần sử dụng

  1. hạt nhân của phiến cấp phát

    hoặc

  2. bạn duy trì các hồ bơi bộ nhớ bằng cách tự như những gì bạn đã làm (kmalloc)

Bằng cách sử dụng bảng phân bổ bản của hạt nhân, bạn có thể sử dụng:

  1. kmem_cache_create()/kmem_cache_create().

hoặc

  1. mempool_create()

Tôi nghĩ vấn đề quan trọng để bạn có thể duy trì một hồ bơi một mình là một nguy cơ tạo ra vấn đề phân mảnh bộ nhớ sẽ nhanh chóng hết bộ nhớ của bạn hoặc bạn không thể cấp phát một khối bộ nhớ lớn ngay cả khi có nhiều bộ nhớ trống.

Một lợi ích khác khi sử dụng bảng phân bổ bản đệm của hạt nhân là bạn có thể dễ dàng theo dõi mức sử dụng bộ nhớ bằng cách xem các mục/proc/slab của bạn.

+0

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

+0

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

+0

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

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