MMIO là gì?
Quicknote MMIO là gì?
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?
Device có BAR
BAR cho biết device cần vùng register.
Firmware allocate MMIO
Ghi base address vào BAR.
CPU access address
Read/write memory address đó.
Device decode transaction
Transaction tới register nội bộ của device.
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
- PCI Architecture Overview
- PCI Configuration Space là gì?
- BDF trong PCIe là gì?
- BAR trong PCIe là gì?
- PCI Resource Allocation là gì?
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.