DXE là gì trong UEFI?
DXE là phase firmware sau PEI, nơi driver được dispatch, protocol được install và Boot Services trở nên đầy đủ. DXE xây dựng môi trường để BDS có thể chọn và khởi động OS.
DXE (Driver Execution Environment) là phase firmware bắt đầu sau khi PEI bàn giao quyền điều khiển qua DXE IPL. Đây là nơi phần lớn firmware “thật sự” xảy ra: driver được load và dispatch, protocol được install lên handle database, thiết bị được enumerate, và Boot Services trở nên đầy đủ để chuẩn bị cho OS loader.
Nếu PEI trả lời “nền tảng đã đủ sống chưa?”, DXE trả lời “thiết bị và abstraction đã sẵn sàng để boot chưa?”.
DXE Core khởi động
Đọc HOB list, khởi tạo memory map, dựng Boot Services và Runtime Services.
DXE Dispatcher chạy driver
Scan FV, kiểm tra DEPEX, gọi entry point theo đúng thứ tự dependency.
Handle database hình thành
Driver install protocol, enumerate thiết bị, publish abstraction layer.
Handoff sang BDS
Khi dispatch xong, BDS Platform nhận quyền điều khiển để chọn boot option.
DXE Core và DXE Driver khác nhau thế nào?
Đây là điểm hay bị nhầm khi đọc tài liệu - “DXE” thực ra gồm hai lớp khác nhau.
DXE Core là firmware chuẩn theo UEFI PI spec, chịu trách nhiệm:
- Đọc HOB list từ PEI để khởi tạo memory map ban đầu
- Khởi tạo Boot Services Table (
gBS) và Runtime Services Table (gRT) - Chạy DXE Dispatcher để load và dispatch DXE driver
- Quản lý handle database và protocol interface
DXE Driver là các module riêng biệt do platform hoặc silicon vendor cung cấp - bus driver, device driver, protocol implementation, platform policy. Mỗi DXE driver chạy trong môi trường DXE Core đã dựng sẵn.
Các loại DXE module
| Mục | Giá trị | Ghi chú |
|---|---|---|
| DXE_DRIVER | Driver thông thường | Chạy một lần khi dispatch. Thường install protocol hoặc enumerate bus. |
| DXE_RUNTIME_DRIVER | Driver có runtime service | Còn hoạt động sau ExitBootServices(). Cần SetVirtualAddressMap() để map lại địa chỉ. |
| UEFI_DRIVER | Driver theo UEFI Driver Model | Implement Driver Binding Protocol với Supported/Start/Stop. Có thể load/unload. |
| UEFI_APPLICATION | EFI application | Chạy từ BDS hoặc Shell. Boot loader, UEFI Shell, diagnostic tool. |
| DXE_SMM_DRIVER | SMM driver | Được load vào SMRAM. Chạy trong SMM context, cách ly với OS. |
DXE dựng những gì khi bắt đầu?
Trước khi dispatch driver đầu tiên, DXE Core phải dựng môi trường từ HOB list PEI để lại:
DXE Core khởi động: 1. Đọc HOB list → xây memory map ban đầu 2. Khởi tạo gBS (Boot Services Table) 3. Khởi tạo gRT (Runtime Services Table) 4. Load các architectural protocol bắt buộc (CPU, Timer, Metronome, BDS, Security...) 5. Gọi DXE Dispatcher → bắt đầu dispatch drivergBS và gRT là hai pointer toàn cục quan trọng nhất trong DXE. Hầu hết code DXE driver đều truy cập service qua gBS->... - khác hẳn với PEI dùng **PeiServices.
Boot Services và Runtime Services
DXE cung cấp hai nhóm service với lifetime khác nhau:
Boot Services (gBS) - chỉ hợp lệ trước ExitBootServices():
- Memory allocation:
AllocatePool,AllocatePages - Protocol:
InstallProtocolInterface,LocateProtocol,OpenProtocol - Event/Timer:
CreateEvent,SetTimer,SignalEvent - Image:
LoadImage,StartImage - Connect/Disconnect controller
Runtime Services (gRT) - còn hợp lệ sau ExitBootServices():
- Variable:
GetVariable,SetVariable - Time:
GetTime,SetTime - Reset:
ResetSystem
DXE kết thúc như thế nào?
DXE không kết thúc đột ngột - nó chuyển sang BDS sau khi dispatch xong. Cụ thể:
- DXE Dispatcher chạy hết các driver có thể dispatch
- DXE Core gọi BDS Architectural Protocol (
EFI_BDS_ARCH_PROTOCOL) - BDS Platform nhận quyền điều khiển để đọc boot option, connect device, load OS loader
Sau đó OS loader gọi ExitBootServices() để kết thúc hoàn toàn boot-time environment.
Khi nào cần quan tâm đến DXE?
DXE là phase bạn làm việc nhiều nhất khi viết firmware - phần lớn driver, protocol, và platform code đều nằm ở đây. Một số trường hợp cụ thể:
- Driver không được dispatch → kiểm tra DSC/FDF/DEPEX
- Driver dispatch rồi nhưng thiết bị không lên → kiểm tra Driver Binding Supported/Start
- Protocol không locate được → kiểm tra handle database
- Boot menu thiếu device → kiểm tra Block I/O / Simple File System được publish chưa
- Lỗi sau ExitBootServices → phân biệt Boot Services vs Runtime Services
Checklist khi debug DXE
Lỗi hiểu nhầm hay gặp
DXE driver chạy không có nghĩa là thiết bị đã sẵn sàng. Entry point thường chỉ install Driver Binding Protocol. Phần thật sự bind vào device xảy ra sau đó qua Supported() và Start().
DEPEX trong DXE và PEI là khác nhau. DXE DEPEX depend vào Protocol đã install, PEI DEPEX depend vào PPI. Dispatcher của hai phase cũng khác nhau - DXE Dispatcher có dispatch loop phức tạp hơn.
gBS và gRT không tương đương. Boot Services biến mất sau ExitBootServices(). Nhầm hai cái này thường dẫn đến lỗi chỉ lộ ra trong OS, không phải trong firmware.
Bài liên quan
- PEI là gì?
- HOB là gì?
- DXE Dispatcher là gì?
- Driver Binding Flow là gì?
- Protocol là gì?
- Handle Database là gì?
- Boot Services là gì?
- UEFI Driver Model là gì?
- BDS là gì?
Nguồn tham khảo public
- UEFI PI Specification 1.9 - Volume 2: DXE Core Interface
- UEFI Specification 2.11 - Boot Services
- EDK II - DxeMain.c
Bài viết này hữu ích với bạn?
Bạn có thể chia sẻ cho người đang học firmware, BIOS/UEFI, embedded systems hoặc ủng hộ tác giả.
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.
Protocol trong UEFI là gì?
Protocol là interface install lên handle trong DXE, cho phép driver giao tiếp không phụ thuộc implementation. Hiểu Protocol giúp debug driver binding và locate fail.
Handle Database trong UEFI là gì?
Handle Database là nơi DXE quản lý quan hệ giữa handle và protocol, giúp debug driver binding, locate fail và boot device chain.
Boot Services là gì?
Boot Services là nhóm API của UEFI chỉ hợp lệ trong boot time. Bao gồm memory, protocol, event, image và controller services - tất cả truy cập qua gBS.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.