ลำดับการบู๊ตคืออะไร?


35

ฉันสงสัยว่าลำดับการบูตของ Raspberry Pi อยู่ในการตั้งค่าทั่วไป (พูด NOOBS) จากแอปพลิเคชันพลังงาน (หรือการรีเซ็ตที่อบอุ่นหากมีความแตกต่าง) จนถึงการกล่าวถึงการปรากฏตัวของโลโก้ หรือที่อธิบายไว้

นอกจากภาพทั่วไปที่ต้องการมากที่สุดของลำดับนั้นฉันสนใจมากที่สุดในช่วงแรก:

  1. เวกเตอร์รีเซ็ตสำหรับ ARM CPU คืออะไรและกำหนดไว้อย่างไร / ที่ไหน?
  2. คำสั่ง ARM CPU แรกที่ดึงมาจากหน่วยความจำแบบใด อยู่ที่ไหนและเทคโนโลยีใดที่ใช้เก็บรหัสนี้
  3. รหัส ARM32 หรือ Thumb (หรืออาจเป็น Jazelle) คืออะไร? สิ่งนั้นขึ้นอยู่กับบิตลำดับที่ต่ำของเวกเตอร์รีเซ็ตหรือไม่
  4. มีแหล่งที่มา (หรือถอดแยกชิ้นส่วนหรือถ่ายโอนข้อมูล) ของรหัสการเริ่มต้นนั้นพร้อมใช้งานหรือไม่ หากไม่เป็นเช่นนั้นจะมีสิ่งใดที่ทำให้ไม่สามารถใช้พอร์ต JTAG ในทางเทคนิคได้ สำหรับกฎหมายฉันพร้อมที่จะรับความเสี่ยงในการเชื่อถือความเข้าใจในกฎหมายที่บังคับใช้เมื่อฉันอาศัยอยู่ (ฝรั่งเศส) ซึ่งฉันได้รับอนุญาตอย่างเต็มที่ในการวิเคราะห์คอมพิวเตอร์ของตัวเองอย่างน้อยในกรณีที่ไม่มีสัญญาชัดเจน ความต้องการที่จะไม่ทำเช่นนั้น
  5. อุปกรณ์ต่อพ่วงเริ่มต้นได้ในลำดับใดและโดยส่วนใดของรหัส
  6. ข้างๆซีพียู ARM มีตัวประมวลผล / ออโตมาต้าบางตัวทำงานอยู่ใน BCM2835 และในการยืนยันลำดับการบูตของมันเกี่ยวข้องกับซีพียู ARM อย่างไร

ฉันพร้อมที่จะดำดิ่งลงในคู่มืออ้างอิงทางเทคนิคของ ARM CPU และอุปกรณ์ต่อพ่วง BCM2835 ARMหรือเอกสารอื่น ๆ

อัปเดต: หลังจากโพสต์แล้วฉันพบสิ่งนี้และสิ่งนี้โดยระบุว่า GPU ของ BCM2835 ทำหน้าที่เป็นปรมาจารย์แขนและมีส่วนเกี่ยวข้องอย่างมากในลำดับการบู๊ต


4
ทั้งหมดที่ฉันสามารถพูดได้ว่าข้อมูลส่วนใหญ่เป็นแหล่งข้อมูลปิดเช่นซอร์สโค้ด bootloaders และเฟิร์มแวร์ SoC .. ตอนนี้ยังไม่ทราบ คุณควรรู้สิ่งหนึ่ง BCM เป็น GPU ... ไม่ใช่ซีพียู bootloader เริ่มต้นในส่วน GPU เริ่มต้น RAM ที่นั่นและส่งมอบให้กับ CPU ซึ่งเป็นที่แรกที่เราสามารถเข้าถึงซอร์สโค้ด ... อาคา Raspbian โชคดี. คำถามนี้กว้างมากและตอบยาก
Piotr Kula

คำตอบ:


38

ลำดับการบูตของ Raspberry Pi นั้นเป็นแบบนี้:

  1. การบู๊ตสเตจ 1 อยู่ใน ROM บนชิป โหลดด่าน 2 ในแคช L2
  2. ขั้นที่ 2 bootcode.binคือ เปิดใช้งาน SDRAM และโหลดด่านที่ 3
  3. ขั้นตอนที่ 3 loader.binคือ มันรู้เกี่ยวกับ.elfรูปแบบและโหลดstart.elf
  4. start.elfkernel.imgโหลด จากนั้นก็ยังอ่านconfig.txt, cmdline.txtและbcm2835.dtb หากไฟล์ DTB ที่มีอยู่ก็จะโหลด0×100และเคอร์เนล @ 0×8000 ถ้าdisable_commandline_tagsมีการตั้งค่าโหลด kernel @ 0×0 มิฉะนั้นมันโหลดเคอร์เนล @ 0×8000และใส่ ATAGS ที่0×100
  5. kernel.img ถูกเรียกใช้บน ARM

ทุกอย่างทำงานบน GPU จนกว่าkernel.imgจะโหลดบน ARM

ฉันพบแผนภาพนี้มีประโยชน์มาก:

ลำดับการบูต


2
มีประโยชน์ มันจะมีความกระจ่างหรือไม่ถ้าตัวที่สอง bootloader bootcode.binเป็นโค้ดที่ทำงานโดย GPU, ARM (และรหัสชนิดใด) หรือส่วนผสมเหล่านี้? เหมือนกันสำหรับขั้นตอนที่ 3 loader.bin(หากยังไม่หายไปเหมือนจะเป็น)
fgrieu

3
@fgrieu ฉันได้แก้ไขคำตอบเพื่อรวมคำชี้แจง ทุกอย่างทำงานบน GPU จนกว่าkernel.imgจะรันบน ARM
SG60

1
ตามนี้ loader.binไม่ได้ใช้ bootcode.binโหลดโดยตรงstart.elfตามGit นี้กระทำ
HeatfanJohn

@ SG60: คุณสามารถปรับปรุงคำตอบของคุณด้วยข้อมูลจาก HeatfanJohn ได้หรือไม่?
Peter Mortensen

ไม่มีใครรู้เกี่ยวกับการบูต NOOBS หรือไม่ เห็นได้ชัดว่ามีกระบวนการที่แตกต่างกันเล็กน้อยที่เกี่ยวข้องกับการกู้คืนตัวเองและการแสดงตลกบูตบาง ฉันอยากรู้ว่า uboot ทำงานในระดับที่ต่ำกว่าเล็กน้อย
Sam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.