Trình tự khởi động là gì?


35

Tôi đang tự hỏi trình tự khởi động của Raspberry Pi là gì trong một thiết lập điển hình (giả sử là NOOBS), từ ứng dụng nguồn (hoặc thiết lập lại ấm nếu khác biệt) cho đến khi xuất hiện logo; hoặc nơi được mô tả.

Bên cạnh một bức tranh chung cần thiết nhất về trình tự đó, tôi quan tâm nhất ở giai đoạn đầu:

  1. Vectơ thiết lập lại cho CPU ARM là gì và được xác định như thế nào / ở đâu?
  2. Từ bộ nhớ CPU ARM đầu tiên được tìm nạp từ bộ nhớ nào? Đó là đâu và công nghệ nào được sử dụng để lưu trữ mã này?
  3. Đó có phải là mã ARM32 hoặc Thumb (hoặc có lẽ là Jazelle) không? Điều đó phụ thuộc vào bit thứ tự thấp của vector thiết lập lại?
  4. Nguồn (hoặc tháo gỡ, hoặc kết xuất) của mã khởi động sớm đó có sẵn không? Nếu không, có gì kỹ thuật ngăn chặn việc sử dụng cổng JTAG để xác định điều đó không? Về mặt pháp lý, tôi sẵn sàng chấp nhận rủi ro tin tưởng vào sự hiểu biết của tôi về luật áp dụng ở nơi tôi sống (Pháp), đó là tôi hoàn toàn được phép phân tích máy tính của riêng mình, ít nhất là trong trường hợp không có hợp đồng rõ ràng yêu cầu không làm như vậy.
  5. Theo thứ tự các thiết bị ngoại vi được khởi tạo, và bằng đoạn mã nào?
  6. Bên cạnh CPU ARM, có một số bộ xử lý / automata đang chạy trong BCM2835, và trong phần khẳng định trình tự khởi động của nó liên quan đến CPU ARM như thế nào?

Tôi đã sẵn sàng để đi sâu vào Hướng dẫn tham khảo kỹ thuật của CPU ARM và Thiết bị ngoại vi ARM BCM2835 hoặc bất kỳ tài liệu nào khác.

Cập nhật: Sau khi đăng, tôi đã tìm thấy cái nàycái này , nói rằng GPU của BCM2835 đang hoạt động như một bậc thầy của ARM và tham gia rất nhiều vào trình tự khởi động.


4
Tất cả những gì tôi có thể nói rằng hầu hết các thông tin đó là nguồn đóng, như mã nguồn, bộ tải khởi động và phần mềm SoC .. Hiện tại không biết phân bổ. Bạn nên biết một điều. BCM là GPU ... không phải CPU. Bộ tải khởi động bắt đầu trong phần GPU, khởi chạy RAM ở đó và bàn giao cho CPU, nơi đầu tiên chúng ta có quyền truy cập vào mã nguồn ... hay còn gọi là Raspbian. Chúc may mắn. Câu hỏi này rất rộng và khó trả lời.
Piotr Kula

Câu trả lời:


38

Trình tự khởi động của Raspberry Pi về cơ bản là thế này:

  1. Khởi động giai đoạn 1 nằm trong ROM trên chip. Tải Giai đoạn 2 trong bộ đệm L2
  2. Giai đoạn 2 là bootcode.bin. Cho phép SDRAM và tải Giai đoạn 3
  3. Giai đoạn 3 là loader.bin. Nó biết về .elfđịnh dạng và tảistart.elf
  4. start.elftải kernel.img. Sau đó nó cũng đọc config.txt, cmdline.txtbcm2835.dtb Nếu file DTB tồn tại, nó được nạp tại 0×100& kernel @ 0×8000 Nếu disable_commandline_tagsđược thiết lập nó tải kernel @ 0×0 Nếu không nó tải kernel @ 0×8000và ATAGS đặt tại0×100
  5. kernel.img sau đó được chạy trên ARM.

Mọi thứ được chạy trên GPU cho đến khi kernel.imgđược tải trên ARM.

Tôi thấy sơ đồ này khá hữu ích:

Trình tự khởi động


2
Hữu ích. Có thể làm rõ nếu bộ tải khởi động giai đoạn 2 bootcode.binlà mã được chạy bởi GPU, ARM (và sau đó là loại mã nào) hoặc kết hợp các mã này? Tương tự cho giai đoạn 3 loader.bin(nếu điều đó không biến mất, như nó đã xuất hiện).
fgrieu

3
@fgrieu Tôi đã chỉnh sửa câu trả lời để bao gồm làm rõ. Mọi thứ được chạy trên GPU cho đến khi kernel.imgchạy trên ARM.
SG60

1
Theo điều này loader.bin là không còn được sử dụng. bootcode.bintải trực tiếp start.elftheo cam kết Git này
HeatfanJohn

@ SG60: Bạn có thể cập nhật câu trả lời của bạn với thông tin từ HeatfanJohn không?
Peter Mortensen

Có ai biết về khởi động NOOBS không? rõ ràng có quá trình hơi khác nhau, liên quan đến recovery.elf và một số trò hề khởi động mềm. Tôi tò mò về việc làm cho uboot làm việc ở mức thấp hơn một chút.
Sam
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.