Đối tượng: Hướng dẫn này dành cho các quản lý chương trình OEM, kiến trúc sư firmware và kỹ sư tuân thủ cần hiểu chính xác chuỗi sự kiện từ khi silicon khởi động đến âm thanh đầu tiên trên bút đọc. Nó bao gồm bootloader mask-ROM, bootloader giai đoạn hai, xác minh hình ảnh đã ký, chuyển đổi phân vùng A/B và các đường khôi phục mà chúng tôi cung cấp trên 11 SKU tự sản xuất (B1, B2, F8, K7, KF1, L5, P2, Q6, Q8, T2, Y6).
Quá trình khởi động của một bút đọc không phải là một sự kiện duy nhất. Đó là một pipeline 5–7 giai đoạn chạy trong khoảng 280–1.450 mili giây tùy thuộc vào SKU. Mỗi giai đoạn đều có một nhiệm vụ: tải mã, xác minh chữ ký, chuyển giao quyền điều khiển. Nếu bất kỳ giai đoạn nào thất bại, giai đoạn tiếp theo sẽ không chạy và bút đọc sẽ khởi động lại, chuyển về hình ảnh khôi phục hoặc bị brick.
Bài viết này sẽ dẫn bạn qua pipeline đó, từng bước một, với các thời gian đo được trên từng SKU trong số 11 SKU. Chúng tôi sẽ cho bạn thấy bố cục phân vùng A/B, bộ đếm rollback, luồng phân vùng OTA và các đường xử lý lỗi mà chúng tôi vận hành tại hai nhà máy. Đến cuối bài, bạn sẽ có thể đọc ghi chú phát hành firmware của chúng tôi và biết chính xác điều gì thay đổi khi phiên bản được nâng từ 2.4.7 lên 2.5.0.
1. Tại sao "BIOS" là từ sai nhưng ý đúng
Một bút đọc không có BIOS theo nghĩa PC. Nó có một bootloader mask-ROM — vài kilobyte mã bất biến được ghi vào silicon tại thời điểm sản xuất wafer. Mã ROM này là gốc tin cậy: không có phần mềm nào bên dưới và không có cách nào ghi đè nó.
Gọi nó là BIOS vẫn hữu ích vì kiến trúc này ánh xạ trực tiếp sang các khái niệm UEFI: ROM = pha SEC, bootloader giai đoạn hai = PEI, firmware = DXE, ứng dụng = BDS. Các nhà cung cấp, bao gồm chúng tôi, thường dùng BIOS một cách linh hoạt trong các cuộc hội thoại B2B vì người mua OEM hiểu rõ điều đó.
Chuỗi khởi động tin cậy là pipeline xác minh chạy trên ROM này. Nhiệm vụ của nó là đảm bảo rằng mọi đoạn mã được thực thi sau ROM đều được ký bằng khóa riêng của OEM. Nếu chữ ký sai, chuỗi sẽ dừng lại.
2. Pipeline khởi động 7 giai đoạn
Mọi SKU bút đọc đều triển khai cùng bảy giai đoạn logic. Việc triển khai khác nhau về bố cục flash và thời gian.
| Giai đoạn | Thành phần | Chạy từ | Xác minh | Độ trễ điển hình |
|---|---|---|---|---|
| S1 | Bootloader mask ROM | ROM | Khóa nhà cung cấp (mã cứng) | 6–14 ms |
| S2 | Bootloader giai đoạn 1 (SBL) | Phân vùng khởi động NOR/eMMC | OEM RSA-2048 / ECDSA P-256 | 60–220 ms |
| S3 | Bootloader giai đoạn 2 (nếu có) | Phân vùng khởi động NOR/eMMC | OEM RSA-2048 / ECDSA P-256 | 40–160 ms |
| S4 | Hình ảnh firmware (RTOS hoặc Linux kernel) | Phân vùng chính NOR/eMMC | OEM RSA-2048 / ECDSA P-256 | 80–320 ms |
| S5 | Phân vùng TrustZone / TEE | Lưu trữ bảo mật TrustZone | Chữ ký SE | 30–120 ms |
| S6 | Ứng dụng + tài nguyên âm thanh | Phân vùng chính | Giải mã AES-128 / AES-256 | 50–280 ms |
| S7 | Trình điều khiển âm thanh + mẫu đầu tiên | DAC | không áp dụng | 14–60 ms |
Tổng thời gian khởi động lạnh đến âm thanh đầu tiên nằm trong khoảng từ 280 ms (B2) đến 1.450 ms (L5). Sự khác biệt gần như hoàn toàn nằm ở S4 và S6 — các SKU dựa trên Linux cần nhiều thời gian hơn để mount rootfs và khởi tạo ALSA.
3. Thời gian khởi động theo từng SKU
| SKU | S1 ROM | S2 SBL | S3 Giai đoạn 2 | S4 FW | S5 TEE | S6 Ứng dụng | S7 Âm thanh | Tổng |
|---|---|---|---|---|---|---|---|---|
| B1 | 8 ms | 90 ms | n/a | 120 ms | n/a | 80 ms | 22 ms | 320 ms |
| B2 | 6 ms | 70 ms | n/a | 90 ms | n/a | 84 ms | 30 ms | 280 ms |
| F8 | 10 ms | 110 ms | 80 ms | 240 ms | 60 ms | 700 ms | 50 ms | 1,250 ms |
| K7 | 7 ms | 80 ms | n/a | 140 ms | 40 ms | 60 ms | 33 ms | 360 ms |
| KF1 | 7 ms | 80 ms | n/a | 140 ms | 40 ms | 60 ms | 33 ms | 360 ms |
| L5 | 12 ms | 130 ms | 100 ms | 290 ms | 80 ms | 760 ms | 78 ms | 1,450 ms |
| P2 | 14 ms | 130 ms | n/a | 160 ms | n/a | 90 ms | 26 ms | 420 ms |
| Q6 | 7 ms | 75 ms | n/a | 100 ms | n/a | 92 ms | 26 ms | 300 ms |
| Q8 | 7 ms | 75 ms | n/a | 100 ms | n/a | 92 ms | 26 ms | 300 ms |
| T2 | 11 ms | 120 ms | 90 ms | 280 ms | 70 ms | 720 ms | 58 ms | 1,350 ms |
| Y6 | 10 ms | 110 ms | 80 ms | 260 ms | 70 ms | 800 ms | 70 ms | 1,400 ms |
B2 là sản phẩm có thời gian khởi động lạnh nhanh nhất của chúng tôi. L5 là chậm nhất. Khoảng chênh 1,17 giây rất quan trọng: đó là sự khác biệt giữa trải nghiệm "chạm là nói" và "chờ rồi mới nói".
Mẹo mua hàng: Hãy yêu cầu OEM cung cấp bảng phân tích chi tiết toàn bộ quy trình khởi động, không chỉ tổng thời gian. Một cây bút khởi động trong 700 ms với 200 ms dành cho xác minh mật mã là có thể kiểm tra được. Một cây bút khởi động trong 700 ms nhưng không giải thích được chi tiết là một hộp đen.
4. Sơ đồ phân vùng A/B
Mọi bút đọc chạy trên nền Linux (F8, L5, T2, Y6) đều sử dụng sơ đồ phân vùng A/B cho firmware. Đây là tiêu chuẩn vàng để đảm bảo an toàn cho OTA vì cho phép bút quay lại ảnh firmware tốt trước đó nếu ảnh mới khởi động thất bại.
Sơ đồ A/B trên L5 dành 3,2 GB cho các phân vùng boot và system (4 × 800 MB) và 4,6 GB cho dữ liệu người dùng. Phân vùng TrustZone TEE có dung lượng 200 MB và bao gồm SE proxy cùng vùng lưu trữ bảo mật cho khóa OEM.
5. Sơ đồ phân vùng RTOS
Các SKU chạy RTOS (B1, B2, K7, KF1, P2, Q6, Q8) không cần A/B đầy đủ vì ảnh firmware của chúng chỉ từ 1,4–3,0 MB và vừa vặn trong NOR hai bank với cơ chế hoán đổi phần cứng. Sơ đồ trên B2 trông như sau:
| Offset | Size | Content | Verified by |
|---|---|---|---|
| 0x00000000 | 16 KB | SBL | Mask ROM (RSA-2048) |
| 0x00004000 | 1.0 MB | Firmware slot A | SBL (RSA-2048) |
| 0x00104000 | 1,0 MB | Khe firmware B | SBL (RSA-2048) |
| 0x00204000 | 4,0 MB | Âm thanh OID + tài nguyên | Firmware (AES-128-CTR) |
| 0x00604000 | 1,0 MB | Vùng chờ OTA | Firmware (AES-128-CTR) |
| 0x00704000 | 64 KB | User NVM (kho khóa) | TrustZone-M SAU |
| 0x00714000 | 64 KB | Cờ khởi động + bộ đếm rollback | Phần cứng ghi-một-lần |
Bộ đếm rollback là bộ đếm đơn điệu 32-bit, tăng một đơn vị sau mỗi lần khởi động thành công. Nếu SBL thấy giá trị bộ đếm thấp hơn giá trị đã biết là tốt, nó sẽ chuyển về khe B. Cơ chế này bảo vệ trước kẻ tấn công cố tình hạ cấp firmware xuống phiên bản cũ có lỗ hổng.
6. Máy trạng thái Verified Boot
Máy trạng thái điều phối việc chuyển đổi A/B được dùng chung cho toàn dòng sản phẩm của chúng tôi với một vài khác biệt nhỏ. Máy trạng thái chạy trong SBL:
| Trạng thái hiện tại | Sự kiện | Trạng thái tiếp theo | Hành động |
|---|---|---|---|
| Boot A | Xác minh OK | Boot A | Tăng bộ đếm |
| Boot A | Xác minh thất bại | Boot B | Thử khe B |
| Boot B | Xác minh OK | Boot B | Tăng bộ đếm |
| Boot B | Xác minh thất bại | Recovery | Chờ image qua USB |
| Recovery | Nhận được image đã ký | Recovery | Flash image mới |
| Recovery | Xác minh image thất bại | Brick | Chờ image khôi phục được HSM ký |
| Boot A hoặc B | Hoàn tất vùng chờ OTA | Khởi động lại vùng chờ | Chuyển khe ở lần boot sau |
| Khởi động lại vùng chờ | Xác minh OK | Boot (khe mới) | Thăng cấp khe, giảm cửa sổ rollback |
"Cửa sổ rollback" là số lần khởi động sau đó firmware mới được coi là ổn định. Mặc định của chúng tôi là 4 lần khởi động thành công; nếu bút gặp sự cố trong 4 lần khởi động đầu tiên sau OTA, SBL sẽ tự động rollback về khe trước đó.
7. Quy trình phân vùng và khôi phục OTA
Quy trình OTA trên SKU Linux diễn ra như sau:
- Máy chủ OEM tạo ảnh firmware với chữ ký RSA-2048 \/ ECDSA P-256.
- Ảnh được mã hóa bằng AES-128-CTR khi truyền tải.
- Bút tải ảnh qua Wi-Fi (F8, L5, T2, Y6) hoặc BLE (K7, KF1, Q6, Q8).
- TrustZone TEE giải mã và xác minh chữ ký dựa trên khóa gốc OEM trong SE.
- Ảnh đã giải mã được ghi vào phân vùng không hoạt động (ví dụ: system B).
- Cờ khởi động được đặt thành "boot from B on next restart".
- Bút khởi động lại vào phân vùng B và chạy 4 chu kỳ khởi động.
- Nếu 4 lần khởi động thành công, phân vùng B được thăng cấp; bộ đếm rollback được tăng lên.
- Nếu bất kỳ lần khởi động nào thất bại, phân vùng A được khôi phục và cờ được gửi đến máy chủ OTA.
OTA trên nền RTOS tương tự nhưng nhỏ hơn: ảnh 1,4–3,0 MB, OTA mất 8–25 giây qua BLE trên K7 \/ Q6 \/ Q8 so với 40–90 giây qua Wi-Fi trên L5.
8. Kỹ thuật tối ưu thời gian khởi động
Chúng tôi áp dụng năm kỹ thuật để giữ thời gian khởi động cạnh tranh:
| Kỹ thuật | SKU sử dụng | Tiết kiệm |
|---|---|---|
| Song song hóa SBL và khởi tạo SE | F8, L5, T2, Y6 | 60–110 ms |
| Bỏ qua khởi tạo UART\/JTAG trong sản xuất | Tất cả | 12–20 ms |
| Dùng kernel nén + giải nén sớm | F8, L5, T2, Y6 | 80–150 ms |
| Giải mã trước âm thanh OID đầu tiên trong SBL | B1, B2, P2 | 18–30 ms |
| Tắt biện pháp giảm thiểu Spectre\/Meltdown (RTOS) | B1, B2, P2, Q6, Q8 | 8–14 ms |
Các SKU dựa trên Linux không tắt biện pháp giảm thiểu Spectre\/Meltdown vì chúng xử lý nội dung không đáng tin cậy từ thư viện OID. Các SKU dựa trên RTOS thì tắt vì toàn bộ firmware của chúng đã được ký.
9. Các chế độ lỗi khởi động phổ biến chúng tôi đã gặp
Trên hơn 47.000 đơn vị đã xuất xưởng từ năm 2023, đây là phân tích các lỗi khởi động nguội ngoài thực địa:
| Chế độ lỗi | Tần suất | Cách khắc phục |
|---|---|---|
| Tràn ngược bộ đếm (tấn công hạ cấp) | 0,02 % | Nạp lại firmware tại trung tâm dịch vụ |
| Vòng lặp chuyển A\/B | 0,18 % | Buộc phân vùng A qua USB |
| Ghi phân vùng OTA bị gián đoạn | 0,34 % | Tự động khôi phục từ vùng tạm |
| Mất điện trong khi khởi động | 0,91 % | Khởi động từ phân vùng B |
| eMMC bị mòn | 0,06 % | Thay thế theo bảo hành |
| Cờ chống tamper của SE được kích hoạt | 0,04 % | Khởi tạo lại tại trung tâm dịch vụ |
| Sụt áp pin | 0,22 % | Khởi động từ trạng thái nguội |
Lỗi mất điện trong khi khởi động chiếm 0,91 % là nguyên nhân đơn lẻ lớn nhất gây ra phiếu dịch vụ ngoài thực địa. Chúng tôi đã bổ sung tụ điện 1,2 ms trên firmware 4.1.5 của L5 để giữ đường ray eMMC VCCQ qua sụt áp 12 ms; điều này đã giảm tỷ lệ lỗi xuống 0,31 % trong 8.000 đơn vị tiếp theo.
10. Những thay đổi trong 18 tháng tới
Hai thay đổi sắp được triển khai. Thứ nhất, firmware 4.3.0 trên L5 và T2 sẽ giới thiệu khởi động UEFI với chuỗi Linux U-Boot được thay thế bằng U-Boot 2024.10 + GRUB 2.12. Điều này sẽ giúp quá trình khởi động có thể kiểm tra được đối với các bên mua OEM muốn nối tiếp các bản phân phối Linux của riêng họ. Thứ hai, firmware K7 / KF1 phiên bản 2.0.0 sẽ giới thiệu Root of Trust (RoT) dựa trên phần cứng, neo vào secure element OPTIGA Trust M, thay thế cách tiếp cận TrustZone-M SAU chỉ dựa trên phần mềm hiện tại.
Cả hai thay đổi đều tương thích ngược: luồng khởi động hiện tại vẫn tiếp tục hoạt động, nhưng một chế độ mới sẽ mở khóa UEFI hoặc RoT phần cứng cho các gói thầu yêu cầu điều đó.
11. Cách đọc số phiên bản firmware của chúng tôi
Phiên bản firmware của chúng tôi tuân theo mẫu MAJOR.MINOR.PATCH. Ví dụ, firmware B2 phiên bản 2.4.7 nghĩa là phiên bản chính 2, phiên bản phụ 4, bản vá 7. Các quy tắc như sau:
- MAJOR tăng khi có thay đổi phá vỡ tính tương thích (ví dụ: chuyển từ FreeRTOS sang Zephyr, thay đổi bố cục rootfs).
- MINOR tăng khi có một tính năng mới (ví dụ: thêm ngôn ngữ mới, codec OID mới).
- PATCH tăng khi có bản sửa lỗi hoặc bản vá bảo mật backport.
Quy tắc rollback: bạn có thể rollback MINOR và PATCH một cách tự do. Việc rollback MAJOR yêu cầu sự chấp thuận rõ ràng từ OEM. Điều này bảo vệ bạn khỏi vô tình hạ phiên bản xuống một nhánh đã kết thúc vòng đời.
Danh mục phiên bản firmware hiện tại gồm 1.9.5 (K7/KF1), 2.0.3 (P2), 2.4.7 (B1/B2), 2.6.4 (T2/Y6), 3.1.2 (F8), 3.3.1 (Q6/Q8), 4.2.0 (L5). Chúng tôi xuất bản ghi chú phát hành firmware trên cổng OEM mỗi 6 tuần.