PCD trong EDK II là gì?

Quicknote giải thích Platform Configuration Database trong EDK II.

3 phút đọc
Đọc bằng Tiếng Việt English 日本語
EDK II Terms cover

PCDPlatform Configuration Database. Đây là cơ chế để EDK II đưa cấu hình vào module mà không phải hard-code trực tiếp trong source C.

Nếu nhìn thực tế, PCD giống một hệ thống build option/config option có kiểm soát: platform quyết định giá trị, module đọc giá trị đó để đổi hành vi.

Vì sao không hard-code?

Thay vì viết:

#define ENABLE_VERBOSE_LOG 1
#define UART_BAUD_RATE     115200

module có thể dùng PCD:

if (FeaturePcdGet (PcdEnableVerboseLog)) {
  DEBUG ((DEBUG_INFO, "Verbose path enabled\n"));
}

BaudRate = FixedPcdGet32 (PcdUartBaudRate);

Platform A có thể bật log, platform B có thể tắt log mà không sửa source module.

PCD đi qua những file nào?

01 DEC

Khai báo PCD

Token space, name, type, default value, token number.

02 INF

Module reference PCD

Module nói mình dùng PCD này.

03 DSC

Platform set value

Override giá trị theo board/build target.

04 C code

Module đọc PCD

FeaturePcdGet, FixedPcdGet32, PcdGetBool...

PCD thường đi từ DEC tới INF rồi được platform set trong DSC.

Ví dụ hoàn chỉnh

Trong DEC:

[PcdsFeatureFlag]
  gMyPkgTokenSpaceGuid.PcdEnableVerboseLog|FALSE|BOOLEAN|0x00000001

[PcdsFixedAtBuild]
  gMyPkgTokenSpaceGuid.PcdUartBaudRate|115200|UINT32|0x00000002

Trong INF:

[Pcd]
  gMyPkgTokenSpaceGuid.PcdEnableVerboseLog
  gMyPkgTokenSpaceGuid.PcdUartBaudRate

Trong DSC:

[PcdsFeatureFlag]
  gMyPkgTokenSpaceGuid.PcdEnableVerboseLog|TRUE

[PcdsFixedAtBuild]
  gMyPkgTokenSpaceGuid.PcdUartBaudRate|921600

Trong C:

if (FeaturePcdGet (PcdEnableVerboseLog)) {
  DEBUG ((DEBUG_INFO, "UART baud = %u\n", FixedPcdGet32 (PcdUartBaudRate)));
}

Các loại PCD nên nhớ

Mục Giá trị Ghi chú
FeatureFlag Bật/tắt feature Thường dùng với FeaturePcdGet().
FixedAtBuild Giá trị cố định khi build Nhanh, đơn giản, phù hợp config không đổi runtime.
PatchableInModule Có thể patch trong binary Dùng khi cần chỉnh giá trị sau build trong một số flow.
Dynamic Giá trị quản lý động Có thể phụ thuộc PCD database/runtime mechanism.
DynamicEx Dynamic có token space rõ hơn Phù hợp package/platform phức tạp hơn.

PCD và debug thực tế

Một lỗi rất dễ gặp: bạn đổi giá trị trong DEC nhưng hành vi không đổi. Lý do là DSC platform đang override giá trị đó.

Thứ tự cần kiểm tra:

  1. PCD default trong DEC.
  2. PCD được module reference trong INF.
  3. PCD bị override trong DSC nào.
  4. Build target/platform bạn đang build có đúng DSC đó không.
  5. Code dùng đúng macro theo type chưa.

Checklist PCD

Ghi nhớ nhanh

PCD là cách EDK II biến cấu hình platform thành input có kiểm soát cho module. Với người làm BIOS, PCD rất giống build option, nhưng sạch hơn vì có type, token space và flow rõ ràng.

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.