2012-03-05 15 views
5

Tôi đang cố gắng sử dụng GDB để gỡ lỗi zImage hạt nhân Linux trước khi nó được giải nén. Hạt nhân đang chạy trên một mục tiêu ARM và tôi có một trình gỡ lỗi JTAG kết nối với nó với một máy chủ GDB sơ khai. Mục tiêu phải tải bộ nạp khởi động. Trình tải khởi động đọc hình ảnh hạt nhân từ flash và đặt nó vào RAM tại 0x20008000, sau đó rẽ nhánh vào vị trí đó.Gỡ lỗi giai đoạn giải nén hạt nhân Linux

Tôi đã bắt đầu GDB và kết nối với mục tiêu từ xa, sau đó tôi sử dụng lệnh GDB của add-symbol-file như vậy:

add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow 

Khi tôi đặt một breakpoint cho địa chỉ đó, nó làm cái bẫy tại địa điểm chính xác - ngay khi nó nhánh cho hạt nhân. Tuy nhiên, GDB hiển thị sai dòng từ nguồn của arch/arm/boot/compressed/head.S. Đó là 4 dòng phía sau. Làm thế nào tôi có thể sửa lỗi này?

Tôi cũng đã thử thêm tùy chọn -s section addr vào add-symbol-file với -s .start 0x20008000; điều này dẫn đến chính xác cùng một vấn đề.

+0

Trước tiên hãy đảm bảo bạn có gcc và gdb tương thích, tốt nhất là từ cùng phiên bản toolchain. Ngoài ra, biết rằng hạt nhân Linux được biên dịch với -O2 vì vậy một số dòng được tối ưu hóa. Bạn có chắc chắn không có bất kỳ từ khóa .align nào đó ở đâu đó không? –

+0

Mã giải nén là tất cả các máy tính có liên quan. Nó thậm chí có thể sao chép chính nó từ một khu vực khác. Bộ nạp khởi động có thể đặt nó ở nơi mà đích được giải nén là; vì vậy nó phải tự di chuyển. Tôi nghi ngờ rằng bạn sẽ có thời gian tốt bằng cách sử dụng JTAG với các biểu tượng cố định. Tôi không biết nếu bạn có thể * di dời * với GDB bằng cách nào đó. –

Trả lời

2

Có các macro lắp ráp in ra nội dung khi biên dịch với mức độ thấp gỡ lỗi. Bạn phải đảm bảo các macro phù hợp với bảng của bạn.

linux-latest/arch/arm$ find . -name debug-macro.S | wc 
56  56 2306 

Tìm tệp cho bảng của bạn và đảm bảo đăng ký cổng nối tiếp chính xác bị trúng. Bạn có thể thiết lập mã bằng cách sử dụng JTAG. Các macro này được sử dụng trong mã giải nén. Tất nhiên cấu hình với * CONFIG_DEBUG_LL *.

Rất có thể ATAG không đúng hoặc một trong các yêu cầu khác. Thanh toán Tài liệu/cánh tay/Khởi động để đảm bảo bạn đã đăng ký đúng cách. Lưu ý có yêu cầu mới với các nhân gần đây để gửi danh sách dt.

+0

Macro hiện tại nằm trong [cánh tay bao gồm gỡ lỗi] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/include/debug) (tính đến tháng 1 năm 2015 v3 .19). Xem thêm: [debug debug.S] (https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/compressed/debug.S) –