SEC là gì trong UEFI?

SEC là phase đầu tiên của UEFI PI firmware, chạy ngay sau CPU reset. SEC thiết lập Cache-As-RAM, load microcode và bàn giao quyền điều khiển cho PEI Core.

Cập nhật 7 phút đọc
BIOS Terms cover

SEC (Security) là phase đầu tiên của PI firmware, chạy ngay sau khi CPU thoát khỏi reset vector. Ở thời điểm này, DRAM chưa sẵn sàng, stack thông thường chưa có, và gần như không có service nào để dùng. SEC phải tự tạo ra điều kiện tối thiểu để PEI Core có thể bắt đầu chạy.

Bài này lấy góc nhìn phổ biến trên x86/EDK II, nơi SEC thường liên quan đến reset vector, microcode update và Cache-As-RAM. Trên architecture khác, chi tiết implementation có thể khác, nhưng vai trò tổng quát của SEC vẫn là tạo môi trường tối thiểu để vào PEI.

Nếu PEI là giai đoạn làm cho platform đủ sống, thì SEC là giai đoạn làm cho CPU đủ tỉnh để PEI có thể bắt đầu.

01 Reset Vector

CPU bắt đầu

CPU nhảy tới địa chỉ reset vector trong flash, thường là 0xFFFFFFF0 trên x86.

02 Early CPU Init

Microcode + cache

Load microcode update, tắt cache cũ, chuẩn bị điều kiện để dựng CAR.

03 CAR Setup

Cache-As-RAM

Dùng CPU cache như RAM tạm. Từ đây mới có stack và global data cơ bản.

04 PEI Handoff

Gọi PEI Core

Truyền thông tin tối thiểu (top of CAR, firmware volume) sang PEI Core entry point.

SEC làm những việc gì?

SEC có nhiệm vụ rất giới hạn - chỉ những gì cần thiết để PEI Core có thể chạy được.

Mục Giá trị Ghi chú
Reset vector Điểm bắt đầu của mọi thứ CPU x86 nhảy đến 0xFFFFFFF0 sau reset. Đây thường là một jump instruction trỏ vào SEC code trong flash.
Microcode update Patch CPU trước khi làm gì khác Microcode update cần load sớm nhất có thể để CPU hoạt động đúng. Lỗi microcode ở đây ảnh hưởng toàn bộ sau đó.
Cache-As-RAM (CAR) RAM tạm khi DRAM chưa sẵn sàng CPU cache được cấu hình để hoạt động như RAM. Đây là stack và vùng data duy nhất SEC có.
Early CPU init MSR, cache policy, cấu hình cơ bản Những gì cần thiết để CPU chạy ổn định trước khi PEI tiếp quản và làm thêm.
Firmware volume discovery Tìm PEI firmware volume trong flash SEC cần biết PEI Core nằm ở đâu trong flash để handoff đúng.
Handoff sang PEI Truyền thông tin tối thiểu cho PEI Core Top of CAR, boot mode sơ bộ, firmware volume pointer - đủ để PEI Core bắt đầu.

Cache-As-RAM là gì và tại sao cần?

Đây là điểm người mới hay bỏ qua nhất khi đọc về SEC.

Ngay sau reset, DRAM chưa được khởi tạo - không có RAM nào để dùng. Nhưng để chạy code C cơ bản, CPU cần ít nhất một stack. Giải pháp là dùng CPU cache như RAM tạm: cấu hình một vùng cache theo địa chỉ cụ thể để nó không evict ra DRAM - vì DRAM chưa tồn tại.

Kỹ thuật này gọi là Cache-As-RAM (CAR), hay còn gọi là No-Eviction Mode trên một số kiến trúc Intel.

Sau khi CAR được thiết lập:
  ┌──────────────────────────────┐
  │   CPU Cache (vd: 256KB)      │
  │   → hoạt động như RAM tạm    │
  │   → có stack, có local vars  │
  │   → KHÔNG có global heap     │
  │   → KHÔNG thể allocate tùy ý │
  └──────────────────────────────┘
  DRAM: chưa khởi tạo, không dùng được

