Apa yang Anda minta disebut DMA. Anda perlu menulis driver untuk memesan memori ini.
Ya, saya sadar Anda mengatakan Anda tidak ingin OS untuk campur tangan, dan driver menjadi bagian dari OS, tetapi tanpa adanya reservasi pengemudi, kernel percaya semua memori miliknya. (Kecuali Anda memberi tahu kernel untuk mengabaikan blok memori, per jawaban Harun, yaitu.)
Bab 15 (PDF) " Linux Device Drivers, 3 / e " oleh Rubini, Corbet dan Kroah-Hartmann membahas DMA dan topik terkait.
Jika Anda menginginkan versi HTML ini, saya menemukan versi edisi kedua dari bab ini di tempat lain secara online. Berhati-hatilah karena edisi ke-2 sudah lebih dari satu dekade sekarang, telah keluar ketika kernel 2.4 masih baru. Sudah banyak pekerjaan pada subsistem manajemen memori kernel sejak saat itu, jadi mungkin tidak berlaku dengan baik lagi.
Jika Anda ingin OS untuk benar-benar mengabaikannya, Anda perlu membuat lubang memori menggunakan
memmap
"" Lihat referensi ini . Sebagai contoh, jika Anda menginginkan 512M pada penghalang 2GB, Anda dapat menempatkan "memmap=512M$2G
" pada baris perintah kernel Anda.Anda perlu memeriksa apakah
dmesg
ada lubang yang berdekatan untuk dicuri sehingga Anda tidak menginjak perangkat apa pun; itu khusus untuk motherboard + kartu Anda.Ini bukan cara yang disarankan untuk melakukan sesuatu - lihat jawaban Warren Young untuk bagaimana melakukannya dengan benar (driver kernel + DMA). Saya menjawab pertanyaan persis yang Anda tanyakan. Jika Anda berencana membuat ini untuk pengguna akhir, mereka akan membenci Anda jika Anda melakukan ini kepada mereka ... percayalah, itulah satu-satunya alasan saya tahu jawaban ini.
Sunting: Jika Anda menggunakan grub2 w / grubby (mis. CentOS 7), Anda harus memastikan untuk melepaskan $ . Harus ada satu
\
sebelumnya$
. Contoh:sumber
uint8_t *ptr = 0x8000000
" dengan contoh saya? Atau itu mungkin segfault ... Hah, aku benar-benar tidak tahu. Sekali lagi, saya tahu jawabannya karena saya adalah pengguna akhir kartu PCI yang dirancang buruk di mana saya harus secara manual mengalokasikan buffer di bawah tanda 4G dan kemudian memberi tahu pengemudi di mana ruang itu; itu tidak mungkin dari userland.MMAP_FIXED | MMAP_ANON
. Tanpa perangkat DMA khusus untuk dimainkan, saya tidak bisa mengatakan apakah itu benar-benar melakukan apa yang diinginkan OP, tetapi kotak CentOS saya dengan senang hati memberi saya blok 8 MB pada 512 MB ketika saya mengatakanmemmap=8M$512M
di GRUB. Bahkan tidak memerlukan akses root, seperti yang saya khawatirkan mungkin. Tetapi bahkan jika ini memang melakukan hal yang benar, saya masih berpikir Anda mungkin akan memerlukan driver untuk menangani interupsi dan semacamnya.mmap()
halaman akan di-zeroed sebelum kode userland melihatnya. Ini dilakukan untuk keamanan, sehingga data tidak bocor dari satu proses ke proses berikutnya. Alasan lain untuk menggunakan driver, karena Anda mungkin perlu menyimpan konten buffer DMA pada waktu buka driver. Oh dan omong-omong,mmap()
panggilan yang ditemukan secara arbitrer berhasil bahkan tanpamemmap
opsi boot kernel, setidaknya selama tidak ada yang sudah menggunakan memori yang terletak di mana Anda bertanya. Opsi booting tentu saja meningkatkan peluang keberhasilan, tetapi itu tidak sepenuhnya diperlukan.Untuk memesan blok memori dari kernel di Linux berbasis ARM, Anda juga dapat menggunakan
reserved-memory
simpul di file tree perangkat Anda (dts). Dalam dokumentasi kernel (lihat di sini ), ada contoh:sumber
Pertama-tama masukkan perintah ini, untuk memeriksa pengaturan Anda saat ini:
Untuk mengubah nilai yang ditetapkan, edit
/etc/sysctl.conf
. Cari garis:Jika tidak ada, buat (bersama dengan nilai yang Anda inginkan). Nilai-nilai berikut dapat diterima:
8M sangat konservatif; itu bisa duduk di 16M dengan nyaman. Setelah Anda mengubah nilainya, jalankan ini dan tidak perlu reboot:
sumber