Raspberry Pi 3’ün Açılış (Boot) Süreci

Raspberry Pi’ın çalışma sistemini daha iyi anlamak için açılışın nasıl gerçekleştiği hakkında bilgi sahibi olmak faydalı olacaktır. Raspberry Pi bilgisayarı, daha doğrusu BCM283x sistem çipi, sırasıyla dâhili SD kart (SD1), harici SD kart (SD2), GPIO’ya bağlı NAND bellek, SPI arabirimi, USB ve LAN bağlantısı üzerinden açılış yapabilir. Açılış yapılabilecek aygıtları ve sırasını ayarlamanın iki yöntemi vardır. İlki sistem çipinin içindeki küçük bir kaydedicide saklanan OTP (One Time Programming) bit’lerini ayarlamak diğeri ise GPIO22 ve GPIO26 arasındaki pin’leri bir 1 veya 0 çekmek. İkinci yöntemin çalışabilmesi için öncelikle sistem çipi içindeki ilgili OTP bitinin GPIO boot moduna (program_gpio_bootmode) alınması gerekir[1].

Açılış sürecinin ilk aşaması tamamen kapalı olarak yürür. Yani, sistem çipi içinde çalıştırılan kod ve alt işlem adımları hakkında Broadcom firması tarafından kamu ile paylaşılmış fazla bir teknik bilgi yoktur.

Raspberry Pi bilgisayarına güç verildiğinde ilk olarak GPU etkinleştirilir (bu sırada CPU ve RAM henüz pasif durumdadır). GPU içerisinde gömülü ve ilk aşama yükleyicisi adı verilen çok küçük bir program kodu, yine GPU içindeki basit bir icra birimi tarafından çalıştırılır. Bu küçük program açılıştan sorumludur ve açılışın ilk aşamasını icra etmeye başlar. Açılış kısaca şöyle devam eder:

  1. İlk aşama yükleyici (First Stage Bootloader): SD kart üzerindeki ilk bölümü (FAT32 biçimli disk bölümünü) ikinci aşama yükleyicinin kullanabilmesi için bağlar ve hazır hale getirir. Ardından görevi ikinci aşama yükleyici programın yer aldığı bootcode.bin dosyasını, sistem çipi içindeki 128KB’lık ön belleğe (L2 cache) yükler ve çalıştırır. İlk aşama yükleyicinin program kodu bu BCM28xx SoC çipi üzerinde programlanmıştır ve kullanıcı tarafından düzenlenemez ya da değiştirilemez. Kapalı kaynak kod yapısındadır.
  2. İkinci aşama yükleyici (Second Stage Bootloader)Yaklaşık 50KB’lık boyuta sahip bootcode.bin programı SDRAM’i etkinleştirir ve görevi start.elf dosyasına devreder. GPU tarafından çalıştırılmaya başlandığı sırada güç kaynağından daha fazla akım çekildiği görülebilir.
  3. start.elf  CPU’nun başlatılmasını sağlar. Bu arada fixup.dat dosyası GPU ve CPU’nun SDRAM üzerinde ortak kullanabileceği bir dosya sistemini inşa etmek için bir yapılandırma verisi sağlar. Bu aşamada yürütme görevi CPU’ya geçmiştir. Raspberry Pi 4 ile birlikte bootcode.bin dosyasının işlevinin yerini SPI port’una bağlı 4MBits’lik bir EEPROM’da yüklü program almıştır. Raspberry Pi 4 ön yükleme bölümündeki (boot) bootcode.bin  dosyasını görmezden gelir.
  4. start.elf SD kart üzerindeki ilk bölümden config.txt, cmdline.txt ve kernel.img (Linux çekirdeği) dosyalarını okuyarak çekirdeği başlatır ve kendisini sonlandırır. Bu aşamada açılış sürecinin icrası kapalı kaynak koddan açık kaynak kod dünyasına yani Linux çekirdeğine geçiş yapar. Ancak bundan sonra kullanıcıların oluşturulmasına izin verilen programlar yüklenebilir. Genellikle bir Linux çekirdeğini içeren .img uzantılı bir dosyadır. Bu aşamada çoklu işletim sistemi açılışını sağlayan (daha önce Raspberry Pi ‘a birden fazla işletim sistemi kurulabildiğine değinmiştik) U-boot gibi bir açılış yükleyicisi de çalıştırılabilir.

Açılış sürecinden fark edebileceğiniz gibi;  Raspberry Pi’ın kullandığı sistem çipinin kodları kapalıdır. Bu nedenle kullanıcılar GPU bellenim yazılımına müdahale edememektedir. Ancak GitHub üzerinde GPU çekirdeği olarak kullanılan VideoCoreIV’ün tersine mühendislik çalışmalarını bulabilirsiniz[2]. GPU bellenim programının (firmware) güncellenmesi için rpi-update adındaki araç kullanılır. Bu konudaki bilgiye “Raspberry Pi’ı Güncellemek” adlı konu başlığından ulaşabilirsiniz. Ayrıca ilk defa Raspberry Pi 4 ile birlikte gelen açılış EEPROM’unun güncellenmesi ile ilgili bilgiyi de kitabın “Raspberry Pi’ın EEPROM’unu güncelleştirmek” adlı başlığından öğrenebilirsiniz.

OTP belleğinin içeriğini görüntülemek

Sistem çipi içindeki küçük bir EEPROM belleğe karşılık gelen OTP’nin içeriğini görüntülemek için vcgencmd aracını aşağıdaki gibi kullanabilirsiniz:

pi@raspberry ~ $ vcgencmd otp_dump


[1] Boot modes: https://github.com/raspberrypi/documentation/tree/master/hardware/raspberrypi/bootmodes

[2] VideoCoreIV Reverse Enginering – https://github.com/hermanhermitage/videocoreiv

Yazar: Özgür Koca

Yazar - Tankado.com

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.