SEC và đầu PEI đều chạy trong môi trường này. Khi PEI khởi tạo xong DRAM, firmware thực hiện memory migration - copy stack và data từ CAR sang DRAM thật, rồi tắt CAR.

Tại sao SEC viết bằng assembly hoặc C rất hạn chế?

Trước khi CAR được thiết lập, không có stack. Không có stack nghĩa là:

  • Không thể call function thông thường (return address lưu ở đâu?)
  • Không có local variable
  • Không có global data khởi tạo

Vì vậy phần code đầu tiên của SEC - trước khi CAR sẵn sàng - thường viết bằng assembly. Sau khi CAR thiết lập xong, mới có thể gọi C function, nhưng vẫn phải rất cẩn thận về kích thước stack và global data.

Đây là lý do khi đọc EDK II source, bạn sẽ thấy các file .nasm hoặc .asm trong SEC module trước khi vào C entry point.

Một hệ quả thực tế: giai đoạn này gần như không có cách debug thông thường. Không có serial output, không có JTAG debugger hỗ trợ đầy đủ ở thời điểm này, không có log. Nếu code bị sai, thường chỉ có thể quan sát qua POST code hoặc oscilloscope. Khi làm việc trong .nasm SEC, cách duy nhất để biết trạng thái là đọc trực tiếp các thanh ghi như al, bh, eax, ebx - không có variable watch, không có call stack, không có breakpoint có ý nghĩa.

SEC handoff sang PEI như thế nào?

Khi SEC hoàn tất, nó gọi PEI Core entry point và truyền vào một struct SecCoreData chứa:

// EFI_SEC_PEI_HAND_OFF - định nghĩa trong MdePkg/Include/Pi/PiPei.h
typedef struct _EFI_SEC_PEI_HAND_OFF {
  UINT16    DataSize;                   // size của struct này
  VOID      *BootFirmwareVolumeBase;    // base của firmware volume chứa PEI Core
  UINTN     BootFirmwareVolumeSize;
  VOID      *TemporaryRamBase;          // base của toàn bộ vùng CAR
  UINTN     TemporaryRamSize;
  VOID      *PeiTemporaryRamBase;       // phần CAR dành riêng cho PEI heap
  UINTN     PeiTemporaryRamSize;
  VOID      *StackBase;                 // stack trong CAR
  UINTN     StackSize;
} EFI_SEC_PEI_HAND_OFF;

PEI Core dùng thông tin này để biết mình đang có bao nhiêu RAM tạm, stack ở đâu, và firmware volume nằm ở đâu để tìm PEIM tiếp theo.

Khi nào cần quan tâm đến SEC?

Nếu bạn viết DXE driver hay PEIM thông thường, bạn hầu như không cần đụng tới SEC. SEC là lớp rất thấp, thường do silicon vendor hoặc platform owner viết và ít khi thay đổi.

Bạn cần quan tâm đến SEC khi:

  • Debug board chết rất sớm, chưa có POST code hay serial log
  • Thay đổi CPU hoặc platform yêu cầu update microcode path
  • Gặp lỗi liên quan CAR setup - reset loop không rõ nguyên nhân ở giai đoạn cực sớm
  • Port firmware sang platform mới và cần hiểu early boot sequence

Dấu hiệu lỗi có thể nằm ở SEC

Lỗi hiểu nhầm hay gặp

SEC không khởi tạo DRAM. SEC chỉ dựng CAR - RAM tạm từ CPU cache. DRAM thật được khởi tạo bởi memory init PEIM trong PEI phase.

SEC không chạy C runtime thông thường. Trước khi CAR sẵn sàng, không có stack, không có local variable, không có global data. Code SEC đầu tiên thường là assembly.

Reset vector không phải là BIOS entry point theo nghĩa thông thường. 0xFFFFFFF0 chỉ là 16 byte trước top of 4GB address space - thường chỉ đủ cho một jump instruction. Code thật của SEC nằm ở nơi khác trong flash.

Tên “Security” không có nghĩa SEC xử lý security policy. Trong PI spec, “Security” ở đây là về việc đảm bảo firmware chạy trong môi trường đáng tin cậy trước khi thực thi bất kỳ code nào khác - không phải cryptographic security hay access control.

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.