Foundationপ্রথম নীতি থেকে
LEVEL 3 · CPU Architecture

DMA

ডিএমএ

Direct Memory Access — একটা dedicated hardware controller যে device ও memory-র মধ্যে সরাসরি ডেটা সরায়, CPU-র প্রতিটা byte কপি করার প্রয়োজন ছাড়াই; কাজ শেষে একটা interrupt দিয়ে CPU-কে জানায়।

also: direct memory access, DMA controller, programmed I/O, bus mastering, memory-mapped I/O, port-mapped I/O

Programmed I/O-তে CPU নিজে প্রতিটা byte device থেকে পড়ে memory-তে লেখে — একটা ১০০ মেগাবাইট transfer-এ কোটি কোটি loop iteration, পুরো সময়টায় CPU অন্য কিছু করতেই পারে না। DMA controller-কে শুধু উৎস, গন্তব্য, ও দৈর্ঘ্য দিয়ে প্রোগ্রাম করে দিলে CPU সম্পূর্ণ মুক্ত — controller স্বাধীনভাবে ব্যাকগ্রাউন্ডে ডেটা সরায়, কাজ শেষে একটা [[interrupt]] তুলে জানায়।

Device register access-এর দুই দর্শন: memory-mapped I/O (MMIO) device register-কে সাধারণ memory address-এর মতো ট্রিট করে (সাধারণ LOAD/STORE কাজ করে) — ARM64/RISC-V-এর একমাত্র উপায়। Port-mapped I/O (PMIO) একটা আলাদা address space, বিশেষ instruction লাগে (x86-এর IN/OUT) — x86-এর একটা legacy সিদ্ধান্ত, CISC backward-compatibility দর্শনের প্রতিফলন।

দুইটা লুকানো ফাঁদ: (১) MMIO register পড়া/লেখায় side effect থাকতে পারে (read-to-clear semantics) — compiler-কে volatile দিয়ে না জানালে সে read/write নীরবে optimize করে বাদ দিতে পারে। (২) DMA controller memory-তে সরাসরি লেখে, CPU cache-কে পাশ কাটিয়ে — non-coherent সিস্টেমে driver-কে ম্যানুয়ালি cache flush (write আগে) বা invalidate (write পরে) করতে হয়, নাহলে stale ডেটা পড়ার ঝুঁকি।

Modern NVMe/NIC-এ interrupt coalescing — একাধিক transfer জমিয়ে একটা মাত্র interrupt — উচ্চ-throughput-এ interrupt storm এড়াতে।