Thiết lập môi trường Build System và CMake cho Raspberry Pi CM5
Bước đầu tiên là chuẩn bị bộ công cụ biên dịch (toolchain) và hệ thống CMake để hỗ trợ việc compile các driver và module kernel liên quan đến NPU. Raspberry Pi CM5 sử dụng kiến trúc ARM64, do đó cần cấu hình cross-compiler chính xác.
Việc cài đặt các package này đảm bảo hệ thống có thể biên dịch mã nguồn C/C++ thành binary ARM64 tương thích với BCM2712 mà không cần chạy trực tiếp trên thiết bị.
Kết quả mong đợi: Các lệnh như arm-linux-gnueabihf-gcc (hoặc arm64-linux-gnu-gcc) và cmake trả về version khi gọi, không báo lỗi "command not found".
sudo apt-get update && sudo apt-get install -y build-essential cmake libncurses-dev kmod libssl-dev libelf-dev bison flex libncurses5-dev device-tree-compiler
Cài đặt thêm ARM64 cross-compiler để biên dịch kernel cho BCM2712 (ARMv8-A). Raspberry Pi cung cấp toolchain riêng trong repository của họ.
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
Thiết lập biến môi trường để trỏ đúng đến cross-compiler vừa cài đặt, giúp các bước build sau không cần gõ path dài.
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
echo "export CROSS_COMPILE=aarch64-linux-gnu-" >> ~/.bashrc
echo "export ARCH=arm64" >> ~/.bashrc
source ~/.bashrc
Verify kết quả bằng cách kiểm tra biến môi trường và phiên bản compiler.
echo $CROSS_COMPILE
echo $ARCH
aarch64-linux-gnu-gcc --version
Cấu hình Kernel để kích hoạt hỗ trợ NPU trên BCM2712
BCM2712 trên CM5 tích hợp NPU chuyên dụng (thường là IP của Broadcom hoặc được map qua driver mới). Cần biên dịch lại Kernel với các option đặc thù để kích hoạt bus và driver cho NPU.
Chúng ta sẽ sao chép cấu hình mặc định của Raspberry Pi OS, sau đó chỉnh sửa để bật các option liên quan đến Device Tree, IOMMU, và driver NPU giả định (thường nằm trong nhóm DRM hoặc GPU hoặc MBED tùy vào tài liệu cụ thể của Broadcom).
Kết quả mong đợi: File .config được tạo ra với các dòng CONFIG_... tương ứng được đặt là y.
Trước tiên, lấy file cấu hình mặc định từ nguồn Raspberry Pi hoặc tạo mới dựa trên defconfig của Raspberry Pi CM4/CM5.
cd /usr/src/rpi-kernel/
make bcm2712_defconfig
Chạy menuconfig để bật các option cần thiết cho AI và NPU. Cần bật IOMMU, CMA (Contiguous Memory Allocator), và driver cụ thể cho NPU.
make menuconfig
Trong menuconfig, hãy di chuyển đến các mục sau và bật (chọn y hoặc [*]):
1. Device Drivers -> Graphics support -> Direct Rendering Manager (DRM) -> ARM Mali GPU (nếu dùng GPU làm AI) hoặc Broadcom NPU (nếu có driver riêng).
2. Kernel Features -> CPU Frequency scaling (bật để AI có thể scale frequency).
3. Memory Management -> Contiguous Memory Allocator (CMA) (bắt buộc cho DMA).
4. Bus options -> IOMMU support -> ARM IOMMU.
Sau khi đóng menuconfig, sử dụng lệnh scripts/config để ép buộc bật các option quan trọng nếu không tìm thấy trong menu.
scripts/config --enable CONFIG_CMA
scripts/config --enable CONFIG_CMA_DEBUG
scripts/config --enable CONFIG_IOMMU_SUPPORT
scripts/config --enable CONFIG_ARM_SMMU
scripts/config --enable CONFIG_ARM_SMMU_V3
scripts/config --enable CONFIG_DRM_MALI
scripts/config --enable CONFIG_MALI_DEV_PLATFORM
Cấu hình thêm CMA size để dành riêng vùng nhớ cho NPU xử lý tensor lớn. BCM2712 thường cần ít nhất 512MB vùng nhớ liên tục.
scripts/config --set-str CONFIG_CMA_SIZE "512M"
scripts/config --set-str CONFIG_CMA_ALIGNMENT "64M"
Verify kết quả bằng cách grep các option đã bật trong file config.
grep -E "CONFIG_CMA|CONFIG_IOMMU|CONFIG_DRM_MALI|CONFIG_ARM_SMMU" .config
Tối ưu hóa Scheduler và Memory Management cho Workload AI
Workload AI đặc trưng bởi các burst tính toán nặng trên NPU/GPU và truy cập bộ nhớ ngẫu nhiên lớn. Scheduler mặc định của Linux (CFS) có thể gây latency do context switching quá nhiều. Cần tinh chỉnh để ưu tiên throughput và giảm jitter.
Chúng ta sẽ cấu hình Kernel để sử dụng BFQ (Budget Fair Queueing) cho I/O và tinh chỉnh preemption để đảm bảo thread AI được ưu tiên.
Kết quả mong đợi: Kernel boot với các thông số scheduler tối ưu, giảm latency khi NPU yêu cầu tài nguyên.
Cấu hình scheduler trong menuconfig để bật preemption và chọn loại I/O scheduler phù hợp.
scripts/config --enable CONFIG_PREEMPT_VOLUNTARY
scripts/config --set-str CONFIG_DEFAULT_IO_SCHEDULER "bfq"
Thêm vào file config để bật CONFIG_SCHED_DEBUG giúp theo dõi hành vi scheduler trong runtime cho AI.
scripts/config --enable CONFIG_SCHED_DEBUG
scripts/config --enable CONFIG_SCHEDSTATS
Cấu hình Memory Management: Bật CONFIG_TRANSPARENT_HUGEPAGE để giảm TLB miss khi xử lý tensor lớn, nhưng cần cẩn thận với fragmentation.
scripts/config --enable CONFIG_TRANSPARENT_HUGEPAGE
scripts/config --enable CONFIG_THP_DEFAULT_MADVISE
Để tối ưu hơn cho NPU, cần đảm bảo CONFIG_ZONE_DMA32 được bật nếu NPU có giới hạn địa chỉ 32-bit, hoặc CONFIG_ZONE_DMA cho vùng nhớ thấp.
scripts/config --enable CONFIG_ZONE_DMA32
scripts/config --enable CONFIG_ZONE_DMA
Verify kết quả bằng cách kiểm tra file config và sau khi boot, kiểm tra thông số runtime.
grep -E "CONFIG_PREEMPT|CONFIG_DEFAULT_IO_SCHEDULER|CONFIG_TRANSPARENT_HUGEPAGE" .config
Sau khi boot, kiểm tra scheduler đang hoạt động và trạng thái hugepage.
cat /sys/block/mmcblk0/queue/scheduler
cat /sys/kernel/mm/transparent_hugepage/enabled
Cấu hình IOMMU và DMA Coherency cho truy xuất bộ nhớ tốc độ cao
NPU BCM2712 yêu cầu truy cập bộ nhớ trực tiếp (DMA) với tốc độ cao. Nếu không cấu hình IOMMU và DMA Coherency đúng cách, sẽ xảy ra xung đột bộ nhớ, crash kernel, hoặc dữ liệu bị sai lệch do cache không đồng bộ.
Chúng ta cần bật CONFIG_DMA_API_DEBUG để phát hiện lỗi và cấu hình Device Tree (sẽ được chi tiết ở Phần 3) để chỉ rõ vùng nhớ coherency. Ở mức Kernel Config, cần bật các driver IOMMU cho ARM SMMU.
Kết quả mong đợi: Kernel boot thành công, NPU có thể map vật lý bộ nhớ mà không gây panic, và cache coherence được duy trì tự động bởi SMMU.
Bật hỗ trợ IOMMU cho ARM SMMU (Stage 1 và Stage 2) để quản lý địa chỉ vật lý cho NPU.
scripts/config --enable CONFIG_IOMMU_API
scripts/config --enable CONFIG_IOMMUFD
scripts/config --enable CONFIG_ARM_SMMU
scripts/config --enable CONFIG_ARM_SMMU_V3
scripts/config --enable CONFIG_ARM_SMMU_V3_QCOM # Nếu cần hỗ trợ mở rộng
Cấu hình DMA Coherency: BCM2712 thường hỗ trợ coherent DMA. Cần bật option để Kernel biết NPU này không cần flush cache thủ công.
scripts/config --enable CONFIG_DMA_CMA
scripts/config --enable CONFIG_DMA_DEBUG
scripts/config --enable CONFIG_DMA_API_DEBUG
Thêm cấu hình để sử dụng iommu=on trong dòng boot (sẽ được thêm vào cmdline trong bước compile final).
Cập nhật file config để thêm option CONFIG_IOMMU_DEFAULT_PASSTHROUGH nếu muốn NPU có quyền truy cập toàn bộ vật lý, hoặc CONFIG_IOMMU_DEFAULT_DMA để an toàn hơn.
scripts/config --enable CONFIG_IOMMU_DEFAULT_DMA
Verify kết quả bằng cách kiểm tra các dòng config liên quan đến IOMMU và DMA.
grep -E "CONFIG_IOMMU|CONFIG_DMA" .config
Sau khi build và boot, kiểm tra xem IOMMU có đang active không.
dmesg | grep -i iommu
dmesg | grep -i dma
Để kiểm tra vùng nhớ CMA đã được dành riêng cho NPU.
cat /sys/kernel/mm/cma/areas/npu
Tổng hợp và Build Kernel
Sau khi đã cấu hình xong tất cả các option trên, thực hiện biên dịch kernel.
Sử dụng lệnh make với số lượng core tối ưu cho máy build (ví dụ: 8 cores) để tăng tốc độ.
make -j8
Khi build xong, copy các file cần thiết (Image, modules, dtb) vào thư mục boot hoặc thư mục đích.
make modules_install INSTALL_MOD_PATH=/home/pi/rpi-modules
cp arch/arm64/boot/Image /home/pi/rpi-modules/boot/
cp arch/arm64/boot/dts/bcm2712.dtb /home/pi/rpi-modules/boot/
Verify quá trình build thành công bằng cách kiểm tra sự tồn tại của file Image và modules.
ls -lh /home/pi/rpi-modules/boot/Image
ls /home/pi/rpi-modules/boot/ | grep dtb
Điều hướng series:
Mục lục: Series: Tối ưu hóa Linux Kernel cho Raspberry Pi CM5 để chạy AI Edge
« Phần 1: Chuẩn bị phần cứng Raspberry Pi CM5 và môi trường phát triển
Phần 3: Xây dựng Device Tree và Driver cho CM5 »