Mengalokasikan lebih dari 4 MB memori bersebelahan yang disematkan di Kernel Linux

Untuk beberapa interaksi dengan perangkat PCI yang sedang dibuat, kami ingin membuat potongan memori berukuran besar yang dapat diakses oleh board. Saat ini, bagian memori terbesar yang dapat saya alokasikan berukuran 4 megabita. Saya ingin tahu apakah ada metode untuk membuat wilayah yang lebih luas.

Saya tahu bahwa saya dapat menggunakan opsi boot mem= untuk melakukan ini, tetapi karena alasan tertentu, saya lebih suka tidak menggunakan cara ini. Sebaliknya, jika seseorang mengetahui cara untuk melakukan ini, tetapi mendistribusikannya melalui numa node, itu akan baik-baik saja.

Seperti yang saya katakan di awal, saat ini saya dibatasi hingga 4 Megabyte. Alokasi saat ini dilakukan oleh __alloc_pages, yaitu dibatasi oleh MAX_ORDER. MAX_ORDER adalah konstanta waktu kompilasi, dan saya juga khawatir bahwa pengeditannya dapat berdampak pada hal lain.

Terima kasih.


person Bill Lynch    schedule 09.05.2011    source sumber
comment
Apakah segmen memori harus berdekatan secara fisik?   -  person Michael Foukarakis    schedule 18.05.2011
comment
@Michael: Ya. Kalau tidak, saya hanya akan mengalokasikan 4MB dengan __alloc_pages beberapa kali.   -  person Bill Lynch    schedule 18.05.2011


Jawaban (2)


Jika Anda dapat mengkompilasi driver perangkat PCI Anda ke dalam kernel (yaitu, tidak ditautkan sebagai modul), Anda dapat mencoba mengalokasikan memori pada saat boot. Itu akan memungkinkan Anda melewati batas atas alokasi dinamis. Lihat Linux Device Drivers, ed. 3 bab. 8 untuk detailnya.

person Karmastan    schedule 09.05.2011
comment
Ya. Saya juga pernah melihat yang ini sebelumnya. Namun, saya sangat ingin dapat melakukan ini tanpa mengkompilasi ulang kernel. Itu bukanlah sesuatu yang ingin saya pertanggungjawabkan. - person Bill Lynch; 10.05.2011
comment
@sharth: Saya rasa satu-satunya alternatif Anda yang lain adalah meningkat MAX_ORDER. Terserah Anda kompilasi ulang kernel mana yang kurang diinginkan. - person Karmastan; 10.05.2011
comment
Saat ini, rencananya adalah melakukan alokasi dalam jumlah besar menjelang waktu boot. Kemudian, lihat bagian mana yang bersebelahan dan bebaskan kembali sisanya. Saya akan menjadi penggemar berat solusi yang lebih konsisten. - person Bill Lynch; 10.05.2011

CMA(Contiguous Memory Allocator) adalah solusi terbaik untuk kebutuhan Anda IMO. Anda hanya perlu mengirim ke kernel terbaru.

person Lai Jiangshan    schedule 14.07.2012
comment
Saya baru saja mencari beberapa informasi lanjutan mengenai hal ini, dan saya ingin tahu apakah Anda dapat menjelaskannya. Dari apa yang saya lihat, Anda diharuskan melakukan argumen waktu boot untuk menentukan berapa banyak memori yang harus dicadangkan. Jika demikian, ini serupa (tetapi jauh lebih bersih, lebih aman, dan lebih bagus) dengan opsi mem=. Selain itu, dari apa yang saya lihat, ini tidak ada di 3.4.4 atau next-20120713. Apakah sudah dibawa ke jalur utama? - person Bill Lynch; 14.07.2012
comment
@sharth mem= memaksa kernel tidak mengakses memori yang lebih tinggi dan meninggalkan sebagian memori untuk kebutuhan driver, tetapi pengguna perlu melakukan lebih banyak hal untuk mengelola memori yang tersisa sejauh yang saya tahu. Dan memori itu TIDAK dapat digunakan meskipun gratis/dapat digunakan (sama untuk bootmem). Memori CMA dapat digunakan oleh sistem lain (terutama ruang pengguna), dan jika driver memerlukan memori tersebut, manajemen memori akan mengambil kembali memroy CMA untuk driver tersebut. Tidak ada yang terbuang. Dan CMA DIGABUNG ke jalur utama sekarang, di versi 3.5, namun versi terbarunya adalah v3.5-rc6, jadi Anda mungkin perlu menunggu selama 2~3 minggu untuk versi 3.5 atau menggunakan versi -rc - person Lai Jiangshan; 14.07.2012
comment
Kamu benar. Itu ada di 3.5-rc6. Dan saya sangat setuju bahwa CMA tampaknya merupakan antarmuka yang jauh lebih bagus daripada mem= yang tidak masuk akal. Dan kemampuan untuk menggunakan bagian yang tidak digunakan untuk caching adalah bonus yang bagus. Terima kasih telah memberi tahu saya tentang hal ini! - person Bill Lynch; 15.07.2012
comment
@sharth: beri tahu saya (atau ubah jawaban yang Anda terima) jika Anda akhirnya menggunakan CMA. - person Lai Jiangshan; 17.07.2012