U-Boot

U-Boot (Universal Bootloader), ARM, MIPS ve x86 olmak üzere birçok mimariyi destekleyen, açık kaynak kodlu bir önyükleyici uygulamasıdır. Genel olarak işletim sistemi çekirdeğini birincil belleğe yüklemekten ve uygun parametrelerle çalıştırmaktan sorumludur.

U-Boot genellikle, açılış sürecine kullanıcının dahil olmasına imkan vermek için, işletim sistemini başlatmadan önce, belli bir süre kullanıcının bir tuşa basmasını beklemektedir. Bu bekleme süresi, u-boot kaynak kodundan belirlenebildiği gibi sonrasında u-boot üzerinden de değiştirilebilmektedir. Bekleme süresi içinde bir tuşa basılarak u-boot komut satırına düşülebilir.

u-boot bir takım çevre değişkenleri kullanmaktadır. Bu çevre değişkenleri kullanılarak u-boot'un davranışı değiştirilebilmektedir. Önemli gördüğümüz bazı çevre değişkenleri ve görevleri aşağıdaki gibidir.

Çevre Değişkeni İçeriği
bootcmd Otomatik olarak çalıştırılacak komut kümesi
bootargs Çekirdeğe geçirilecek komut satırı parametreleri
bootdelay bootcmd içeriği işletilmeden önce bekleme süresi
ipaddr Cihaz IP değeri
serverip Sunucu IP değeri
baudrate Baudrate değeri

u-boot ayrıca çok sayıda komut barındırmaktadır. Yine önemli gördüğümüz bazı komutlar ve görevleri aşağıdaki gibidir.

Komut Görevi
setenv Çevre değişkeni tanımlar veya değerini günceller
saveenv Çevre değişkenlerinin değerlerini kalıcı hafızaya yazar
bootm Bellekte verilen adresteki kodu işletir
fatload DOS bölümünden belleğe dosya yükler
tftp TFTP üzerinden dosya yükler
printenv Çevre değişkenlerini listeler

Komut satırında help yazarak tüm komut listesini görebildiğiniz gibi help [komut adı] şeklinde bir komut ile ilgili daha detaylı bir bilgi de alabilirsiniz. mmc desteği olan bir u-boot üzerinden aldığımız yardım aşağıdaki gibidir.

# help mmc
mmc - MMC sub system

Usage:
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
mmc setdsr - set DSR register value

Not: u-boot'un barındırdığı komut kümesi, hedef karta göre değişmektedir. Örneğin ağ ve SD kart desteği olan bir kart için tftpboot ve fatload komutlarını barındırmasına karşın, bu özelliklerin olmaması durumunda bu komutlar da bulunmayabilir.

Not: u-boot çevre değişkenleri, u-boot komut satırından değiştirilebildiği sonrasında Linux üzerinden de değiştirilebilmektedir.

Şimdi bir örnek üzerinden u-boot kaynak kodunun nasıl derlendiğine ve kullanıldığına bakalım.

Örnek platform olarak, Board Spesifik Kılavuzlar kısmında incelediğimiz, Olimex A20 kartını kullanacağız. İlk olarak bu kart ve ailesi için özelleştirilmiş u-boot kaynak kodunu indirelim.

git clone https://github.com/linux-sunxi/u-boot-sunxi.git
cd u-boot-sunxi

arch dizininde birçok mimari için yazılmış C ve sembolik makina kodları bulunmaktadır.

# ls arch/
arc  arm  avr32  blackfin  m68k  microblaze  mips  nds32  nios2  openrisc  powerpc  sandbox  sh  sparc  x86

Projeyi derlemek için ana dizinde bir Makefile dosyası bulunmaktadır. Bu makefile dosyası ile önce projeyi doğru şekilde konfigüre etmeli ve ardından u-boot kodunu derlemeliyiz.

Ana dizinde desteklenen kartları gösteren boards.cfg adlı bir dosya bulunmaktadır. Bu dosya kartımıza ilişkin bir giriş bulundurmaktadır.

# grep sunxi boards.cfg | awk '{print $7}' | grep A20-OLinuXino-Micro
A20-OLinuXino-Micro
A20-OLinuXino-Micro_FEL

u-boot kodunu konfigür etmek için, makefile içeriğindeki CROSS_COMPILE değişkenine uygun değer vermeli ve hedef platformumuzu belirtemeliyiz. Genel formu ve örneğimiz için durum aşağıdaki gibidir.

make CROSS_COMPILE=<Çapraz Derleyici Önceki> <Öngörülen Ayar dosyası veya İfadesi>
make CROSS_COMPILE=arm-linux-gnueabihf- A20-OLinuXino-Micro_config

Çoğunlukla u-boot kodlarında configs dizini altında hedef platforma ilişkin öngörülen ayar dosyası bulunmasına karşın, burada incelediğimiz örnek için böyle bir kullanım söz konusu değildir.

Son aşamada ise u-boot kodu aşağıdaki gibi derlenebilir.

make CROSS_COMPILE=arm-linux-gnueabihf-

u-boot kaynak kodunda ayrıca, bazen MLO olarak da isimlendirilen, daha küçük bir önyükleyici olan SPL (Secondary Program Loader)'de bulunmaktadır. SPL, görev olarak, üretim aşamasında kodlanan ROM yükleyici ile u-boot arasında bulunmaktadır.

Yukarıda derlediğimiz u-boot için seri terminal üzerinden aldığımız açılış mesajları aşağıdaki gibidir.

U-Boot 2014.04-10733-gea1ac32 (Feb 02 2015 - 12:05:05) Allwinner Technology

CPU:   Allwinner A20 (SUN7I)
Board: A20-OLinuXino-Micro
I2C:   ready
DRAM:  1 GiB
MMC:   SUNXI SD/MMC: 0
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   emac
Hit any key to stop autoboot:  2

Şimdi kısaca bir u-boot kullanım senaryosuna bakalım. Bu aşamada, çekirdeğe geçirilecek komut satırı parametrelerini belirleyebilir, çekirdeği tftp veya SD kart üzerinden çekip cihazı açabiliriz. tftp üzerinden örnek bir kullanım aşağıdaki gibidir.

setenv bootargs console=ttyS0,115200 init=/bin/sh root=/dev/mmcblk0p2 rootwait panic=10
setenv autoload no
dhcp
setenv serverip 172.16.2.136
tftp 0x48000000 uImage
bootm 0x48000000

bootm komutundan sonra, u-boot mesajları aşağıdaki gibidir.

bootm 0x48000000
## Booting kernel from Legacy Image at 48000000 ...
   Image Name:   Linux-3.4.103-00033-g9a1cd03
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    4555464 Bytes = 4.3 MiB
   Load Address: 40008000
   Entry Point:  40008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK

Starting kernel ...

results matching ""

    No results matching ""