ARM Açılış Süreci

ARM mimarisinde açılış süreci aşağıdaki sıra ile gerçekleşir:

  • Boot ROM üzerinden dahili kodun çalışması
  • Birinci harici boot yükleyicinin çalışması (X-loader)
  • Daha gelişmiş ikinci boot yükleyicinin çalışması (U-boot)
  • Linux kernel'ın çalışmaya başlaması

Dahili Boot ROM adresi ilgili donanım için sabit olacaktır. Buradaki kodun temel amacı, birinci harici boot yükleyici kodunu yüklemektir

Bu noktada çoğu zaman donanım üzerinde, birinci harici boot yükleyicinin hangi ortamdan yükleneceğine dair (seri port, NAND flash, SD kart vb.) boot konfigürasyon pin'leri sağlanır.

Boot Yükleyicinin Görevleri: Bellek

Sistemdeki bellek alanlarının tespit edilmesi ve ilklendirilmesi Linux çekirdeğinden önce boot yükleyici uygulaması tarafından yapılmalıdır.

Bu işlem için bir takım otomatik algılama rutinleri, özel algoritmalar veya ilgili donanım için sabit değerler bulunabilir, tamamen boot yükleyici uygulamanın geliştirimine göre değişir.

Boot Yükleyicinin Görevleri: Kernel

Linux kernel imajı, boot yükleyici tarafından belleğe yüklenmelidir.

Boot yükleyici uygulama ne kadar yetenekli ise, o kadar farklı şekilde Linux kernel imajı yüklenebilir. Örneğin, boot yükleyici uygulamada TCP ve HTTP protokolü destekleniyorsa, herhangi bir web sunucuda barındırılan kernel imajı da download edilip belleğe aktarılabilir.

Öte yandan boot yükleyici uygulamanın olabildiğince küçük ve basit olması beklenir. TCP gibi kompleks bir protokolün dahil edilmesi iyi bir fikir değildir.

Pratik kullanımda boot yükleyiciler genellikle kernel imajını NAND flash bellekten, SD Kart üzerinden, seri porttan, network üzerindeki bir TFTP sunucudan veya USB disk üzerinden okurlar. Bu desteklerden bir veya birden fazlası kullandığınız boot yükleyici içerisinde aynı anda bulunabilir.

Boot Yükleyicinin Görevleri: Initial Ramdisk

Linux tabanlı sistemde, iki aşamalı initrd açılış yöntemi kullanılıyor ise, initrd imajını barındıran dosyanın da bulunduğu ortamdan belleğe yüklenmesi boot yükleyici uygulamanın görevleri arasındadır.

Tıpkı Linux imajını yüklerken olduğu gibi, boot yükleyici uygulama içerisindeki destekler, initrd imajının yüklenme opsiyonlarını da belirleyecektir

Oldukça benzer konseptler olmasına rağmen bu durum initramfs imajıyla karıştırılmamalıdır. Initramfs imajı doğası itibariyle zaten kernel imajının sonuna eklenmiş olduğundan, ayrıca yüklenmesine ihtiyaç bulunmamaktadır. initrd imajının ise boot yükleyici tarafından yüklenip, yüklendiği adresin kernel tarafına bildirimi şarttır.

Boot Yükleyicinin Görevleri: Kernel Parametreleri

Boot yükleyicinin bir diğer temel görevi, Linux çekirdeğine parametrelerin geçirilmesini sağlamaktır. Bu işlem için ATAGS sistematiği kullanılır

Fiziksel belleğin 0x100 offsetinden başlayarak ATAGS veriyapıları yerleştirilir. Başlangıç adresi aynı zamanda Linux imajını çalıştırmaya başlamadan önce R2 yazmacına kaydedilecektir.

ATAG_CORE tipi ile başlayıp ATAG_NONE tipine kadar birbirini takip eden değerler kullanılır.

ATAGS Veri Tipleri

Tag Değer Açıklama
ATAG_NONE 0x00000000 Tag listesinin sonunu gösterir
ATAG_CORE 0x54410001 Liste başlangıcını gösterir
ATAG_MEM 0x54410002 Bellek üzerinde kullanılabilecek alanları gösterir
ATAG_VIDEOTEXT 0x54410003 VGA metin konsoluyla ilgili parametreleri gösterir
ATAG_RAMDISK 0x54410004 Ramdisk kullanımına ilişkin parametreleri gösterir
ATAG_INITRD2 0x54420005 Initrd imajının nerede bulunacağını gösterir
ATAG_SERIAL 0x54410006 64 bit board seri numarasını tutar
ATAG_REVISION 0x54410007 32 bit board versiyon numarasını tutar
ATAG_VIDEOLFB 0x54410008 Vesa frame buffer için değerleri tutar
ATAG_CMDLINE 0x54410009 Kernel tarafına aktarılacak komut satırı argümanlarını tutar

