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.

Cập nhật 6 phút đọc
Đọc bằng Tiếng Việt English 日本語
BIOS Terms cover

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?”.

01 PEI → DXE

DXE Core khởi động

Đọc HOB list, khởi tạo memory map, dựng Boot Services và Runtime Services.

02 Dispatch

DXE Dispatcher chạy driver

Scan FV, kiểm tra DEPEX, gọi entry point theo đúng thứ tự dependency.

03 Protocol

Handle database hình thành

Driver install protocol, enumerate thiết bị, publish abstraction layer.

04 → BDS

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 driver

gBSgRT 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ể:

  1. DXE Dispatcher chạy hết các driver có thể dispatch
  2. DXE Core gọi BDS Architectural Protocol (EFI_BDS_ARCH_PROTOCOL)
  3. 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()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.

gBSgRT 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

Nguồn tham khảo public

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.

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

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