Hạt nhân Linux bị treo tại kernel Bắt đầu kernel


7

Tôi đã bật Secure Boot trên thiết bị nhúng thành công. Vấn đề là khi tôi khởi động ở chế độ này, quy trình dường như bị kẹt ngay sau dòng:

Starting kernel ...

một khi U-boot đã sao chép kernel trong bộ nhớ và ra bootmlệnh.

Trong trình gỡ lỗi, tôi có thể thấy rằng PC bị kẹt trên một yieldlệnh theo sau là một phép gán pc = pc-4- vì vậy về cơ bản là một vòng lặp.

Tôi chưa bao giờ đưa lên linux ở mức thấp này trước đây vì vậy tôi không chắc bắt đầu tìm kiếm ở đâu. Mặc dù vậy, tôi đã nhận thấy rằng tôi có thể khởi động thành công hình ảnh hạt nhân khi không ở chế độ bảo mật, vì vậy đây có thể là một câu hỏi thích hợp hơn cho nhà cung cấp.

1) Nói chung, tôi có thể tìm thấy thông tin chẩn đoán U-boot ở đâu về giai đoạn thực hiện?

2) Tại điểm nào thì thực thi được cung cấp đầy đủ cho kernel? tức là khi nào U-boot không còn tồn tại?


Thông báo "Bắt đầu kernel ..." không phải từ U-Boot mà từ Linux Kernel được cung cấp trình bao bọc "zImage" khi nó khởi động kernel sau khi giải nén. Nếu bạn có trình gỡ lỗi, hãy bắt đầu tìm kiếm ngay khi mã đó bắt đầu thực thi (tức là bạn bắt đầu thực thi tại bất cứ nơi nào bạn nói điểm nhập cảnh).
Tom Rini

Điều này có đúng trên tất cả các nền tảng không? Thiết bị này là một hệ thống nhúng khá tối nghĩa để khởi động hình ảnh FIT; kernel, cầu cây thiết bị và mái nhà đều được gói vào một nhị phân "itb" này được tải / thực thi bởi U-Boot.
sherrellbc

Tôi xin lỗi, xin lỗi. Đó là bản in cuối cùng từ U-Boot. Tuy nhiên, đề nghị của tôi là bắt đầu bằng cách dừng trình gỡ lỗi của bạn tại điểm vào và làm việc từ đó.
Tom Rini

Khi zImage giải nén, cả hạt nhân được nén và giải nén đều nằm trong bộ nhớ trong một khoảng thời gian. Tôi đã từng gặp vấn đề tương tự khi hạt nhân của tôi lớn để phù hợp với bộ nhớ.
jc__

Câu trả lời:


2

Có thể bạn có thể kết xuất bộ nhớ của bản in đầu linux bằng quy trình sau. Nguyên nhân có thể là, kernel đang khởi động nhưng nó bị treo trước giao diện điều khiển init. Đồng thời đặt bản in vào điểm nhập kernel của uboot và xác nhận quyền điều khiển được bàn giao cho kernel.

Tìm System.maptập tin. Sử dụng lệnh dưới đây để xác định log_bufđịa chỉ:

grep __log_buf System.map

Điều này sẽ tạo ra một cái gì đó như

c0352d88 B __log_buf

Khởi động ấm bảng (Không nên xóa nội dung trong RAM).

Trong Uboot kết xuất bộ nhớ của __log_buf(c0352d88). Nó sẽ đổ bản in giao diện điều khiển Kernel. Vì vậy, bạn có thể xác định nơi treo chính xác xảy ra.


1

Tôi đã phải đối mặt với cùng một vấn đề và đã tìm thấy một giải pháp. Vấn đề là trong một trong những u-boot structure fieldmà các cửa hàng sizecủa uncompressed linux kernel.các u-bootkhông Populating lĩnh vực này với kích thước nén, rằng linux kernelsử dụng sau này để thay đổi kích thước của nó stack, do đó việc đưa hệ thống vào một trạng thái không xác định.

Sau khi u-bootin Starting kernel...tin nhắn, tin nhắn tiếp theo sẽ là Uncompressing Linux... done, booting the kernelsau khi u-boot chuyển một SMM Handlerhạt nhân để tiếp quản việc thực thi và có thể kernellà tìm kiếm trường này. Nếu bạn đang làm việc trên một x86hệ thống dựa trên, giải nén sẽ nằm trong các thư mục tệp sau:

arch/x86/boot/uncompressed/head_32.S
arch/x86/boot/uncompressed/piggy.S

Giải pháp là sử dụng danh từ u-boot mới nhất tại đây: https://github.com/andy-shev/u-boot

Tuy nhiên, nếu bạn đang sử dụng một u-boot tùy chỉnh, bạn cần tìm trường này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.