Thông báo

Collapse
No announcement yet.

Cấp phát vùng nhớ liên tục?

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Cấp phát vùng nhớ liên tục?

    Chào các bro!
    Trong C chuẩn có hàm kmalloc() dùng để cấp phát vùng nhớ liên tục, thế nhưng nó chỉ cấp phát maximum là 128k thôi.
    Không biết trong C chuẩn có hàm nào dùng để cấp phát vùng nhớ liên tục lớn hơn 128k không vậy?
    Bro nào biết giúp mình với nhé!

  • #2
    Hàm kmalloc() có mỗi ưu điểm là cấp phát vùng nhớ vật lý liên tục (dùng làm DMA chẳng hạn). Nếu bạn chỉ cần một vùng nhớ bình thường liên tục (vùng nhớ ảo, quản lý bởi nhân Linux; 99,9% khả năng phần mềm của bạn có nhu cầu thế này) thì dùng vmalloc() thoải mái hơn nhiều: dung lượng lớn, linh hoạt. Hàm kmalloc() chỉ cần dùng cho một số rất ít nhu cầu đặc biệt.
    Phần mềm tự do hoặc không dùng máy tính nữa !.

    Comment


    • #3
      Bạn nói chính xác rồi. Mình cần một vùng nhớ liên tục lớn hơn 128k cho mục đích DMA. với hàm vmalloc() thì chỉ cấp phát vùng nhớ bình thường thôi. Do đó tốc độ DMA của nó chậm hơn rất nhiều so với vùng nhớ dùng cho mục đích DMA. Bạn có ý kiến nào khác không vậy?

      Comment


      • #4
        Đây là giới hạn của nhân Linux rồi. Thêm nữa, chỉ có hàm kmalloc() mới có cờ __GFP_DMA đảm bảo chính xác rằng vùng nhớ đó dùng làm DMA được. Các hàm khác không thể chắc chắn được điều này. Có vài kỹ thuật để cấp phát vùng nhớ vật lý liên tục dung lượng lớn, nhưng không đảm bảo vùng đó dùng làm DMA được.

        Bạn cần thích nghi với giới hạn của hàm kmalloc() thôi.
        Phần mềm tự do hoặc không dùng máy tính nữa !.

        Comment


        • #5
          Nguyên văn bởi bqviet Xem bài viết
          Đây là giới hạn của nhân Linux rồi. Thêm nữa, chỉ có hàm kmalloc() mới có cờ __GFP_DMA đảm bảo chính xác rằng vùng nhớ đó dùng làm DMA được. Các hàm khác không thể chắc chắn được điều này. Có vài kỹ thuật để cấp phát vùng nhớ vật lý liên tục dung lượng lớn, nhưng không đảm bảo vùng đó dùng làm DMA được.

          Bạn cần thích nghi với giới hạn của hàm kmalloc() thôi.
          Tại vì mình đã thử cấp phát 4 vùng nhớ DMA (Không liên tục), mỗi vùng 128kB, chương trình chạy OK, như vậy thì ta cũng có thể có cách nào đó để cấp phát 256kB (hay lớn hơn một tí nữa) liên tục chứ bạn (theo mình nghĩ là như vậy) .
          Ngoài hàm kmalloc() có cờ __GFP_DMA thì cũng có một số hàm khác có cờ này đó bạn: kcalloc(), get_dma_pages().
          Last edited by dinhtandl; 04-06-2010, 08:36.

          Comment

          Về tác giả

          Collapse

          dinhtandl Tìm hiểu thêm về dinhtandl

          Bài viết mới nhất

          Collapse

          Đang tải...
          X