Trong quá trình phân tích mã nguồn U-Boot, cần xem xét cấu trúc thư mục và các file Makefile. Sau đây là hướng dẫn chi tiết về cách làm việc với U-Boot trong môi trường Ubuntu.
- Phân tích thư mục dự án U-Boot
Để bắt đầu, hãy tải mã nguồn U-Boot vào một thư mục trên hệ thống Ubuntu của bạn và biên dịch nó. Dưới đây là những thư mục chính cần chú ý:
Thư mục arch:
Các thư mục bên trong "arch" chứa mã nguồn cho nhiều kiến trúc như ARM, m68k, x86, v.v. Vì chúng ta đang sử dụng chip STM32MP1 (ARM), nên chỉ quan tâm đến thư mục "arm". Các thư mục có tiền tố "mach-" liên quan đến thiết bị cụ thể, chẳng hạn "mach-stm32mp" cho STM32MP1. Thư mục "cpu" cũng quan trọng vì nó chứa các tệp script liên kết dành riêng cho kiến trúc CPU.
<!-- Ví dụ tệp script liên kết -->
<code>link_script_armv7.ld</code>
Thư mục board:
Chứa các tệp liên quan đến bo mạch cụ thể. Đối với STM32MP1, hãy tìm trong đường dẫn board/st/stm32mp1.
Thư mục configs:
Lưu trữ các tệp cấu hình sẵn sàng để sử dụng, giúp dễ dàng tùy chỉnh theo yêu cầu. Các tệp này thường có định dạng xxx_defconfig.
Tệp .u-boot.xxx_cmd:
Đây là các tệp chứa lệnh tạo ra các tệp nhị phân U-Boot. Ví dụ:
cmd_u-boot.bin := cp u-boot-dtb.bin u-boot.bin
Thư mục Makefile:
Tập tin Makefile cấp cao nhất hỗ trợ tổ chức xây dựng toàn bộ dự án thông qua các Makefile con trong từng thư mục module.
- Phân tích Makefile cấp cao nhất của U-Boot
Makefile cấp cao nhất điều khiển toàn bộ quy trình build và được viết để hỗ trợ tính năng chia nhỏ thành nhiều Makefile con.
Biến MAKEFLAGS:
Biến này quản lý các biến số truyền giữa các phiên bản make lồng nhau. Ví dụ:
MAKEFLAGS += -rR --include-dir=$(CURDIR)
Xuất lệnh đầy đủ:
Để hiển thị tất cả các lệnh thực thi khi build, thêm tham số V=1 khi chạy lệnh make. Điều này rất hữu ích trong quá trình gỡ lỗi.
ifeq ("$(origin V)", "command line")
KBUILD_VERBOSE = $(V)
endif
Kiểm tra mã nguồn:
Dùng make C=1 hoặc make C=2 để kiểm tra mã nguồn trước khi build. Điều này giúp phát hiện các vấn đề tiềm ẩn sớm hơn.
ifeq ("$(origin C)", "command line")
KBUILD_CHECKSRC = $(C)
endif
Biên dịch mô-đun đơn lẻ:
Sử dụng make M=dir để biên dịch một mô-đun cụ thể mà không phải toàn bộ dự án.
ifeq ("$(origin M)", "command line")
KBUILD_EXTMOD := $(M)
endif