ATAGS Veri Tipleri

ATAGS veri tipleri aşağıdaki gibi başlık ve veri alanlarından oluşmaktadır

struct atag_header {
    u32 size; /* legth of tag in words including this header */
    u32 tag;  /* tag value */
};

struct atag {
    struct atag_header hdr;
    union {
        struct atag_core         core;
        struct atag_mem          mem;
        struct atag_videotext    videotext;
        struct atag_ramdisk      ramdisk;
        struct atag_initrd2      initrd2;
        struct atag_serialnr     serialnr;
        struct atag_revision     revision;
        struct atag_videolfb     videolfb;
        struct atag_cmdline      cmdline;
    } u;
};

Geleneksel Boot Yöntemi

Kernel 3.8 ve sonrasında kullanılmaya başlanan Device Tree modeliyle çalışanların dışında kalan tüm sistemler, geleneksel yöntemle boot sürecini gerçekleştirirler.

Bu yöntemde, her board ailesi için değil, her bir board için özgün bir ID alınması gereklidir. Bu ID değeri ARM mimarisi için Linux kernel tarafındaki ana sorumlu olan Russell King üzerinden kayıt ettirilmelidir. Güncel listeye http://www.arm.linux.org.uk/developer/machines adresinden ulaşabilirsiniz. 2014 sonu itibariyle 4981 adet board kaydı bulunmaktadır

Board Numarasının Çekirdeğe Aktarımı

Bootloader uygulamasının, özgün board numarasını R1 yazmacına geçmesi zorunludur.

Linux çekirdeği, boot sürecinde bu yazmaca özgün board numarasının yazıldığını varsayar ve tüm akış bu şekilde ilerler.

Linux çekirdeğinin derlenmesi aşamasında da R1 yazmacındaki özgün makine numarasıyla ilgili donanım spesifik kısımların seçilmiş ve çekirdek içerisine dahil edilmiş olması zorunludur. Aksi takdirde aşağıdaki gibi bir hata mesajı alınacaktır:

   Uncompressing Linux... done, booting the kernel.
   Error: unrecognized/unsupported machine ID (r1 = 0x000007d9).

   Available machine support:

   ID (hex)    NAME
   00000af0    ti8168evm

   Please check your kernel config and/or bootloader.

Özet: Boot Süreci

  1. Boot ROM üzerinden dahili kod çalışır ve birinci boot yükleyici yüklenir (X-loader)

  2. X-loader tarafından ek ilklendirmeler yapılır ve daha gelişkin ikincil boot yükleyici yüklenir (U-boot)

  3. Boot yükleyici tarafından Linux çekirdeği bulunduğu ortamdan belleğe aktarılır

  4. Eğer initrd imajı kullanılıyorsa, aynı şekilde initrd imajı da belleğe aktarılır

  5. Sisteme ait özgün numara, R1 yazmacına yazılır

  6. Initrd imajının bellekteki yeri ve uzunluğu, kernel açılış parametreleri vb. parametreler için fiziksel belleğin başlangıcına yakın yerlerde ATAGS veri yapıları oluşturulur

  7. ATAGS veri yapısının başlangıç adresi R2 yazmacına yazılır (Genellikle 0x100)

  8. Bellekteki kernel imajındaki ilk makine kodu çalıştırılır

Device Tree Yöntemi

Device Tree yönteminde (detaylar için ilgili konu başlığını inceleyiniz) açılış sürecinde bir miktar farklılık bulunmaktadır.

Bu modelde her bir board versionu için özgün bir numara belirtmek yerine, her bir board ailesi için özgün bir Device Tree numarası bulunur.

Geleneksel modele oranla çok daha az numara kullanılır zira bir DT modeli ile bir çok farklı board versiyonu adreslenebilir.

İlgili DT veri yapısı boot yükleyici tarafından belleğe aktarılır ve adresi R2 yazmacına yazılır

Bu yöntemi desteklemeyen eski boot yükleyicileri için Linux kernel içerisinde CONFIG_ARM_APPENDED_DTB özelliği kullanılarak DT veri yapısı kernel imajının sonuna eklenebilir

results matching ""

    No results matching ""