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
Boot ROM üzerinden dahili kod çalışır ve birinci boot yükleyici yüklenir (
X-loader
)X-loader tarafından ek ilklendirmeler yapılır ve daha gelişkin ikincil boot yükleyici yüklenir (
U-boot
)Boot yükleyici tarafından Linux çekirdeği bulunduğu ortamdan belleğe aktarılır
Eğer initrd imajı kullanılıyorsa, aynı şekilde initrd imajı da belleğe aktarılır
Sisteme ait özgün numara,
R1
yazmacına yazılırInitrd 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şturulurATAGS
veri yapısının başlangıç adresiR2
yazmacına yazılır (Genellikle 0x100)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