MMIO là gì?

Quicknote MMIO là gì?

2 phút đọc
Đọc bằng Tiếng Việt English 日本語
PCI / ACPI / SMBIOS Terms cover

MMIO nghĩa là Memory-Mapped I/O: CPU access register của thiết bị bằng lệnh đọc/ghi memory address, thay vì dùng I/O port riêng. Trong PCIe, BAR thường được firmware assign thành một vùng MMIO.

Nói đơn giản: driver không “gọi hàm” của thiết bị. Driver đọc/ghi register nằm tại một địa chỉ memory đã được map.

BAR0 = 0xFEBC0000
Register Offset = 0x10
=> Register Address = 0xFEBC0010

MMIO nằm ở đâu trong flow PCIe?

01 PCI

Device có BAR

BAR cho biết device cần vùng register.

02 FW

Firmware allocate MMIO

Ghi base address vào BAR.

03 CPU

CPU access address

Read/write memory address đó.

04 Device

Device decode transaction

Transaction tới register nội bộ của device.

MMIO là kết quả sau khi BAR được allocate.

Ví dụ code

#define REG_STATUS  0x04
#define REG_CONTROL 0x08

UINTN Bar0 = PciIoBar0Base;
UINT32 Status = MmioRead32 (Bar0 + REG_STATUS);
MmioWrite32 (Bar0 + REG_CONTROL, 0x1);

Trong EDK2, driver PCI thường không hard-code physical address. Nó lấy thông tin qua EFI_PCI_IO_PROTOCOL rồi dùng service Mem.Read() / Mem.Write() hoặc map resource phù hợp.

MMIO khác I/O port thế nào?

Mục Giá trị Ghi chú
MMIO Memory address space Phổ biến với PCIe hiện đại.
I/O Port I/O address space Legacy hơn, dùng instruction IN/OUT trên x86.
BAR Có thể là MMIO hoặc I/O BAR type bit cho biết loại resource.

Debug diary: đọc MMIO toàn 0xFFFFFFFF

Nếu driver đọc register ra toàn 0xFFFFFFFF, có vài khả năng:

Checklist MMIO read lỗi

Bài liên quan

Nguồn tham khảo public

Thấy nội dung này hữu ích?

Lưu lại hoặc chia sẻ cho người cũng đang học firmware, BIOS/UEFI và embedded systems.

Nội dung liên quan

Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.