Академический Документы
Профессиональный Документы
Культура Документы
Linux
Table of Contents
Giri
Linux ekirdei
1.1
1.2
1.3
1.4
1.5
1.6
1.7
U-boot
2.1
RedBoot
2.2
2.3
Linux Al Sreci
Kernel Al Sreci
3.1
3.2
10
11
12
12.1
12.2
12.3
12.4
12.5
Gml Linux
12.6
12.7
12.8
Watchdog Kullanm
13
14
Buildroot
15
Android Platformu
16
16.1
na Sreci
16.2
Sistem arlar
17
Strace Kullanm
18
19
Make
19.1
Autoconf, Automake
19.2
Raspberry Pi
20
20.1
Al Sreci
20.2
20.3
20.4
20.5
20.6
Cihazn Almas
20.7
20.8
Sistem Konfigrasyonu
20.9
21
Hawkboard
21.1
Olimex A20
21.2
TI DM6446 EVM
21.3
BeagleBoard
21.4
BeagleBoneBlack
21.5
EKLER
22
22.1
22.2
22.3
3
Gml Linux
22.4
C6Run
22.4.1
DSP Testi
22.4.2
22.5
Gml Linux
Giri
Gml Linux kitab, bu alanda gerekletirdiimiz eitim programlarmzda ilediimiz
konularn biraraya getirilmesi fikriyle olutu.
Eitim iin hazrladmz belgelerin kitap formatnda dzenlenme ve gncelleme almalar
devam ediyor. Srecin yarsna yaklatmzdan bakalarna da faydal olabileceini
dnerek, kitap ieriini genel eriime ayoruz.
Gml Linux kitab bu alanda almak isteyenlere balang seviyesinde bilgiler
sunmasnn yan sra, uzun yllardr alan kiiler iin de retici unsurlar barndrmaktadr.
Amacmz spesifik konulara girmek yerine renme sreci asndan en fazla fayda retecek
balklara deinmek eklinde olmakla birlikte, bu dengeyi tutturmann kolay olmadnn da
bilincindeyiz. Tam da bu noktada ierikle ilgili geri bildirimlerden memnuniyet duyacamz
belirtiriz.
Sorularnz in
Kitapla ilgili neri ve dncelerinizi mdemirten at yh.com.tr adresinden bizimle
paylaabilirsiniz.
Ek olarak teknik sorularnz http://www.linux-tips.org sitesinde zellikle Embedded tartma
bal altnda iletmeniz halinde, yantlamaya alacamz belirtmek isteriz. Katk
salayabilecek daha ok kiiye ulamak iin site ngilizce olarak hazrlanmaktadr.
Yardmc Kitap
Henz genel eriime almam olan Linux Sistem Programlama kitabmzn da okunmasn
neriyoruz. Mart ay ierisinde ilk versiyonu am olmay planlyoruz.
Telif Hakk
Bu kitabn btn telif haklar Murat Demirten'e aittir. Kitabn tamam veya bir ksm, "kaynak
gsterildii ve deiiklik yaplmad" takdirde, herhangi bir izne gerek kalmadan, her
trl ortamda oaltlabilir, datlabilir, kullanlabilir.
Teekkr
Giri
Gml Linux
Giri
Gml Linux
Linux ekirdei
Linux, Unix felsefesi ve tasarm prensipleri dorultusunda gelitirilmi ak kaynak kodlu bir
iletim sistemi ekirdeidir. ekirdein kaynak kodlar GNU Genel Kamu Lisans
erevesinde zgrce datlabilir, deitirilebilir ve kullanlabilir.
Linux, 1991 ylnda Finlandiyal bir niversite rencisi olan Linus Benedict Torvalds
tarafndan gelitirilmeye balanmtr. Torvalds, 25 Austos 1991'de, comp.os.minix haber
grubuna gnderdii mesajda yeni bir iletim sistemi gelitirmekte olduunu ve ilgilenen
herkesin yardmn beklediini yazd. Daha sonra 17 Eyll 1991'de Linux'un ilk srm olan
0.01'i nternet'te yaynlad. Ksa bir sre sonra, 5 EKim 1991'de temel zellikleriyle beraber
ilk resmi Linux srm olan 0.02'yi yaynlad. Linux ismi ilk olarak 0.02 versiyonunda
gemektedir.
Linus Torvalds, hlen aktif olarak ekirdek gelitirme ekibinde olup halen en fazla kod
gnderenler arasnda ilk sralarda yer almaktadr.
Linux ekirdei
Gml Linux
Desteklenen Mimariler
Gncel Linux ekirdei, 29 farkl mimariyi (yaz ile yirmi dokuz) desteklemektedir.
Desteklenen mimariler Alpha, Analog Devices (Blackfin), ARM, Atmel AVR32, Axis Etrax
CRIS, Texas TMS320 DSP Ailesi, Motorola 68K, Fujitsu FR-V, Qualcomm Hexagon,
Hewlett-Packard PA-RISC, Renesas (Hitachi) H8, IBM 31bit System/390 ve 64bit Z
Mainframe, Intel IA-64 Itanium, x86, Mitsubishi M32R, Xilinx Microblaze, MIPS, Panasonic
MN103, Open RISC, Power (IBM), PowerPC, Sparc 32 Bit, Ultra Sparc 64 bit, SuperH,
Synopsys, S+core, Tilera, Xtensa ve Unicore32 eklindedir.
Linux ekirdei
Gml Linux
Gml Linux
Gelitirme Modeli
Yeni versiyonlar gnmzde halen bizzat Torvalds tarafndan kartlmaktadr. Torvalds
gnderilen yeni kodlar ve eitli hatalara ilikin yamalar bir araya getirerek srm
oluturur ve test sreleri balar. Bu noktadan sonra ortalama 10 hafta ierisinde yeni
versiyon duyurulur. Bu ekildeki kernel versiyonlar vanilla veya mainline eklinde anlr.
Baz Linux datmlar dorudan vanilla kernel versiyonunu kullanrken, Debian, RedHat gibi
baz datmlar ise eitli ek srcler, yamalar ve zellikleri ieren ayr bir kernel versiyonu
kullanrlar. Bu yntemi izleyen datmlarda kernel versiyonu ok sk gncellenmez, ou
zaman datmn bir sonraki versiyonu kana kadar ayn kernel versiyonu kullanlr (rnek
olarak Debian Wheezy versiyonunda kernel 3.2 kullanlrken Debian Jessie versiyonunda
kernel 3.16 kullanlmaktadr). Bununla birlikte yeni kernel versiyonlarnda dzeltilen nemli
bir gvenlik a veya fonksiyonel dzenleme olursa, ilgili datmlarn kernel paketleme
ekipleri tarafndan bu zellikler datmla birlikte verilen kernel versiyonuna backport edilir.
10
Gml Linux
Bitkeeper zamannn tesinde, datk bir kaynak kod ynetim sistemi ve pek ok yeni zellik
sunuyordu ancak cretsiz bir yazlm deildi ve kaynak kodu kapalyd. Bununla birlikte Linux
projesine bedelsiz olarak hizmet veriyorlard.
Linux gibi bir projenin kapal kodlu bir kaynak kod ynetim sistemi zerinden ynetilmesi
zamannda epey tartmalara yol amtr.
2005 ylnda Andrew Tridgell Bitkeeper uygulama protokoln reverse-engineering yoluyla
zmeye alt. Buradaki amac Bitkeeper ile entegre alabilecek aralar retmekti.
Andrew Tridgell reverse-engineering konusunda ok baarl bir aratrmacyd ve zellikle
Microsoft Windows alarndaki dosya paylam iin kullanlan Server Message Block
protokoln benzeri yntemlerle zmesiyle tannyordu. Ayn zamanda nemli Linux
servislerinden Samba'nn yan sra rsync, talloc gibi projeleri gelitirmiti.
Andrew'in bu almas Bitkeeper'n sahibi olan firmann tepkisini ekti ve Linux projesi iin
verilen cretsiz lisans iptal ettiler.
Buna cevaben Linus Torvalds kollar svayp datk bir kaynak kod ynetim sisteminin
gelitirmesine balad. Aradan sadece 2 ay getikten sonra, bugn en ok kullanlan datk
kaynak kod ynetim sistemi olan Git ortaya km ve Linux kernel kaynak kodlar iin hizmet
vermeye balamt.
Kiisel olarak Git projesini neredeyse Linux kadar nemli buluyorum. Bugn nasl ki bir
browser yazmak iletim sistemi yazmaktan ou zaman daha zor ise, Git'in sahip
olduu fonksiyonlar dnldnde Torvalds'n yapt en nemli ve karmak ilerden
biri olduunu syleyebiliriz.
11
Gml Linux
Girinti ve Hizalama
TAB iin 8 boluk karakteri kullanlr. Gemite bunu 4'e hatta 2'ye indirmek zerine eitli
tartmalar dnd. Ancak Torvalds bu tartmalar saysn 3 olarak almak
isteyenlerdekilere benzetiyor ve faydasz buluyor.
8 karakter gibi balangta fazla gibi grnen boluk says, gnde 20 saat ekirdek kodu
inceleyen biri iin bir bloun nerede balayp nerede bittiini kolay gstermesi asndan
nemlidir.
8 karakterlik TAB kullanm sonucudan kodun ok fazla sa tarafa doru ilerledii iin 80
karakterlik konsol ekrannda okunmay zorlatrdndan ikayet edenlere Torvalds, zaten 3
seviyeden fazla girinti yapmanz gerektiyse bir eyleri yanl yapyorsunuz demektir, en iyisi
oturup kodu dzeltin eklinde neride bulunuyor.
Tahmin edebileceiniz zere ekirdek kodu ierisinde 3 seviyeden fazla girintiye sahip olan
pek ok kod bulunmaktadr. Ancak bu boyuttaki bir yazlm projesi iin girinti ve blok
kullanmnn grece minimum dzeyde tutulduunu syleyebiliriz. Torvalds ile ters
dmemek iin zellikle yeni balayanlarn sz dinlemesinde fayda var.
12
Gml Linux
Kvrk Parantez
Kvrk parantezlerin kullanmnda Kernighan & Ritchie metodu tercih edilmitir.
Fonksiyon ierisinde kvrk parantez koullu ifadenin hemen bitiminde alp, blok sonunda
ayr bir satrda kapatlr:
if (x == condition) {
// code here
}
Fonksiyon tanmlarnda ise kvrk parantez fonksiyon tanmn takip eden satrda alp,
fonksiyon bitiminde ayr bir satrda kapatlr:
int my_super_function(int a, int b)
{
// code here
}
simlendirme Kurallar
C dili genel olarak Spartan Programlama mant etrafnda bir kullanm kltr
oluturmutur. Minimalist, az yer kaplayan ama halen daha byk oranda anlalabilir bir kod
yazm tercih edilir.
13
Gml Linux
Typedef Kullanm
Bu konudaki kural basit: ok istisnai bir durum olmadka typedef kullanmayn.
vps_t a;
eklindeki gibi, struct anahtar kelimesi ile birlikte daha aklayc yap ismini kullann.
Genel bir kural olarak, elemanlarna erimek iin accessor metodlar kullanmanz gereken
opak veri tiplerinin dnda typedef kullanmndan kann.
Fonksiyonlar
14
Gml Linux
Fonksiyonlar sadece tek bir ii iyi yapacak ekilde ve ksa olmaldr. Ksalktan kast,
80x24'lk ANSI konsol ekrann baz aldmzda bir fonksiyonun maksimum 2 ekran boyutu
kadar yer kaplamas gerektiidir.
Eer fonksiyon ierisinde yaplan i basit ve temiz olmasna ramen, rnein bir
switch..case blou ierisinde ok sayda deeri kontrol etmesi gerekiyorsa ve bu nedenle
Goto Kullanm
Kernel kodu ile urarken yerinde goto kullanm okunabilirlii ve verimlilii artrr.
Bununla birlikte etiket isimlendirmelerine zen gstermeniz beklenir. GW-BASIC
alkanlklarndan gelen err1: , err2: gibi etiketler kullanmamalsnz. Onun yerine goto
sonrasnda ne olacan ve nereyi etkilediini net bir ekilde belirtmeniz tavsiye edilmektedir.
rnein out_buffer: eklindeki bir etiket, goto ilemi sonras fonksiyondan klacan ve
buffer ile ilgil olduunu gstermektedir.
15
Gml Linux
int fun(int a)
{
int result = 0;
char *buffer;
buffer = kmalloc(SIZE, GFP_KERNEL);
if (!buffer)
return -ENOMEM;
if (condition1) {
while (loop1) {
...
}
result = 1;
goto out_buffer;
}
...
out_buffer:
kfree(buffer);
return result;
}
Yorum Satrlar
Yorum satrlarn kullanmak gzeldir ama fazla kullanldnda tehlikeli olabilir. Genel prensip
olarak yorum satrlarnda fonksiyonunuzun nasl altn deil, basite ne yaptn
anlatmanz yeterlidir.
Yorum satrlar fonksiyonun tanmnn hemen zerinde yer almal, fonksiyon ierisinde
yorumlara yer verilmemelidir.
Yorum satrlar iin Linux kernel kodunda C89 /* ... */ sitili kullanlr. Tek satrlk C99 stili
// ... yorumlara izin verilmez.
16
Gml Linux
kelimesini takip eden yardm satrlar ise buna ek olarak, 2 adet ek boluk kullanlarak
yazlmaktadr:
config NET_FC
bool "Fibre Channel driver support"
depends on SCSI && PCI
help
Fibre Channel is a high speed serial protocol mainly used to connect
large storage devices to the computer; it is compatible with and
intended to replace SCSI.
17
Gml Linux
Konfigrasyon
Konfigrasyon sreci olduka zaman alc bir ilemdir. Derlenecek olan kernel imajnn sahip
olaca zellikleri tek tek semeye almak saatlerce srebilir. Eer karmza soru olarak
kartlan seeneklerin pek ou hakknda n bilgimiz yoksa -ki ounlukla yle olacaktr-,
seenekler hakknda ek bilgi alma ve karar verme srecini de hesabmza eklediimizde bu
sre gnlerce srebilir.
Elbette konfigrasyon iin bir ka gn zaman ayrmayacaz ancak Gml Linux veya
genel olarak Linux alannda bilginizi bir seviye daha ileriye tamann yollarndan birinin, bu
srece geni bir zaman ayrp kernel ierisindeki teknolojileri incelemek ve ilgili dokmanlar
ek referanslaryla birlikte okumaktan getiini unutmayn.
Konfigrasyon ileminin sonucunda .config adnda bir adet dosya retilecektir. Dolaysyla
eer kullanacanz sistem iin daha nceden retilmi bir konfigrasyon dosyas var ise
onu baz alarak veya dorudan kullanarak da ilem yapabilirsiniz.
zellikle gml sistemler sz konusu olduunda kullanacanz board iin retici tarafndan
nceden hazrlanm bir konfigrasyon dosyas genellikle bulunur. Bu konfigrasyon
dosyasn kullanarak board reticinizin salad veya nerdii kernel kaynak kodlarn
derlediinizde, kullanacanz board ile uyumlu bir kernel imaj kmasn beklersiniz.
Hazr bir konfigrasyon dosyas gelmi olsa dahi, bu dosyay baz alarak konfigrasyon
srecinin zerinden geilmesi ve konfigrasyon dosyasnn biraz daha iyiletirilmesi nerilir.
reticiden gelen konfigrasyon dosyalar genellikle rn kullanacanz senaryoda esasen
ihtiya duymayacanz pek ok bileene dair destei de ierir. Bu dosyay iyiletirmeye
almak hem rn daha iyi tanmanz hem de daha kk bir kernel imaj elde etmenizi
salayacaktr.
18
Gml Linux
700 MB'a yaklaan kaynak kod bykl ve onbinlerce derleme seenei opsiyonu, Linux
kernel derleme srecinin ynetimine dair de ek bir sistem gelitirilmesi ihtiyacn
dourmutur.
Kbuild sistemi ve beraberindeki Kconfig dili bu amala gelitirilmitir. Konfigrasyon
srecine genel olarak baktmzda, ok sayda seenek ve birbirlerine olan bamllk
kurallarndan oluan bir veritaban ierisinden, kendi iinde tutarl bir alt kme oluturma
ilemi olarak grebiliriz.
Aada bir ka seenek kmesine dair hiyerari gsterilmektedir:
+- Code maturity level options
| +- Prompt for development and/or incomplete code/drivers
+- General setup
| +- Networking support
| +- System V IPC
| +- BSD Process Accounting
| +- Sysctl support
+- Loadable module support
| +- Enable loadable module support
| +- Set version information on all module symbols
| +- Kernel module loader
+- ...
rnekteki her bir eleman, opsiyonel olarak bamllk kurallar tanmlam olabilir. rnein
PCI veriyolu zerinde alacak bir ethernet kart doal olarak PCI Veriyolu Destei'ne
baml olduundan, bu ekilde bir bamllk kuralnn tanmlanmas halinde, PCI destei
seilmediinde konfigrasyon srecinin ilerleyen aamalarnda ilgili ethernet kartlarnn
karmza bir seenek olarak gelmemesi gerekir. Eer sre bu ekilde ilemez ise, birbiriyle
elien konfigrasyon sembollerini sememiz iten bile deildir.
Bamllk kurallarn doru biimde tm sistem genelinde uyguladmzda, bu kadar geni
bir seim kmesi ierisinden her zaman anlaml bir kme oluturma imkanna sahip oluruz.
Kconfig dili olduka basittir ve ncesinde ok fazla bilgi sahibi olmasanz dahi, yeterince
rnek ieren bir Kconfig dosyasna bakldnda kullanm kendiliinden anlalabilir.
Kbuild sistemini anlatan dokmanlara, kernel kaynak kodu altnda
Documentation/kbuild dizininde eriebilirsiniz.
19
Gml Linux
menu "Android"
config ANDROID
bool "Android Drivers"
---help-- Enable support for various drivers needed on the Android platform
if ANDROID
config ANDROID_BINDER_IPC
bool "Android Binder IPC Driver"
depends on MMU
default n
---help-- Binder is used in Android for both communication between processes,
and remote method invocation.
This means one Android process can call a method/routine in another
Android process, using Binder to identify, invoke and pass arguments
between said processes.
config ANDROID_BINDER_IPC_32BIT
bool
depends on !64BIT && ANDROID_BINDER_IPC
default y
---help-- The Binder API has been changed to support both 32 and 64bit
applications in a mixed environment.
Enable this to support an old 32-bit Android user-space (v4.4 and
earlier).
Note that enabling this will break newer Android user-space.
endif # if ANDROID
endmenu
Dosya ncelikle bir menu tanmyla balyor. Bu sayede ileride karmza ismi "Android" olan
bir men kacan anlyoruz.
Sonraki admda config anahtar kelimesi ile ANDROID sembol tanmlanm. Semboln tipi
bool olarak belirtildiinde var/yok eklinde ikili bir seim ierdiini anlyoruz. Semboln
tipinden sonra gelen aklama satrnda ise ilgili semboln hangi metinle karmza
kacan gstermektedir: Android Drivers
Hemen altnda ---help--- ile balayan blmde tahmin edebileceiniz zere, bu sembolle
ilgili yardm alnmak istendiinde gsterilecek olan metin yer almaktadr.
20
Gml Linux
Sonrasnda dosyann geri kalann bir if ANDROID blou ierisine alndn grmekteyiz.
Bunun anlam eer st blmde tanmlanan bool tipindeki ANDROID sembol seilirse bu
konfigrasyon seeneklerinin aktif olaca ve kullancya gsterilecei, aksi takdirde bu
seeneklerin hi gsterilmeyeceidir.
Bir sonraki sembolmz gene bool veri tipinde ANDROID_BINDER_IPC eklindedir. Bu
semboln depends on anahtar kelimesi kullanlarak MMU sembolne baml olduu
belirtilmitir. Dolaysyla konfigrasyon srecinin dier admlarnda MMU sembol seilmedi
ise bu zellik de seilemeyecektir. Ek olarak default anahtar kelimesiyle ntanml
deerinin hayr anlamnda n eklinde olduu belirtilmitir.
Son sembolmz gene bool tipinde ANDROID_BINDER_IPC_32BIT 'dir. Bu sembol iin
ntanml deer evet anlamnda y olarak verilmitir. Bununla birlikte semboln
seilebilmesi iin verilen bamllk kurallarnda, mimarinin 64 bit olamayaca ( !64BIT ) ve
ANDROID_BINDER_IPC sembolnn de seilmi olmas artlarnn ayn anda salanmas
istenmitir.
rnek dosyamzn son ksmlarnda alan if blounun endif ile, en bata alan menu
blounun ise endmenu ile kapatldn grmekteyiz.
Aadaki rneklerde bu men iin 64bit aktif iken ANDROID sembolnn deerleri iin
oluan ktlar grebilirsiniz:
21
Gml Linux
Aklama
bool
tristate
string
hex
int
Nmerik sembol tipleri ayrca opsiyonel olarak bir aralk belirtilmesine olanak veren range
deyimine de sahiptir. Aadaki rnekte PM_WAKELOCKS_LIMIT sembolnn int tipinde
tanmland, ntanml deerinin 100 ve geerli deer aralnn 0 - 100000 arasnda olduu
belirtilmektedir.
22
Gml Linux
config PM_WAKELOCKS_LIMIT
int "Maximum number of user space wakeup sources (0 = no limit)"
range 0 100000
default 100
depends on PM_WAKELOCKS
Yukarda grlen sembol isimleri, Kconfig sistemi ierisindeki sembollerin nne CONFIG_
neki getirilerek oluturulur.
Dosya ierisinde 4 farkl trde satr olduunu greceiz. Bunlar:
Yorum Satrlar: Diyez karakteri ile balayan satrlar yorum satr olarak nitelenir ve
deerlendirmeye alnmazlar.
=y le Biten Satrlar: lgili semboln niteledii bileenlerin, oluacak nihai kernel imaj
ierisinde yer almasnn istendiini belirtir.
=m le Biten Satrlar: lgili semboln niteledii bileenlerin, oluacak nihai kernel imaj
ierisine konulmamasn ancak ayr bir modl olarak derlenmesinin istendiini belirtir.
..XXX=8, YYY=Z eklindeki Satrlar: Bu ekildeki satrlar genel olarak derleme
srecinde baz parametrik ilemlerin yaplabilmesine olanak salamak amacyla
kullanlr, rnein yukardaki rneimizde maksimum DVB adaptr kart saysnn 8 ile
23
Gml Linux
Konfigrasyon Aralar
Konfigrasyon dosyasn elle oluturmak pratikte imkansz ve zaten gereksizdir. Kconfig
dosyalarn analiz edip bize seim yapma noktasnda yardmc olacak eitli aralar
mevcuttur. Bu aralar da kaynak kod eklinde Linux kernel projesi ierisindeki
scripts/kconfig dizininde yer alr. Kullanlabilmeleri iin ncelikle derlenmeleri gereklidir.
Bu dizinde birden fazla yardmc ara bulunur. Her biri ayn ii hedefleyen, farkl arayzlere
sahip aralardr.
Yntem
Aklama
xconfig
Qt-4 backend
qt4-dev
gconfig
Gtk-2 backend
gtk-2-dev, libglade-2-dev
nconfig
Ncurses backend
libncurses-dev
menuconfig
curses backend
libncurses-dev
24
Gml Linux
menuconfig arac ierisinde yn tular ile gezebilir, Help blmnden seili balk
hakknda yardm alabilirsiniz. Belirli bir sembol iin arama yapmak istediinizde / ksayolunu
kullanabilirsiniz (vi editrndeki ile ayn ekilde)
Konfigrasyon ilemi tamamlandktan sonra tm menlerden k yapabilirsiniz. Uygulama
sonlanmadan hemen nce yaplan konfigrasyonu kaydetmek isteyip istemediiniz
sorulacaktr.
25
Gml Linux
26
Gml Linux
Derleme ilemi bittiinde bzImage dosyas oluur. Bu dosya vmlinux kernel imajnn
sktrlm halini ve decompress rutinini ierir.
Derleme ilemi ktsnn son blm aadaki gibi bir kt retecektir:
LINK vmlinux
LD vmlinux.o
MODPOST vmlinux.o
GEN .version
CHK include/generated/compile.h
UPD include/generated/compile.h
CC init/version.o
LD init/built-in.o
KSYM .tmp_kallsyms1.o
KSYM .tmp_kallsyms2.o
LD vmlinux
SORTEX vmlinux
SYSMAP System.map
CC arch/x86/boot/a20.o
AS arch/x86/boot/bioscall.o
CC arch/x86/boot/cmdline.o
AS arch/x86/boot/copy.o
HOSTCC arch/x86/boot/mkcpustr
CC arch/x86/boot/cpuflags.o
CC arch/x86/boot/cpucheck.o
CC arch/x86/boot/early_serial_console.o
CC arch/x86/boot/edd.o
VOFFSET arch/x86/boot/voffset.h
CC arch/x86/boot/main.o
CC arch/x86/boot/mca.o
LDS arch/x86/boot/compressed/vmlinux.lds
AS arch/x86/boot/compressed/head_64.o
CC arch/x86/boot/compressed/misc.o
CC arch/x86/boot/memory.o
CC arch/x86/boot/compressed/string.o
CC arch/x86/boot/compressed/cmdline.o
OBJCOPY arch/x86/boot/compressed/vmlinux.bin
27
Gml Linux
HOSTCC arch/x86/boot/compressed/mkpiggy
CC arch/x86/boot/compressed/cpuflags.o
CC arch/x86/boot/compressed/early_serial_console.o
CC arch/x86/boot/pm.o
AS arch/x86/boot/pmjump.o
CC arch/x86/boot/printf.o
CC arch/x86/boot/compressed/eboot.o
AS arch/x86/boot/compressed/efi_stub_64.o
CC arch/x86/boot/regs.o
CC arch/x86/boot/string.o
CC arch/x86/boot/tty.o
CC arch/x86/boot/video.o
CC arch/x86/boot/video-mode.o
CC arch/x86/boot/version.o
CC arch/x86/boot/video-vga.o
XZKERN arch/x86/boot/compressed/vmlinux.bin.xz
CC arch/x86/boot/video-vesa.o
CC arch/x86/boot/video-bios.o
HOSTCC arch/x86/boot/tools/build
CPUSTR arch/x86/boot/cpustr.h
CC arch/x86/boot/cpu.o
MKPIGGY arch/x86/boot/compressed/piggy.S
AS arch/x86/boot/compressed/piggy.o
LD arch/x86/boot/compressed/vmlinux
ZOFFSET arch/x86/boot/zoffset.h
OBJCOPY arch/x86/boot/vmlinux.bin
AS arch/x86/boot/header.o
LD arch/x86/boot/setup.elf
OBJCOPY arch/x86/boot/setup.bin
BUILD arch/x86/boot/bzImage
Setup is 17388 bytes (padded to 17408 bytes).
System is 3131 kB
CRC 43b226da
Kernel: arch/x86/boot/bzImage is ready (#1)
lem bitiminde kullanacamz kernel imaj dosyas arch/x86/boot dizini altnda oluur.
Dier mimariler iin derleme yaptmzda arch/<mimari>/boot dizini altnda
oluacaktr.
Derleme srecini ynettiimiz kernel ana dizininde ise vmlinux adnda bir dosya
olutuunda dikkat ediniz. Bu dosya kernel imajnn sktrlmam halidir:
28
Gml Linux
$ ls -lh vmlinux
-rwxr-xr-x 1 demirten demirten 120M May 16 07:58 vmlinux
$ file vmlinux
vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked,
BuildID[sha1]=f6c3556c7b74f9b300b03275831a4b716d18ee9e, not stripped
$ ls -lh arch/x86/boot/bzImage
-rw-r--r-- 1 demirten demirten 3.1M May 16 07:58 arch/x86/boot/bzImage
Grld zere sktrlmam hali 120 MB iken, sktrlm hali 3.1 MB seviyelerindedir.
Kernel imaj retildikten sonra modllerin derlenmesi ve uygun dizin yaps ile sistemde
oluturulmas gerekir. Bu ilemler iin modules ve modules_install make hedefleri
kullanlr:
$ make modules
$ make modules_install
modules_install hedefi, modllere ait dizin yapsn ntanml olarak derlemenin yapld
29
Gml Linux
Paralel Derleme
Derleme sreci olduka cpu youn bir ilemdir. Ek bir parametre verilmemesi halinde sadece
tek bir cpu core kullanlr. Oysa kernel ierisindeki Makefile dosyalar paralel derlemeye
imkan verecek ekilde dzenlenmitir. Birden fazla cpu core var ise, bunlar maksimum
dzeyde kullanmak ve derleme srecini ok daha abuk sonulandrmak iin, paralel
derleme yntemini uygulayabilirsiniz. Bu yntemde ka adet paralel derleme sreci olacan
-j N parametresi ile verebilirsiniz.
Genel bir yaklam, sistemdeki tm kapasiteyi kullanmak istiyorsanz cpu core saysnn 2
kat kadar bir deer kullanmak ynndedir. Bunun sebebi derleme srecinde arada gcc
dnda da betik uygulamalar vb. altndan tam olarak cpu core says verildiinde atl
kalan bir kapasite olmasdr. 2 kat gibi bir deer verildiinde sistemin tm performansndan
faydalanabilirsiniz:
$ make bzImage -j 8
apraz Derleme
30
Gml Linux
31
Gml Linux
32
Gml Linux
33
Gml Linux
U-Boot
U-Boot (Universal Bootloader), ARM, MIPS ve x86 olmak zere birok mimariyi destekleyen,
ak kaynak kodlu bir nykleyici uygulamasdr. Genel olarak iletim sistemi ekirdeini
birincil bellee yklemekten ve uygun parametrelerle altrmaktan sorumludur.
U-Boot genellikle, al srecine kullancnn dahil olmasna imkan vermek iin, iletim
sistemini balatmadan nce, belli bir sre kullancnn bir tua basmasn beklemektedir. Bu
bekleme sresi, u-boot kaynak kodundan belirlenebildii gibi sonrasnda u-boot zerinden
de deitirilebilmektedir. Bekleme sresi iinde bir tua baslarak u-boot komut satrna
dlebilir.
u-boot bir takm evre deikenleri kullanmaktadr. Bu evre deikenleri kullanlarak uboot'un davran deitirilebilmektedir. nemli grdmz baz evre deikenleri ve
grevleri aadaki gibidir.
evre Deikeni
erii
bootcmd
bootargs
bootdelay
ipaddr
Cihaz IP deeri
serverip
Sunucu IP deeri
baudrate
Baudrate deeri
u-boot ayrca ok sayda komut barndrmaktadr. Yine nemli grdmz baz komutlar ve
grevleri aadaki gibidir.
Komut
Grevi
setenv
saveenv
bootm
fatload
tftp
printenv
U-boot
34
Gml Linux
Komut satrnda help yazarak tm komut listesini grebildiiniz gibi help [komut ad] eklinde
bir komut ile ilgili daha detayl bir bilgi de alabilirsiniz. mmc destei olan bir u-boot zerinden
aldmz yardm aadaki 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 barndrd komut kmesi, hedef karta gre deimektedir. rnein a
ve SD kart destei olan bir kart iin tftpboot ve fatload komutlarn barndrmasna
karn, bu zelliklerin olmamas durumunda bu komutlar da bulunmayabilir.
Not: u-boot evre deikenleri, u-boot komut satrndan deitirilebildii sonrasnda
Linux zerinden de deitirilebilmektedir.
imdi bir rnek zerinden u-boot kaynak kodunun nasl derlendiine ve kullanldna
bakalm.
rnek platform olarak, Board Spesifik Klavuzlar ksmnda incelediimiz, Olimex A20 kartn
kullanacaz. lk olarak bu kart ve ailesi iin zelletirilmi u-boot kaynak kodunu indirelim.
git clone https://github.com/linux-sunxi/u-boot-sunxi.git
cd u-boot-sunxi
arch dizininde birok mimari iin yazlm C ve sembolik makina kodlar bulunmaktadr.
# ls arch/
arc arm avr32 blackfin m68k microblaze mips nds32 nios2 openrisc powerpc sandbox sh spar
Projeyi derlemek iin ana dizinde bir Makefile dosyas bulunmaktadr. Bu makefile dosyas
ile nce projeyi doru ekilde konfigre etmeli ve ardndan u-boot kodunu derlemeliyiz.
Ana dizinde desteklenen kartlar gsteren boards.cfg adl bir dosya bulunmaktadr. Bu dosya
kartmza ilikin bir giri bulundurmaktadr.
U-boot
35
Gml Linux
ounlukla u-boot kodlarnda configs dizini altnda hedef platforma ilikin ngrlen ayar
dosyas bulunmasna karn, burada incelediimiz rnek iin byle bir kullanm sz konusu
deildir.
Son aamada ise u-boot kodu aadaki gibi derlenebilir.
make CROSS_COMPILE=arm-linux-gnueabihf-
u-boot kaynak kodunda ayrca, bazen MLO olarak da isimlendirilen, daha kk bir
nykleyici olan SPL (Secondary Program Loader)'de bulunmaktadr. SPL, grev olarak,
retim aamasnda kodlanan ROM ykleyici ile u-boot arasnda bulunmaktadr.
Yukarda derlediimiz u-boot iin seri terminal zerinden aldmz al mesajlar aadaki
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 ksaca bir u-boot kullanm senaryosuna bakalm. Bu aamada, ekirdee geirilecek
komut satr parametrelerini belirleyebilir, ekirdei tftp veya SD kart zerinden ekip cihaz
aabiliriz. tftp zerinden rnek bir kullanm aadaki gibidir.
U-boot
36
Gml Linux
U-boot
37
Gml Linux
RedBoot
RedBoot (Red Hat Embedded Debug and Bootstrap firmware) eCos realtime iletim
sisteminde ve Intel XScale gibi baz ARM tabanl platformlarda youn olarak kullanlan bir
boot ykleyici uygulamasdr.
RedBoot kendine zg bir partition table yaps kullanr. Tablo bilgisini flash zerinde saklar.
Linux ekirdei ierisinde RedBoot Partition Table Parsing aktifletirildiinde RedBoot ile
ayn ekilde mantksal blmlendirme yaplm olur.
Son zamanlarda kullanm orannn azald gzlemlenmektedir.
RedBoot
38
Gml Linux
ARM Al Sreci
ARM mimarisinde al sreci aadaki sra ile gerekleir:
Boot ROM zerinden dahili kodun almas
Birinci harici boot ykleyicinin almas ( X-loader )
Daha gelimi ikinci boot ykleyicinin almas ( U-boot )
Linux kernel'n almaya balamas
Dahili Boot ROM adresi ilgili donanm iin sabit olacaktr. Buradaki kodun temel amac,
birinci harici boot ykleyici kodunu yklemektir
Bu noktada ou zaman donanm zerinde, birinci harici boot ykleyicinin hangi ortamdan
ykleneceine dair (seri port, NAND flash, SD kart vb.) boot konfigrasyon pin'leri salanr.
39
Gml Linux
Linux tabanl sistemde, iki aamal initrd al yntemi kullanlyor ise, initrd imajn
barndran dosyann da bulunduu ortamdan bellee yklenmesi boot ykleyici uygulamann
grevleri arasndadr.
Tpk Linux imajn yklerken olduu gibi, boot ykleyici uygulama ierisindeki destekler,
initrd imajnn yklenme opsiyonlarn da belirleyecektir
Olduka benzer konseptler olmasna ramen bu durum initramfs imajyla
kartrlmamaldr. Initramfs imaj doas itibariyle zaten kernel imajnn sonuna eklenmi
olduundan, ayrca yklenmesine ihtiya bulunmamaktadr. initrd imajnn ise boot
ykleyici tarafndan yklenip, yklendii adresin kernel tarafna bildirimi arttr.
40
Gml Linux
Tag
Deer
Aklama
ATAG_NONE
0x00000000
ATAG_CORE
0x54410001
ATAG_MEM
0x54410002
ATAG_VIDEOTEXT
0x54410003
ATAG_RAMDISK
0x54410004
ATAG_INITRD2
0x54420005
ATAG_SERIAL
0x54410006
ATAG_REVISION
0x54410007
ATAG_VIDEOLFB
0x54410008
ATAG_CMDLINE
0x54410009
41
Gml Linux
Kernel 3.8 ve sonrasnda kullanlmaya balanan Device Tree modeliyle alanlarn dnda
kalan tm sistemler, geleneksel yntemle boot srecini gerekletirirler.
Bu yntemde, her board ailesi iin deil, her bir board iin zgn bir ID alnmas gereklidir.
Bu ID deeri ARM mimarisi iin Linux kernel tarafndaki ana sorumlu olan Russell King
zerinden kayt ettirilmelidir. Gncel listeye http://www.arm.linux.org.uk/developer/machines
adresinden ulaabilirsiniz. 2014 sonu itibariyle 4981 adet board kayd bulunmaktadr
42
Gml Linux
7.
eklenebilir
43
Gml Linux
Linux Al Sreci
Linux Al Sreci
44
Gml Linux
Kernel Al Sreci
Sistem Al
Kernel Al Sreci
45
Gml Linux
Kernel Al Sreci
46
Gml Linux
head.o:
Bu blmde mimariye zgn obje kodlar bulunur. Boot ykleyici uygulama tarafndan
altrlmasna yneliktir.
head-cpu.o:
lemciye zg ilklendirme ilemlerine ait kodlar barndrr.
decompress.o:
Sktrlm formda bulunan kernel'i ama ilemlerini gerekletirir.
lib1funcs.o:
ARM mimarisi iin optimize edilmi blme ilemlerine dair kodlar ierir. VFP NEON
start_kernel
asmlinkage void __init start_kernel(void)
{
char * command_line;
extern const struct kernel_param __start___param[], __stop___param[];
smp_setup_processor_id();
/*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
debug_objects_early_init();
/*
* Set up the the initial canary ASAP:
*/
boot_init_stack_canary();
cgroup_init_early();
local_irq_disable();
Kernel Al Sreci
47
Gml Linux
early_boot_irqs_disabled = true;
/*
* Interrupts are still disabled. Do necessary setups, then
* enable them
*/
tick_init();
boot_cpu_init();
page_address_init();
printk(KERN_NOTICE "%s", linux_banner);
setup_arch(&command_line);
mm_init_owner(&init_mm, &init_task);
mm_init_cpumask(&init_mm);
setup_command_line(command_line);
setup_nr_cpu_ids();
setup_per_cpu_areas();
smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
build_all_zonelists(NULL);
page_alloc_init();
printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line);
parse_early_param();
parse_args("Booting kernel", static_command_line, __start___param,
__stop___param - __start___param,
&unknown_bootoption);
jump_label_init();
/*
* These use large bootmem allocations and must precede
* kmem_cache_init()
*/
setup_log_buf(0);
pidhash_init();
vfs_caches_init_early();
sort_main_extable();
trap_init();
mm_init();
/*
* Set up the scheduler prior starting any interrupts (such as the
* timer interrupt). Full topology setup happens at smp_init()
* time - but meanwhile we still have a functioning scheduler.
*/
sched_init();
/*
* Disable preemption - early bootup scheduling is extremely
* fragile until we cpu_idle() for the first time.
*/
preempt_disable();
if (!irqs_disabled()) {
printk(KERN_WARNING "start_kernel(): bug: interrupts were "
Kernel Al Sreci
48
Gml Linux
Kernel Al Sreci
49
Gml Linux
min_low_pfn);
initrd_start = 0;
}
#endif
page_cgroup_init();
enable_debug_pagealloc();
debug_objects_mem_init();
kmemleak_init();
setup_per_cpu_pageset();
numa_policy_init();
if (late_time_init)
late_time_init();
sched_clock_init();
calibrate_delay();
pidmap_init();
anon_vma_init();
#ifdef CONFIG_X86
if (efi_enabled)
efi_enter_virtual_mode();
#endif
thread_info_cache_init();
cred_init();
fork_init(totalram_pages);
proc_caches_init();
buffer_init();
key_init();
security_init();
dbg_late_init();
vfs_caches_init(totalram_pages);
signals_init();
/* rootfs populating might need page-writeback */
page_writeback_init();
#ifdef CONFIG_PROC_FS
proc_root_init();
#endif
cgroup_init();
cpuset_init();
taskstats_init_early();
delayacct_init();
check_bugs();
acpi_early_init(); /* before LAPIC and SMP init */
sfi_init_late();
ftrace_init();
/* Do the rest non-__init'ed, we're now alive */
rest_init();
}
Kernel Al Sreci
50
Gml Linux
rest_init
init srecinin her zaman PID deeri olarak 1 almas iin erkenden bir thread oluturuluyor
kernel_init
Kernel Al Sreci
51
Gml Linux
init_post
Boot ileminin son admlarn gerekletirmekten sorumludur.
Bir console amay dener (Initial Console)
Baarsz olduu takdirde: Unable to open initial console uyar mesaj grntlenir.
Ardndan init process'ini altrmay dener.
Baarl olmas halinde rest_init srecinde oluturulan kernel thread'ini bir userspace
process'e dntrr.
init_post
Kernel Al Sreci
52
Gml Linux
current->signal->flags |= SIGNAL_UNKILLABLE;
if (ramdisk_execute_command) {
run_init_process(ramdisk_execute_command);
printk(KERN_WARNING "Failed to execute %s\n",
ramdisk_execute_command);
}
/*
* We try each of these until one succeeds.
*
* The Bourne shell can be used instead of init if we are
* trying to recover a really broken machine.
*/
if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING "Failed to execute %s. Attempting "
"defaults...\n", execute_command);
}
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
panic("No init found. Try passing init= option to kernel. "
"See Linux Documentation/init.txt for guidance.");
}
zet
Boot ykleyici uygulamas tarafndan bootstrap kodu altrlyor
Bootstrap kodu ilemci ve kart ilklendiriyor
Kernel Al Sreci
53
Gml Linux
Kernel Al Sreci
54
Gml Linux
1 nolu process'in ekirdek seviyesinde zel bir durumu vardr. Sistemdeki 1 nolu process'i
root kullancs ile dahi sinyal gndererek sonlandramazsnz. 1 nolu process balatlrken
ekirdek tarafndaki process tablosunda SIGNAL_UNKILLABLE bayra ile iaretlenir. Bu
sayede sonraki aamalarda process'in sonlanmasna yol aabilecek trden hi bir sinyal
ekirdek tarafndan bu process'e gnderilmez. Bu sreci detayl incelemek isteyenler
kernel/fork.c ierisindeki is_child_reaper() ve kernel/signal.c ierisindeki
SIGNAL_UNKILLABLE kullanmlarna gz atabilir.
55
Gml Linux
Byle bir durumda sistemimiz intihar teebbsnde bulunmu olacaktr. Bir uygulamann
servis (daemon) olmas ne demektir? Uygulamalarn onlar balatan uygulamalar (parent
process) sonlansa dahi arkada almaya devam eder hale getirilmesine eytanlatrma :)
(daemonize) ismini veriyoruz. Aslnda bu srecin arkasnda yatan basit mantk da, daemon
haline getirmek istediimiz uygulamann parent process id deerini (PPID), 1 nolu process
olarak deitirmekten ibarettir. 1 nolu process hi lmeyecei iin daemon yaptmz
uygulamann parent process'i hi sonlanmayacak, bu sayede daemon da arka planda
almaya devam edecektir. Herhangi bir ekilde sadece 1 nolu uygulamay sonlandrabiliyor
olsaydk dahi, tm daemon'larn anas 1 nolu process olduundan, ekirdek tarafndan tm
child process'leri de sonlandrlacakt.
56
Gml Linux
57
Gml Linux
# /etc/inittab
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
#
# Note below that we prefix the shell commands with a "-" to indicate to the
# shell that it is supposed to be a login shell. Normally this is handled by
# login, but since we are bypassing login in this case, BusyBox lets you do
# this yourself...
# Start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# Start an "askfirst" shell on /dev/tty2-4
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
# /sbin/getty invocations for selected ttys
tty5::respawn:/sbin/getty 38400 tty5
tty6::respawn:/sbin/getty 38400 tty6
# Example how to put a getty on a modem line.
#::respawn:/sbin/getty 115200 ttyS2
# Stuff to do when restarting the init process
::restart:/sbin/init
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
::sysinit:/etc/init.d/rcS
Dosyada bizi en ok ilgilendiren blm, sysinit ile belirtilen ksmlardr. Bu anahtar kelime
ile, init uygulamasna al srecinde bizim admza bir baka uygulamay balatmasn
sylyoruz. Yani al srecini init uygulamasna devretmekle kaybettiimiz kontrol,
sysinit ile tanmladmz uygulama zerinden tekrar geri alyoruz. Bu ekilde belirttiimiz
58
Gml Linux
yerine inittab dosyasnda tek bir sysinit ieren satrn yer almas ve altrlacak dier
mekanizmalarn ilgili uygulama ierisinden ynetilmesi tercih edilir.
::askfirst:-/bin/sh
Bu zel satr, ekirdein al srecinde de kullandmz n tanml sistem konsolu
zerinde, /bin/sh kabuunu balatacaktr. askfirst anahtar kelimesi sayesinde
karmza bir bilgi mesaj kacak ENTER tuuna basmamz halinde ise kabuk uygulamas
alacak ve kabuu kullanmaya balayabileceiz. Herhangi bir gvenlik kontrol iermeyen
bu mekanizma, gelitirme srecinin balangcnda iimize yarayabilir ancak daha sonra
devre d braklmaldr. Aksi takdirde sistemimize bir ekilde seri konsol balants yapmay
baaran birisi, dorudan sistem zerinde bir kabuk altrabilir.
tty2::askfirst:-/bin/sh
Konsolun haricinde benzer ekilde, tty2, tty3 ve tty4 sanal konsollarnda gvenlik kontrol
olmadan kabuk uygulamasnn balatlmas bu ekilde ntanml olarak rnek inittab
dosyasnda yer almaktadr. Eer sisteme bal bir monitor var ve bu sanal konsol
mekanizmasn kullanmak istiyorsak, aada anlatacamz ekilde askfirst ile deil,
parola korumasyla girii salamalyz. Ya da pek ok gml sistemde olduu gibi, bu
ekilde bir sanal konsol kullanmna ihtiyacmz yok ise, bu satrlarn inittab dosyasndan
karlmas yerinde olacaktr.
kullanc ad, parola kontroln yapacak, baarl olmas durumunda kullanc adna kabuk
uygulamasn balayacaktr.
respawn zel deyimi ise, init uygulamas tarafndan salanan ek bir zellik olup, ilgili
kuralda altrlmak zere belirtilen uygulama herhangi bir ekilde sonlanacak olursa,
otomatik olarak ayn parametrelerle yeniden balatlmasn (respawning) salar (init
uygulamas bu gibi fonksiyonlar salayabilmek adna da hi lmemelidir).
Respawn zellii gml sistemimizde bizim iin faydal bir kullanm alan bulabilir. rnek
olarak sisteminizde 3 adet nemli daemon yazdnz dnelim. 4. olarak da bu
daemon'larn alp almadn periyodik olarak kontrol eden ve srekli arka planda
alan bir uygulamanz olduunu dnelim, ad controller olsun. Eer controller
uygulamanzda uygulamann sonlanmasna neden olacak herhangi bir hata olursa, tm
59
Gml Linux
kontrol mekanizmas devre d kalacaktr. controller uygulamanz kontrol edecek ayr bir
uygulama yapsanz ayn sorun onun iin de geerli olacandan, hi bir zaman lmeyecek
bir uygulamadan yardm almamz gerekecektir ki bu uygulama init olmaktadr. Teorik
olarak bunun iin ekirdekten de yardm talep edebilirdik ancak Linux ekirdei byle ilere
bulamaz ve kullanc kipinde alan uygulamalardan ilk altrd init haricindekilere
zel bir muamele yapmaz. O yzden biz de init uygulamasnn yardmna bavurarak,
sistemdeki dier servisleri kontrol eden controller uygulamamz, respawn deyimiyle
/etc/inittab dosyasna yazp, init tarafndan sonlansa bile yeniden balayacak hale
getirebiliriz.
Bu noktada yle de dnebilirsiniz: zaten controller uygulama kodumuz ok basit
olacandan hi kmeyecek bir ey yazabiliriz. O yzden gene de init 'in yardmna
ihtiyacmz var m?
Doru bir soru, gidi yolundan puan verilebilir. Temel hedef tm hatalarn kontrol edildii ve
kmeyecek uygulamalar yazabilmek olmaldr. Aksi takdirde bu i tm uygulamalarn init
zerinden balatlmasna kadar gider ki bu ilemin burada ayrntsna girmeyeceimiz baka
zorluklar da vardr.
Fakat zellikle gml sistemler iin, sistemin salkl almas ve rnein uzaktan balant
yaplabilmeye devam etmesi iin gereken minimum servislerin her zaman alr durumda
olduunun kontroln yapan ve almayanlar yeniden balatan, belki bundan biraz daha
fazlasn da yapan genel bir controller yazlmnn kendisini init zerinden respawn ile
altrlacak ekilde balatmak daha doru bir davran olacaktr.
controller uygulamanz ok iyi yazm olabilirsiniz, ancak sistemdeki baka bir
uygulamann bellei tkettiini ve yeni bellek isteyen bir uygulama iin ekirdek ierisindeki
Out Of Memory Killer mekanizmasnn bellekte yer amak iin kulland algoritma sonucu
sizin controller process'inizi setiini ve onu sorgusuz sualsiz ldrdn dnelim
(ekirdek gerekten byle iler de yapmaktadr). Bu durumda sizin uygulamanz ok iyi
yazlm olsa bile beklentiniz dnda bir sonlanma da yaayabilirsiniz. Linux OOM Killer
algoritmasnn aday process seim srecinde controller uygulamanza daha dk deer
vermesini salamak iin yapabileceiniz baz ilemler bulunmaktadr. Ancak bunun gibi
farknda olamayabileceiniz detaylar nedeniyle, controller uygulamas iin init
uygulamasndan yardm talep etmemiz yerinde olacaktr, ayp karlanmaz.
60
Gml Linux
Gml sistemlerde seri port aygt dosyas isimlendirmeleri kullanlan teknoloji ve board
ailesine gre (ttyO1 vb.) deikenlik gsterebilmektedir. Bu blmde sistemin standart
konsolu veya dier seri portlar zerinde kullanc kimlik denetimi yaparak girie izin vermek
istediimiz aygtlar iin her biri ayr bir satrda yer alacak ekilde ayarlamalarmz yapabiliriz.
::restart:/sbin/init
Bu ayar bir miktar kafa kartrc olabilir. Bazen SIGHUP sinyali gndererek /etc/inittab
dosyasnn yeniden okunmasn salamak yeterli olmaz ve init srecini yeniden
balatmak gerekir. Init srecini yeniden balatmak istediimizde (restart), hangi uygulamann
altrlacan sylyor. Baz zel senaryolarda, sistemin kk dizinini alma srasnda
deitirmeniz gerekebilir. Yeni kk dizinde farkl bir /sbin/init versiyonu da yer alabilir.
Buradaki ntanml davranla init 'e restart eyleminde gene /sbin/init uygulamasnn
altrlacan sylemi oluyoruz.
SORU: Peki bu ekilde bir restart ilemi sonucunda yeni oluacak init process'in PID
deeri 1'den byk olmayacak mdr?
::ctrlaltdel:/sbin/reboot
Bu deyim zellikle X86 tabanl sistemlerde klavyeden CTRL-ALT-DEL tularna basldnda
tetiklenen sistemi yeniden balatma ileminde hangi uygulamann alacan
gstermektedir.
::shutdown:/bin/umount -a -r
Shutdown anahtar kelimesi ile yer alan satrlar, sistem kapatlrken hangi uygulamalarn
alacan belirtir. Birden fazla tekrar edildiinde, kapan srasnda inittab dosyasnda
yer ald sralama ile ilgili komutlar altrlacaktr.
Shutdown anahtar kelimesinin tekrarndan oluan satrlar ile kapan srasnda birden fazla
ilem yapmak yerine,
::shutdown:/etc/kapanis
rneindeki gibi tm sreci bir betik uygulamasna ynlendirip, betik ierisinde gereken dier
tm ilemleri yapmanz daha doru olacaktr.
61
Gml Linux
yapabiliriz:
$ busybox mkdir yeni
Eer busybox uygulamasn derlerken mkdir fonksiyonlarn ieren applet 'i de dahil etmi
isek, ilem gerekleecektir.
Busybox uygulamamz ierisinde hangi fonksiyonlara destek olduunu grmek iin,
uygulamay parametre vermeden altrp kty inceleyebiliriz:
62
Gml Linux
$ busybox
Usage: busybox [function [arguments]...]
or: busybox --list[-full]
or: busybox --install [-s] [DIR]
or: function [arguments]...
BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use and BusyBox
will act like whatever it was invoked as.
Currently defined functions:
[, [[, acpid, add-shell, addgroup, adduser, adjtimex, arp, arping, ash, awk, base64, basename, beep,
bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt,
crond, crontab, cryptpw, cttyhack, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, d
dnsdomainname, dos2unix, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, et
fatattr, fbset, fbsplash, fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs, flock, fold, free
ftpd, ftpget, ftpput, fuser, getopt, getty, grep, groups, gunzip, gzip, halt, hd, hdparm, head, hexdu
ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd, init, insmod, install, ionice, iostat, ip, ipaddr,
iptunnel, kbd_mode, kill, killall, killall5, klogd, last, less, linux32, linux64, linuxrc, ln, loadfo
losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lsof, lspci, lsusb, lzcat, lzma, lzop, lzopcat, makedevs,
mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, mo
mpstat, mt, mv, nameif, nanddump, nandwrite, nbd-client, nc, netstat, nice, nmeter, nohup, nslookup,
ping, ping6, pipe_progress, pivot_root, pkill, pmap, popmaildir, poweroff, powertop, printenv, printf
rdate, rdev, readahead, readlink, readprofile, realpath, reboot, reformime, remove-shell, renice, res
rpm2cpio, rtcwake, run-parts, runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq
setlogcons, setserial, setsid, setuidgid, sh, sha1sum, sha256sum, sha3sum, sha512sum, showkey, shuf,
split, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_
tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, tracerout
ubidetach, ubimkvol, ubirmvol, ubirsvol, ubiupdatevol, udhcpc, udhcpd, udpsvd, umount, uname, unexpan
unzip, uptime, users, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, wall, watch, watchdog,
xzcat, yes, zcat, zcip
63
Gml Linux
arlma biimi busybox dndaki bir deer ise ve bu deere ilikin destekler uygulama
ierisinde derlenmise, kendi iinde ilgili fonksiyonu armak suretiyle istenen amac
gerekletirmektedir.
Konfigrasyon ve Derleme
Busybox ierisinde pek ok bileenle geldiinden, derleme sreci ncesinde hangi
bileenlerden oluan bir busybox uygulamas retmek istediimizi belirlememiz, bunun iin
bir konfigrasyon dosyas retmemiz gerekiyor.
Seenek / kombinasyon says bir kernel derleme sreci kadar devasa olmasa da, hatr
saylr miktarda seenek kmesi olduunu syleyebiliriz. Tpk kernel derleme
konfigrasyonu srecinde olduu gibi, busybox konfigrasyon ve derleme ilemleri iin de
Kbuild sistemi kullanlmaktadr.
Menuconfig arayz zerinden konfigrasyon srecimizin hedefi olan .config dosyasn
retebiliriz. Bunun iin make menuconfig veya aadaki make hedeflerinden biriyle
.config dosyamz oluturabiliriz:
Make Hedefi
Aklama
menuconfig
defconfig
allyesconfig
allnoconfig
android_defconfig
komutuyla derleme ilemi yaplabilir. Paralel derleme zelliini -j parametresi ile devreye
alp (genelde ilemci ekirdek saysnn 2 katna kadar deer girebilirsiniz) derleme srecini
hzlandrabilirsiniz:
$ make -j 8
64
Gml Linux
Yukardaki rnekte ARM mimarisi iin apraz derleme ilemi sonras busybox uygulamas ve
gerekli linkleri, /opt/cross/rootfs dizini altnda oluturulacaktr.
65
Gml Linux
Yukardaki gibi minik dosya sistemimizi /opt/cross/rootfs dizini altnda hazr ettikten sonra,
bu dizini NFS sunucumuz zerinden paylama ap, cihazmz zerinden yeni
oluturduumuz bu dosya sistemiyle al yapmay deneyelim.
[ 5.320738] IP-Config: Guessing netmask 255.255.255.0
[ 5.326212] IP-Config: Complete:
[ 5.394642] Kernel panic - not syncing: No init found. Try passing init= option to kernel. See Li
66
Gml Linux
lib dizini dahi henz sistemimizde mevcut deildir. Yapmamz gereken, hedef platform iin
67
Gml Linux
Sistemimizi tekrar NFS zerinden atmzda problemin devam ettiini greceiz. Busybox
uygulamamzn ihtiya duyduu ktphaneleri kk dosya sistemimize attk ancak paylaml
ktphane bamll olan herhangi bir uygulamay altrabilmek iin ayn zamanda
ld.so ktphanesine de ihtiya bulunmaktadr. Bu ktphane toolchain versiyonlarna gre
ld-linux.so.2 , ld-linux.so.3 , ld-linux-armhf.so.3 gibi isimlerde bulunabilir. Bizim
ARM eabihf toolchain ile alan sistemimiz iin son bir ilem daha yapmamz gerekiyor. ldlinux-armhf.so.3 loader uygulamas, ayn anda eabihf ve eabi sistemleri destekleyebilmek
iin, ykleyecei dier ktphaneleri /lib/arm-linux-gnueabihf dizini altnda arar. Ayn anda
her iki ARM ABI ile almak pek karlalan bir durum deildir. Bu nedenle genellikle
/lib/arm-linux-gnueabihf dizini /lib dizinini gsteren bir sembolik link olarak oluturulur:
/etc/inittab yiletirmeleri
Artk alan bir sistemimiz var. Fakat greceiniz zere seri konsol ekranmzda aadaki
mesajlar srekli olarak kmakta:
can't open /dev/tty2: No such file or directory
can't open /dev/tty3: No such file or directory
can't open /dev/tty4: No such file or directory
can't open /dev/tty2: No such file or directory
can't open /dev/tty3: No such file or directory
can't open /dev/tty4: No such file or directory
...
68
Gml Linux
detaylandrlmtr.
Sistemimiz iin aadaki inittab dosyasn kullanacaz:
::sysinit:/etc/acilis
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/etc/kapanis
/etc/acilis dosyamz henz hazrlamadmz iin onunla ilgili aldmz hata normaldir.
Ancak sonrasnda srekli /dev/null dosyasnn yer almadna dair hatalar almaktayz ve
bu hata mesajlar yznden gene konsolumuzu kullanamyoruz. Kullandmz ekirdek
ierisinde DEVTMPFS ve DEVTMPFS_MOUNT destei aktr dolaysyla /dev dizini
altndaki aygt dosyalarnn ekirdek tarafndan otomatik retilmesi gerekirdi (detaylar iin
Devtmps Dosya Sistemi blmne baknz). Buna ramen /dev dizini altna bu zel
dosya sisteminin ekirdek tarafndan otomatik olarak balanamadn gryoruz. Bunun ok
basit bir nedeni var: minik dosya sistemimizde henz /dev dizini mevcut deil.
Mount ileminin baarl olabilmesi iin gerekli artlardan biri, mount edilecek dizinin de
ncesinde sistemde bulunmasdr (rneimizde /dev dizini).
Bu sorunu zmek iin kk dosya sistemimizde aadaki komutla /dev dizinini
oluturalm:
$ mkdir /opt/cross/rootfs/dev
69
Gml Linux
Nihayet sistemimizi grece uygun bir ekilde amay baardk. Mesajlar incelediimizde
devtmpfs mount ileminin gerekletiini gryoruz. /etc/acilis betiimiz henz hazr
olmadndan hata alyoruz ancak konsola dmeyi baardk. ls /dev komutuyla /dev
dizini altndaki dosyalar grebiliriz.
imdi alan uygulamalarn listesini ps komutuyla almay deneyelim:
/ # ps
PID USER TIME COMMAND
ps: can't open '/proc': No such file or directory
Grld zere /proc dizininin sistemde olmadna dair bir hata alyoruz ve process
listesini de gremiyoruz.
Sistemimizi yeniden balatmay deneyelim:
/ # reboot
reboot: can't open '/proc': No such file or directory
Bu ilem iin de /proc dizinine ihtiya olduu grlyor. alan bir Linux sisteminde proc
dosya sisteminin /proc altna mount edilmi durumda olmas nemlidir. Bu dizin altndaki
pek ok dosya ve dizin zerinden, kullanc kipindeki uygulamalar ekirdek ile haberleebilir
ve bir takm ilemleri gerekletirebilirler.
u ana kadar proc dosya sistemini mount etmi olmamamza ramen sistemimiz yeterince ilevsel olmasa da- alyordu, dolaysyla bu tarz ilemler iin ekirdek tarafndan
bir yardm beklememeliyiz. Bu sreci kullanc kipinde gerekletirmemiz lazm. Sistem her
aldnda mount komutu ile proc dosya sistemini /proc dizini altna balamalyz.
/dev dizini iin yaptmz rnekte olduu gibi, ncesinde /proc dizinini kk dosya
sistemimizde oluturalm:
$ mkdir /opt/cross/rootfs/proc
70
Gml Linux
#! /bin/sh
echo "Sistem acilisi basladi"
echo "proc dosya sistemi baglaniyor"
mount -t proc none /proc
Tekrar sistemi NFS zerinden atmzda hi hata almadan sistemin aldn grebiliriz:
[ 5.374822] devtmpfs: mounted
[ 5.378254] Freeing init memory: 216K
Sistem acilisi basladi
proc dosya sistemi baglaniyor
Please press Enter to activate this console.
/ #
Artk ps , top , ifconfig , reboot vb. pek ok uygulama olmas gerektii gibi almaya
balayacaktr. reboot komutunu tekrar deneyelim:
/ # reboot
can't run '/etc/kapanis': No such file or directory
The system is going down NOW!
Sent SIGTERM to all processes
Reboot gerekleti ancak /etc/kapanis uygulamas henz hazr olmadndan bir hata
mesaj aldk. Bu dosyay da oluturalm. Temel olarak kapan srecinde, tm mount edilmi
dosya sistemlerinin unmount edilmesini salamamz yerinde olacaktr. Unmount ilemi Linux
Page Cache tablolarnn depolama ortamlarna yazlmasn tetikler, bylece kapan
srasnda veri kayb sorunu yaamazsnz. Aksi takdirde Write-Back mekanizmas nedeniyle
veri kayplaryla karlaabilirsiniz.
#! /bin/sh
echo "Sistem kapatiliyor"
umount -a -r
71
Gml Linux
72
Gml Linux
73
Gml Linux
Kk dosya sistemini dm-crypt veya benzeri bir encrypted dosya sistemi ile birlikte nasl
kullanabiliriz? Bu tarz bir dosya sisteminin kullanlabilmesi iin ncesinde gereken
cryptsetup vb. uygulamalarn kk dosya sistemi mount edilmeden nasl
altracaz?
Asl veya yedek kk dosya sistemlerimizin her ikisinde birden sorun olmas veya
sistemin bir ekilde kk dosya sistemine eriememesi durumunda kernel panic
durumuna dmek yerine, otomatik olarak recovery amal kullanlabilecek bir ortam
salanabilir mi? Hatta bu recovery ortamna SSH vb. bir protokolle uzaktan balanmak
mmkn olur mu?
Sorular daha da artrabiliriz. Dikkat edilirse bu sorulara olumlu yantlar verebilmek iin, Linux
kernel tarafnda kk dosya sistemini mount etme ileminden nce, sorumuza bal olarak
zel bir takm ek ilemler yaplmas gerektii grnmektedir. Szgelimi dm-crypt ile
encrypted bir kk dosya sistemi kullanyorsak, kernel tarafndan n hazrlklarn yaplmas
gerekiyor. Eer dm-crypt yerine encfs kullanmak istersek, bu defa kernel tarafnda baka
ilemlerin yaplmas gerekecekti. Yukardaki sorularn her biri ve burada listelemediimiz
dier pek ok soru iin Linux kernel tarafnda ayr ayr ek destek gerekiyor. Byle bir ilem
kernel tarafnda mmkn mdr?
imdiye kadar rendiklerimizi bir kenara atmamza gerek yok, Linux kernel al srecinin
son ksmlar olduka basittir: kk dosya sistemini mount et ve ierisinden bir adet
uygulamay altr.
Yukardaki sorunlara zm retebilmek iin Linux kernel tarafnda karmak ilemler
yapmak yerine, daha basit bir yaklam gelitirilmitir: 2 aamal al yntemi
Bu yntem balangta genelde sadece Linux datm gelitiricileri iin nemliydi ancak
gnmzde pek ok gml sistemde de nemli kullanm alanlar bulmaktadr.
74
Gml Linux
$ file /boot/initrd.img-3.16-2-amd64
/boot/initrd.img-3.16-2-amd64: gzip compressed data,
last modified: Wed Dec 10 00:23:17 2014, from Unix
.gz gibi bir uzant verilmi olmamakla birlikte dosyann gzip ile sktrlm olduu
$ file /tmp/initrd
initrd: ASCII cpio archive (SVR4 with no CRC)
eklinde dosyann bir cpio arivi olduunu reniyoruz. Bo bir dizin oluturup, cpio -id
parametresiyle bu arivi yeni oluturduumuz dizin ierisine aabiliriz:
$ mkdir /tmp/image
$ cd /tmp/image
$ cpio -id < /tmp/initrd
90871 blocks
$ ls
bin conf etc init lib lib64 run sbin scripts
Initrd imajnn ierisine grebilmi olduk. Burada yer alan init uygulamas initrd al
ynteminde kullanlan ilk uygulamadr. ounlukla bir kabuk uygulamas olduundan
herhangi bir metin editr ile ieriini ap inceleyebiliriz.
Initrd imaj bu rnekte olduu gibi kernel imajndan ayr bir dosyada tutulur. Boot ykleyici
uygulama initrd al srecinde ncelikle bulunduu ortamdan kernel imajn bellee ykler.
Sonrasnda benzer ekilde initrd imajn da bulunduu yerden bellee ykler ve kernel
alnda initrd imajnn bellekte bulunduu adresi kernel tarafna bildirir. Kernel bu ekilde
balatldnda kk dosya sistemini geleneksel biimde mount etmeyi denemek yerine, initrd
imajnn ieriini RAM Disk yntemiyle bellee aar ve at yeri kk dosya sistemi olarak
kullanr. Geleneksel alta kk dosya sistemi mount edildikten sonra ntanml olarak
/sbin/init altrlyorken, initrd sistemiyle al gerekletirildiinde kk dizindeki /init
uygulamas altrlr.
zetle Linux kernel tarafnda daha nce renmi olduumuz al sistematii korunmakta,
gene sadece bir adet kk dosya sistemi mount edilmekte ve ierisinden bir adet uygulama
altrlmaktadr.
75
Gml Linux
Ancak root dosya sistemi fiziksel bir medya zerinden deil, boot ykleyici tarafndan
ncesinde bellee aktarlm bir imaj zerinden gereklemekte ve ilk alan uygulama
/init olmaktadr.
Al Sreci
Her iki yntemde kernel tarafndan altrlan ilk uygulama /init eklindedir.
/init uygulamasndaki yapabileceklerimizin snr, initramfs kk dosya sistemine dahil
ettiimiz aralarla snrldr. ok kk bir imaj yaplabilecei gibi ok daha gelimi bir
dosya sistemi ve uygulamalardan oluan bir imak da retilebilir.
76
Gml Linux
Bu noktada konuya balarken sorduumuz sorularn tmne cevaplar retebiliriz zira artk
kernel katmannda deil, kullanc kipinde almaktayz ve istediimiz her trl uygulamay
sistemimize dahil edebilir veya gelitirip kullanabiliriz.
rnek olarak encrypted kk dosya sistemi kullanacaksak, gerekli aralar initramfs
imajmzn ierisine dahil edip, asl dosya sistemini mount etmeyi denemeden nce
sistemimizi uygun ekilde hazrlayabiliriz.
Yedek dosya sistemi senaryosunda, asl dosya sistemini mount etme ilemimiz baarsz
olursa veya mount etmemize ramen ierisindeki belirli dosyalarn md5sum deerleri
beklediimizden farkl ise, unmount ilemiyle vazgeebilir ve yedek dosya sistemini mount
edebiliriz.
USB veriyolunda belirli zelliklere sahip bir disk var ise, ierisinde gvenlik/imza kontrol de
yapp sistemi ierisindeki dosyalarla gncelleyebilir veya sistemin bir yedeini ilgili disk
zerine geri kopyalayabiliriz.
Bu ekilde snrsz sayda senaryo retilebilir. Artk kullanc kipinde altmz iin senaryo
saysnn bizim iin (ve de kernel iin) bir nemi yoktur. Herhangi bir ilem artk yaplabilir
durumdadr.
Bu ekildeki 2 aamal al srelerinde, /init uygulamasndan son olarak asl kk
dosya sistemini belirlemesi ve sistemin initramfs imajn gsteren kk dizinini, asl kk dosya
sistemini gsterecek ekilde deitirmesi beklenir.
Aada rnek bir /init betii grlmektedir:
#!/bin/sh
# get_opt("init=/sbin/init") will return "/sbin/init"
get_opt() {
echo "$@" | cut -d "=" -f 2
}
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
# devtmpfs does not get automounted for initramfs
mount -t devtmpfs devtmpfs /dev
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs tmpfs /tmp
77
Gml Linux
# Sistem spesifik
# USB
modprobe musb_hdrc
modprobe ti81xx
modprobe sd_mod
modprobe usb-storage
modprobe omap_hsmmc
modprobe mmc_block
modprobe ext4
echo "# Checking usb startup disk"
sleep 3
mkdir -p /mnt/usb
mount -t vfat /dev/sda /mnt/usb 2> /dev/null || \
mount -t vfat /dev/sda1 /mnt/usb 2> /dev/null
if [ -e "/mnt/usb/upgrade/run.sh" ]; then
echo "SCRIPT CALISTIRILIYOR..."
sh /mnt/usb/upgrade/run.sh
umount /mnt/usb
fi
# Defaults
init="/sbin/init"
root="/dev/mmcblk0p2"
mnt_point="/mnt/rootfs"
# Process command line options
for i in $(cat /proc/cmdline); do
case $i in
root\=*)
root=$(get_opt $i)
;;
init\=*)
init=$(get_opt $i)
;;
esac
done
# Mount the root device
mount "${root}" $mnt_point
#Check if $init exists and is executable
if [[ -x "$mnt_point/${init}" ]] ; then
mount --move /sys $mnt_point/sys
mount --move /dev $mnt_point/dev
mount --move /tmp $mnt_point/tmp
#Switch to the new root and execute init
exec switch_root $mnt_point "${init}"
78
Gml Linux
fi
#This will only be run if the exec above failed
echo "Failed to switch_root, dropping to a shell"
exec sh
/init betiimiz ok daha karmak ilemler yapyor olabilir. Burada fikir vermesi asndan
ufak bir implementasyon yaplm ve zellikle bir ka ufak iyiletirme yaplabilecek nokta
braklmtr. Bunlarn neler olabileceini bulmaya almak retici olabilir.
Initramfs sreciyle ilgili nemli bir not eklemekte fayda gryoruz. Bu ekilde al
gerekletirildiinde, ilerleyen aamalarda deineceimiz devtmpfs dosya sistemi henz
mount edilmi durumda deildir. Dahas bu mount ilemini bizim yapmamz gerekmektedir.
/init betiinin ilk satrlarnda bu blm grmekteyiz. Ancak bir sorun daha var ki, /init
79
Gml Linux
edilmi bir alan zerinde otomatik olarak retilebilir. Gml sistemler iin olduka
uygundur, Linux datmlarnda da kullanlmaya baland grlmektedir.
devtmpfs zellii, Linux ekirdeinin 2.6.32 versiyonuyla birlikte sunulmaya balanmtr.
80
Gml Linux
bu seenek aktif ise, al srasnda devtmpfs zel dosya sistemini aadaki gibi bir
komutla sizin mount etmeniz gerekir:
mount -t devtmpfs none /dev
mount ettiinde, otomatik olarak devtmpfs dosya sistemini de /dev dizini altna mount
eder. Bu senaryoda al srecinden bizim yukardaki gibi mount komutuyla ek bir ilem
yapmamza gerek kalmaz. nerilen yntem her iki seenein de aktif edilmesidir.
Bu iki zellik sayesinde, /dev dizini altnda sadece o an sistemde mevcut olan aygtlara
ilikin dosyalarn barndrlmas garantilenmi olur. lgili aygt kartldnda veya ekirdek
modl kaldrldnda, ilikili aygt dosyalar da ekirdek tarafndan kaldrlr (rnein usb
seri port eviricinin kartlmas durumu).
81
Gml Linux
82
Gml Linux
83
Gml Linux
arm-linux-gnueabihf
Toolchain isimlendirmelerinde genellikle arch [-vendor] [-os] - eabi sistematii takip edilir.
rnein arm-none-linux-gnueabi toolchain'i iin hedef mimari arm, retici belirtilmemi o
yzden none, iletim sistemi linux ve ABI versiyonu gnueabi olarak belirtilmek istenmitir.
Bu toolchain ile ARM Linux EABI binary formatnda dosyalar retebileceimizi dnebiliriz.
Dier bir rnee baktmzda retici alannda fsl ibaresini grmekteyiz. Bu da bize ilgili
toolchain'in FreeScale firmas tarafndan retildiini gsteriyor.
Arm-none-eabi rnei ise dierlerinden biraz daha farkl bir yerde duruyor, ierisinde hi
linux ibaresi gemiyor yani iletim sistemi ksm yok. Bu toolchain iletim sistemi olmayan bir
ortamda dorudan ARM ilemci zerinde koacak kodlarn retimi iin kullanlacaktr.
Dolaysyla bu toolchain ile kod retirken harici ktphaneler kullanmak ve linklemek
(dinamik veya statik) mmkn olmayacaktr.
Arm-linux-gnueabihf toolchain'indeki hf ibaresi, ABI tipini gstermekte olup aada bu
konuya deinilmitir.
84
Gml Linux
Bu nedenle EABI iin hard floating point destekli, eabihf toolchain'leri ortaya kmtr.
Donanmnzn desteklemesi halinde sisteminizde yer alan tm bileenlerin (ktphaneler ve
uygulamalar) eabihf toolchain'i tarafndan derlenmesi halinde, nemli oranda performans
kazanm elde edilebilmektedir. eabihf toolchain'lerinde -mfpu=vfp veya -mfpu=neon
derleyici parametreleri ile donanmza zg hzlandrmalar aktive edebilirsiniz.
85
Gml Linux
NOT: ABI versiyonlar iin verdiimiz rnekler ARM mimarisi iin geerlidir. Farkl
mimarilerde farkl ABI'ler bulunmaktadr. rnein MIPS iin o32, o64, n32 ve n64
olmak zere 4 farkl ABI bulunmaktadr. ok daha eski bir mimari olmasna ramen,
bunun gibi pek ok dokmanda rnek olarak dahi yer alamyor olmas, ARM
mimarisinin gml Linux sistemler pazarndaki hakimiyetine dair fikir verebilir. Her
geen yl bu fark almaktadr.
Toolchain Edinme
Toolchain'ler hazr biimde indirilip kullanlabilecei gibi, sfrdan bir toolchain retmek de
mmkndr.
Toolchain retimi olduka zahmetli ve uzun zaman alan bir sretir. Bu sreci
kolaylatrmay amalayan, crosstool ve crosstool-ng projeleri bulunmakla birlikte ou
durumda hazr bir toolchain ile projelere devam edilmesi nerilir. Kendi rettiiniz toolchain
zerinden ilgili mimari iin retilen kodlarda herhangi bir sknt var ise, bunun alglanmas ve
zlmesi ok ciddi zaman kayplar getirebilir. Daha da kts, gelitirme ortamnda her ey
yolundaym gibi grnrken, proje sahaya ktktan sonra kaotik durumlar ile
karlaabilirsiniz.
Hazr bir toolchain kullandnzda byle bir sorunla karlama riskiniz ok daha dktr.
Zira ayn toolchain tm dnyada pek ok projede kullanldndan, toolchain'in kendisinde bir
problem varsa bunun tespit edilmesi ve dzeltilmesi kolay olacaktr. Ayrca donanmn
reticisi tarafndan uzun zaman test edilmi ve mterilere nerilen bir toolchain versiyonu
varsa, elbette onun kullanlmas da uygun olacaktr.
Peki ne zaman sfrdan bir toolchain retmek anlaml olabilir?
ncelikle sylemek gerekir ki, yukarda zel toolchain retiminin dezavantajlar adna
sylediklerimiz donanm reticileri iin de geerlidir. Onlar da tm bu ekosistem tarafndan
retilen bilgi birikimini kullanmak ve kendi toolchain baznda kendilerine zg bir problemi
satn almamamak isterler.
Fakat bazen donanm reticisinden gelen toolchain versiyonu ok eski olabilir. erisinden
kan glibc standart C kitaplnn versiyonu ok dk ise, alageldiiniz baz
fonksiyonlar bulamayacanzdan gelitirme yaparken bir miktar konfor kaybna
urayabilirsiniz.
rnein glibc 2.5 versiyonu kullanlyorsa, asprinf() fonksiyonu C kitaplnda yer
almayacaktr. Veya glibc 2.12 ncesinde bir versiyon kullanlyorsa, getsubopt()
fonksiyonu yer almayacaktr. Bu sorunlar zmek adna versiyonu ykseltmek iin gene
hazr bir toolchain kullanabilirsiniz. Ancak byle bir durumla karlatnzda muhtemelen
86
Gml Linux
Toolchain Salayclar
Gnmzde ARM platformu gml Linux sistemleri dnyasn domine ettii iin, daha ok
bu platforma zg opsiyonlar incelediimizde, aadaki toolchain salayclarnn ne
ktn grmekteyiz:
Mentor Graphics / Sourcery CodeBench: Destek ile birlikte satlan cretli
versiyonlarnn yan sra, kayt formunu doldurup cretsiz olarak kullanlabilecek Lite
versiyonlar da bulunmaktadr. Uzun yllardr bu alanda alan deneyimli bir firma olup
gml Linux dnyasnda youn bir kullanm mevcuttur. ARM, MIPS, PowerPC,
SuperH mimarileri iin toolchain retimi yapmaktadrlar.
Linaro: zellikle ARM platformu ve hard-float toolchain'ler zerinde almaktadrlar.
Her geen gn kullanm artmaktadr.
Linux Datmlar: Debian GNU/Linux, Ubuntu gibi datmlarda ARM mimarisi iin
gcc-arm-linux-gnueabi ve gcc-arm-linux-gnueabihf paketlerini kurmak suretiyle paket
Kullanm
Toolchain arivini sisteminizdeki bir dizine atnzda, arm-none-linux-gnueabi-gcc
rneindeki gibi derleyici aralarna ait dosyalar oluacaktr. Toolchain n ekleri ounlukla
buradakine benzer olmakla birlikte nceki blmlerde deindiimiz ekilde, deikenlik de
gsterebilir.
Eer toolchain ierisinde kullanlan n ek, arm-none-linux-gnueabi- eklinde uzun
olduunda alkanlk, kolaylk vb. nedenlerle, arm-linux- n ekini kullanmak isterseniz,
toolchain bin dizinine gidip, aadaki gibi bir komutla sembolik linkler oluturmak suretiyle,
hem arm-linux-gcc eklinde hem de arm-none-linux-gnueabi-gcc eklinde derleyici
altrmanz mmkn olacaktr:
$ cd /path/to/toolchain/bin && \
for i in `ls`; do s=`echo $i | cut -b 24-`; ln -s $i arm-linux-$s; done
Toolchain ierisinden kan derleyici altrmak iin ya bulunduu yerin mutlak yolunu
(absolute path) vermeli, ya da toolchain bin dizinini PATH ortam deikeninize ekleyip,
sadece derleyici adn vererek altrmalsnz: deikeninimize toolchain bin dizinini
apraz Derleme ve Gerekli Ekipmanlar
87
Gml Linux
ekleyebiliriz:
$ export PATH=$PATH:/path/to/toolchain/bin
$ arm-linux-gcc -v
PATH ortam deikenini bu ekilde her bir kabuk oturumu iin ayarlayabilir veya
COLLECT_LTO_WRAPPER=/home/demirten/work/downloads/arm-2011.03/bin/../libexec/gcc/arm-none-linux-gnuea
Target: arm-none-linux-gnueabi
Configured with: /scratch/janisjo/arm-linux-lite/src/gcc-4.5-2011.03/configure \
--build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi \
--enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch \
--enable-extra-sgxxlite-multilibs --with-arch=armv5te --with-gnu-as --with-gnu-ld \
-with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/janisjo/arm
--with-gmp=/scratch/janisjo/arm-linux-lite/obj/host-libs-2011.03-41-arm-none-linux-gnueabi-i686-pc-li
--with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' \
--with-cloog=/scratch/janisjo/arm-linux-lite/obj/host-libs-2011.03-41-arm-none-linux-gnueabi-i686-pc-
88
Gml Linux
rnek olarak, eer Sqlite C arayzn kullanan bir uygulama gelitiriyorsanz, uygulamay
apraz derlemeye balamadan nce, sqlite ktphanesini hedef platform iin derlemeli,
balk dosyalarn ve ktphanelerini belirli bir dizinde oluturmalsnz. Bu admdan sonra
yazm olduunuz uygulamay da hedef platform iin derleyebilirsiniz.
rnekten yola karak yle bir soru sorabiliriz: Sqlite ktphanesini bu ekilde derlemek
zorunda kalmak yerine toolchain reticisi ayn derleme ilemini yapp, balk ve
ktphaneleri toolchain ierisine dahil etse daha iyi olmaz myd?
Bu mmkndr hatta baz toolchain'lerde gml sistemlerde sk kullanlan ktphanelerin
nceden derlenip hazr halde sunulduunu grmekteyiz. Toolchain retiminde verilen bu
trden ek kararlar, oluan toolchain'lerin boyutlarnn birbirinden farkl olmasna yol
amaktadr.
Kullanlan toolchain ierisinde ihtiya duyulan tm ktphane ve balk dosyalarnn
bulunmas olanakszdr. Dolaysyla uygulamamzn ihtiya duyduu dier ktphanelerin
derlenmesi ilemi kanlmaz olarak ihtiya duyulduka yaplmas gereken bir sretir.
htiya duyulan tm dosyalar belirli bir dizin yaps altnda birletirebilmemiz halinde apraz
derleme ilemlerini ok daha kolay hale getirebiliriz. rnek olarak /opt/cross eklinde bir
dizin ap, balk dosyalarn /opt/cross/usr/include , ktphane dosyalarn ise
/opt/cross/usr/lib dizini altnda topladmz varsayalm. Yeni nesil gcc derleyicilerinde
Sysroot parametresiyle salanan bu kolaylk, Buildroot gibi hedef mimari iin derleme ve
dosya sistemi retimi srelerini modellemeyi amalayan projelerde youn olarak
kullanlmaktadr. Buildroot ile yeni bir projeye balandnda, staging adnda bir dizin
oluturulmakta ve ncelikle toolchain ierisinden kan balk dosyalar staging/usr/include
dizinine, ktphane dosyalar ise staging/usr/lib dizinine kopyalanmaktadr. Sonrasnda
Buildroot ierisinde seilmi tm ktphaneler iin derleme yapldka ortaya kan yeni
ktphane ve balk dosyalar da bu dizinler altnda oluturulmaya devam etmektedir.
Bylelikle host bilgisayarmzdaki /usr/include ve /usr/lib dizin yapsna benzer ekilde
staging dizini altnda bileenler hazr hale getirilmektedir. Yaplan tm apraz derleme
pkg-config
apraz Derleme ve Gerekli Ekipmanlar
89
Gml Linux
Bu komut sonrasnda (configure aamasnda verilen prefix deerine bal olarak) balk
dosyalar /opt/cross/usr/include , ktphane dosyalar /opt/cross/usr/lib ve .pc
dosyalar /opt/cross/usr/lib/pkgconfig dizini altna kopyalanacaktr.
DESTDIR ortam deikenini kullanmaz isek kopyalama ilemi hedef platform yerine,
derleme senaryolarnda bu duruma mdahale etmez isek, host sisteminde yer alan
ktphaneler iin yantlar reyecektir. PKG_CONFIG_PATH ortam deikenini kullanarak,
uygulamann veritaban olarak farkl bir dizine bakmasn salayabiliriz:
$ PKG_CONFIG_PATH=/opt/cross/usr/lib/pkgconfig ./configure --host=arm-linux
90
Gml Linux
Bu rnekte
Kaynak koddan derleme srecinde x86 Linux gelitirme bilgisayarndaki derleme
aralarnn kullanlaca [--build]
lem sonucunda oluacak gcc uygulamasnn ARM zerinde alaca [--host]
Derleme sonras oluacak gcc uygulamasnn x86 mimarisi iin kod retecei [-target]
tanmlanm oluyor. Derleme bittikten sonra oluacak gcc uygulamas ARM zerinde
alacak, ancak rettii kod x86 mimarisi iin olacaktr (ARM zerinden apraz
derlemeyle x86 kodu retilecektir)
91
Gml Linux
92
Gml Linux
Linux kernel kodu, busybox gibi uygulamalarn Makefile dosyalarnda aadaki gibi bir
tanm bulunur:
CC = $(CROSS_COMPILE)gcc
93
Gml Linux
NOR Flash
NOR Flash tipi depolama aygtna ilemci tarafndan dorudan rastgele eriim
yaplabilmekte ve okunan kodlar dorudan altrlabilmektedir (XIP - eXecute-In-Place).
Geleneksel yntemlerin aksine, NOR Flash'tan okunan bir makine kodunun altrlmadan
nce RAM'e kopyalanmasna gerek yoktur.
Bu zellik NOR flash tipini zellikle bootloader, BIOS gibi uygulamalar iin daha iyi bir
seenek haline getirmektedir.
Okuma performans iyi olmasna ramen, yazma performans NAND flash tipine gre
dktr. Bu problem NOR flash'lar genel bir depolama birimi olarak kullanma noktasnda
dezavantajl konuma getirmektedir. Ayrca zaman ierisinde NAND flash kapasitelerinin
artmas ve fiyatlarnn dmesi, NOR flash kullanmn nemli oranda drm ve kullanm
belirli alanlarla snrlanmtr.
94
Gml Linux
NAND Flash
NAND Flash depolama aygt son yllarda geni bir kullanm alan bulmu, birim maliyeti
dm ve kapasitesi artmtr. Ancak NOR Flash tipinden farkl olarak, CPU tarafndan
dorudan eriilip kod altrlamaz. NAND controller zerinden eriilip ierisinde yer alan
kodlar RAM'e aktarldktan sonra ilemci tarafndan iletilebilir.
NAND Flash'n bir dier problemi, retim srecinden belirli bir oranda bozuk blokla
(badblocks) kyor olmasdr. reticiler, %1'e kadar olan bozuk blok orann kabul edilebilir
bulmakta ve yaptklar testlerde bulunan bozuk bloklar, ilgili bloun OOB (Out-Of-Band)
alanna MBBM (Manufacturer's Bad Block Marker) zel iareti ile yazmaktadr.
Fabrika k iaretlenmi bozuk bloklarn yan sra, kullanm srasnda da yeni bozuk
bloklar oluacaktr. Bunlarn alglanmas ve benzer ekilde bir daha kullanlmamas iin
iaretlenmesi gereklidir.
Yukardaki maddeler nda, NAND Flash tabanl bir depolama aygtn verimli
kullanabilmek iin, donanm zerinde veya kernel seviyesindeki yazlmla NAND Flash
zerinde yaplacak ilemlerin ynetilmesi gerekmektedir.
Gnmzde 2 tr NAND Flash depolama aygt bulunmaktadr. Birinci tr, ierdii Flash
Translation Layer sayesinde st katmanda standart bir blok aygt gibi grnrken, ikinci tr
raw flash aygtlar olarak adlandrlr ve iletim sistemi ekirdei tarafndan Controller'a
eriilebilir ve bozuk blok ynetimi iletim sisteminin kontrolnde gerekletirilebilir.
lk zamanlarda kan PCMCIA flash kartlar, raw flash trnde idi. Bu nedenle zerinde blok
tabanl bir dosya sistemi altrabilmek iin (fat, ext3 vb.) yazlmsal bir FTL srsne ihtiya
vard.
Sonrasnda bu ilemler donanm zerindeki bir controller araclyla firmware ierisinde
yaplmaya baland.
95
Gml Linux
Gnmzde USB Flash Bellek, SSD, eMMC gibi sistemler, firmware tarafndan sunulan FTL
katman sayesinde ek bir srcye ihtiya duyulmakszn, normal bir disk gibi
kullanlabilmektedir. Donanmn firmware'i ilemleri bizim iin yaptndan dolay st
katmanda herhangi blok tabanl dosya sistemi kullanlabilmektedir.
SSD ve byk oranda eMMC'yi kenarda tutarak, dier FTL tabanl depolama ortamlarn
gml Linux projelerinde, endstriyel ilerde kullanmak iyi bir fikir olmayabilir. Bunu biraz
daha aacak olursak:
reticiler FTL ilevini gerekletiren firmware kodunu kapal tuttuklarndan, flash tabanl
bir ortam kullanmaktan gelen kstlar (silme mr, wear-levelling vb.) bu firmware
ierisinde ne derece iyi bir ekilde halletmi olduklarn bilme ansmz kalmaz.
FTL tabanl ortamlarn ou, zerinde FAT gibi basit bir dosya sisteminin altrld,
g kesintilerinde veri kaybna tahamml olan, son kullancya ynelik rnler olarak
tasarlanmaktadr. Endstriyel bir kullanma ynelik tasarlanmamlardr.
FTL controller, dosya sisteminde ne olup bittiini tam olarak bilemeyeceinden, rnek
olarak silinmi dosyalara ait kullanlmayan bloklar iin de ilem yapmaya devam
ederken, raw flash zerinde alan dosya sistemleri, daha iyi bir ynetim yapabilir.
Bu olumsuzluklara ramen, kaliteli bir firmware ve hzl bir controller ile, yksek baarm
salanabilir. SSD ve eMMC aygtlarnn hedef kitlesi nedeniyle retim kaliteleri ortalama
olarak ok daha iyi olduundan daha iyi performans elde edilebilmektedir. Bununla birlikte
controller tarafnda kapal kod ile yaplan ilemler, srecin toplamdaki kalitesi noktasnda bir
phe noktas oluturmaktadr.
96
Gml Linux
Son 2 ylda giderek artan hzda kullanm alan bulmu olup, kapasite, verimlilik, birim maliyet
gibi alanlarda raw NAND flash aygtlarna gre avantajl hale gelmi, retim hacmi artm ve
srekli fiyatlar dmektedir. Buna bal olarak ok yakn bir gelecekte raw NAND flash
tabanl aygtlar piyasada grememeye veya ok yksek fiyatlardan bulmaya balarsak
almamas gerekir. 2014 sonu itibariyle piyasaki bir ok board, depolama birimi olarak raw
NAND flash yerine, eMMC veya MMC ile gelmektedir.
97
Gml Linux
98
Gml Linux
Blok tabanl okuma-yazma operasyonlarn destekler. Ancak bozuk blok ynetimi, yazma
operasyonlarnn farkl bloklara datlmas (wear-levelling) gibi destekleri bulunmamaktadr.
MTD Partitioning
Hardcode Yntemi
Dorudan ilgili MTD srcs ierisinde yaplr. rnek olara arch/arm/mach-omap2/boardomap3beagle.c ierisine bakalm:
99
Gml Linux
Bu rnekte;
4 MB Kernel iin read-only,
100
Gml Linux
Offset deeri olarak 0 ve block count deeri olarak 0 girilmesi durumunda, tm blm
silinir.
Bloklar daha nceden kilitlenmi durumda ise, -u parametresi ile veya flash_unlock
uygulamas ile kilit kaldrlr.
rnek kullanm:
flash_erase -u /dev/mtd3 0 0
nandwrite uygulamas NAND flash tipinde, flashcp uygulamas NOR flash tipinde kullanlr.
nandwrite uygulamas biraz daha yetenekli olu, padding vb. gibi daha fazla seenek
sunmaktadr.
101
Gml Linux
rnek kullanm:
nandwrite -p /dev/mtd3 /tmp/jffs.image
flashcp /tmp/jffs.image /dev/mtd3
olarak 0x78 chip ID deeri, 128MiB 1,8V 8-bit NAND iken, 0xC5 2GiB 3,3V 16-bit
NAND ipini gsterir.
Bunlarn haricinde nandsim modlnn 20 kadar daha parametresi bulunmaktadr.
Parametrelerin listesini modinfo komutuyla alabilirsiniz:
102
Gml Linux
parm: first_id_byte:The first byte returned by NAND Flash 'read ID' command (manufacturer ID) (ui
parm: second_id_byte:The second byte returned by NAND Flash 'read ID' command (chip ID) (uint)
parm: third_id_byte:The third byte returned by NAND Flash 'read ID' command (uint)
parm: fourth_id_byte:The fourth byte returned by NAND Flash 'read ID' command (uint)
parm: access_delay:Initial page access delay (microseconds) (uint)
parm: programm_delay:Page programm delay (microseconds (uint)
parm: erase_delay:Sector erase delay (milliseconds) (uint)
parm: output_cycle:Word output (from flash) time (nanoseconds) (uint)
parm: input_cycle:Word input (to flash) time (nanoseconds) (uint)
parm: bus_width:Chip's bus width (8- or 16-bit) (uint)
parm: do_delays:Simulate NAND delays using busy-waits if not zero (uint)
parm: log:Perform logging if not zero (uint)
parm: dbg:Output debug information if not zero (uint)
parm: parts:Partition sizes (in erase blocks) separated by commas (array of ulong)
parm: badblocks:Erase blocks that are initially marked bad, separated by commas (charp)
parm: weakblocks:Weak erase blocks [: remaining erase cycles (defaults to 3)] separated by commas
parm: weakpages:Weak pages [: maximum writes (defaults to 3)] separated by commas e.g. 1401:2 mea
parm: bitflips:Maximum number of random bit flips per page (zero by default) (uint)
parm: gravepages:Pages that lose data [: maximum reads (defaults to 3)] separated by commas e.g.
parm: overridesize:Specifies the NAND Flash size overriding the ID bytes. The size is specified i
parm: cache_file:File to use to cache nand pages instead of memory (charp)
parm: bbt:0 OOB, 1 BBT with marker in OOB, 2 BBT with marker in data area (uint)
parm: bch:Enable BCH ecc and set how many bits should be correctable in 512-byte blocks (uint)
imdi Fujitsu reticisi iin (0x04), 128 MiB'lk NAND flash (0x78) ipini simle edelim:
$ sudo modprobe nandsim first_id_byte=0x04 second_id_byte=0x78
103
Gml Linux
$ dmesg
[14399.796192] nand: device found, Manufacturer ID: 0x04, Chip ID: 0x78
[14399.796192] nand: Fujitsu NAND 128MiB 1,8V 8-bit
[14399.796193] nand: 128MiB, SLC, page size: 512, OOB size: 16
[14399.796203] flash size: 128 MiB
[14399.796203] page size: 512 bytes
[14399.796204] OOB area size: 16 bytes
[14399.796205] sector size: 16 KiB
[14399.796205] pages number: 262144
[14399.796206] pages per sector: 32
[14399.796206] bus width: 8
[14399.796207] bits in sector size: 14
[14399.796207] bits in page size: 9
[14399.796208] bits in OOB size: 4
[14399.796209] flash size with OOB: 135168 KiB
[14399.796209] page address bytes: 4
[14399.796210] sector address bytes: 3
[14399.796210] options: 0x42
[14399.796646] Scanning device for bad blocks
[14399.803631] Creating 1 MTD partitions on "NAND 128MiB 1,8V 8-bit":
[14399.803635] 0x000000000000-0x000008000000 : "NAND simulator partition 0"
$ cat /proc/mtd
dev: size erasesize name
mtd0: 08000000 00004000 "NAND simulator partition 0"
Artk kernel asndan normal bir MTD aygtmz olumu oldu. MTD aygtlar zerindeki tm
ilemleri burada yapabiliriz (Jffs2, Ubi, Ubifs almalar, flash_erase , nandwrite vb.)
104
Gml Linux
Yukardaki rnekte, daha nceden blmlendirilmi ve blm etiketi olarak "rootfs" verilmi
olan /dev/mtd3 blm, bir UBI aygt olarak sisteme eklenmektedir.
Flash zerindeki blmlendirme etiketleri kullanlabilecei gibi, dorudan MTD blm
numaras da kullanlabilmektedir.
UBI destei modl olarak derlenmi ise, ubi modlne yklenirken yukardaki gibi
parametreler geilmelidir.
UBI Attach ve UBI Detach ilemleri, mtd-utils paketinden kan ubiattach ve ubidetach
uygulamalar kullanlarak da yaplabilir.
105
Gml Linux
Not: UBI komutlarnda kontrol aygt ismi verilmediinde ntanml olarak /dev/ubi_ctrl
varsaylr.
Soru: Root dosya sistemi olarak UBIFS kullanldnda attachment ilemi nasl yaplabilir?
UBI Attach ilemi tamamlandnda udev veya devtmpfs gibi /dev dizini altndaki aygt
dosyalarn yneten bir mekanizma kullanyorsanz otomatik olarak srasyla /dev/ubi0 ,
/dev/ubi1 eklinde attach edilen aygtlara ilikin dosyalar oluacaktr.
Volume Ynetimi
UBI sisteminde attach edilmi olan MTD aygtlar zerinde, UBI katmannda mantksal
volume birimleri oluturulmaldr.
rnek olarak 600 MB boyutundaki /dev/mtd3 ubiattach ile sisteme /dev/ubi0 eklinde
eklenmi olsun. Bu UBI aygt zerinde ok sayda UBI volume birimi oluturmamz
mmkndr. Bu ilem iin ubimkvol uygulamas kullanlacaktr.
rnek olarak bu alan zerinde 100 MB, 200 MB ve 300 MB boyutlarnda 3 adet volume
birimi oluturalm:
ubimkvol /dev/ubi0 -N test0 -s 100MiB
ubimkvol /dev/ubi0 -N test1 -s 200MiB
ubimkvol /dev/ubi0 -N test2 -m
106
Gml Linux
Mevcut bir UBI volume birimini silmek iinse ubirmvol uygulamas kullanlr.
Etiketi test2 olan volume birimini kaldrmak iin:
ubirmvol /dev/ubi0 -N test2
107
Gml Linux
Raw Flash tabanl aygtlar ise ne bir karakter aygt gibi, ne de tam olarak blok aygt gibi
davranrlar.
108
Gml Linux
MTD Aygtlar
eraseblock'lardan oluur
sektr'lerden oluur
109
Gml Linux
Dezavantajlar
Aada sralanan temel sebeplerden tr JFFS2 kullanm gnmzde olduka azalmtr:
Tm node'larn mount ilemi srasnda taranmas ihtiyac gerektiinden, flash
kapasitelerinin GigaByte seviyelerine ulamas nedeniyle ok uzun mount sreleri
gerektirmesi
ok sayda kk dosyann yazlmas durumunda sktrma desteinin negatif bir etki
retmesi
Bellekte her node iin bir veri yaps tuttuundan kullanlan alan arttka bellek
kullanmnn artmas ve performansn dmesi
Tamamen senkron alan bir dosya sistemi olduundan yazma ilemleri dorudan flash
ortama yaplr. ok sayda dosya zerinde kk deiiklikler yapldka sktrma
ilemleri de tekrar yaplr, zamanla fragmentation artar, performans der.
Yukarda saylan nedenler yznden yerini byk oranda UBIFS'e brakmasna karlk,
dosya sistemi iin ayrlm alann ok kk olduu senaryolarda (rnein konfigrasyon
ilemleri iin 1 MB'lk bir blm ayrm olabilirsiniz), UBIFS overhead'i fazla olduundan
birinci alternatif olmaktadr.
110
Gml Linux
Kullanm
Bir MTD blm JFFS2 formatnda veri iermese dahi, blok tipi aygt ismi zerinden jffs2
trnde dorudan mount edilmeye alldnda ilem baarl olur, ancak bu yntem
nerilmez.
Bunun yerine ncelikle ilgili MTD blmnn flash_erase ile silinmesi gereklidir:
flash_erase /dev/mtd8 0 0
flash_erase ile yaplan silme ileminin MTD'nin istenilen blmne ait karakter aygt
dosyas zerinden, mount ileminin ise gene MTD'nin ayn blmne ait blok aygt
dosyas zerinden gerekletirildiine dikkat ediniz.
Not: jffs2 dosya sistemi raw flash iplerine zel retilmi olmasna ramen ilgili MTD
blmn mount uygulamasna mtdblock emlasyonu zerinden gsteriyor olmamz,
tamamen mount uygulamasnn blok tabanl aygt arayzleri ile almasndan
kaynaklanmaktadr. Mount sonras jffs2 tarafndan mdtblock emlasyon katman
kullanlmaz.
Yukardaki rnekte mount ilemi sonras /mnt dizini altna kopyalama yapmak suretiyle ilgili
blme yazlabilir.
Ardndan ilgili blm mount edildiinde, imaj ierisinde yer alan verilere ulalabilecektir:
111
Gml Linux
maj Oluturma
Gelitirme yaplan bilgisayardaki bir dizin hiyerarisini jffs2 imajna evirmek iin, mtd-utils
paketinden kan mkfs.jffs2 uygulamas kullanlr. rnek kullanm:
mkfs.jffs2 -p -n -e 128 -d /dizin -o /tmp/jffs.img
JFFS2 node'udur ve blok silme ileminin dzgn tamamlandn tutmak iin kullanlr.
NAND flash tiplerinde bu bilgi OOB alannda tutulduundan cleanmarker node'larn
istemiyoruz, NOR flash tiplerinde ise bu gereklidir.
-e parametresi ile eraseblock bykln belirtiyoruz, kullanlan flash tipine gre
Bu yntem hem NOR hem de NAND tipi flash'lar ile almaktadr. NAND flash tiplerinde hz
art daha ok olur.
Loopback Mount
112
Gml Linux
113
Gml Linux
Kullanm
Bir MTD blm YAFFS2 formatnda veri iermese dahi, blok tipi aygt ismi zerinden yaffs2
trnde dorudan mount edilmeye alldnda ilem baarl olur, ancak bu yntem
nerilmez.
ncelikle ilgili MTD blmnn flash_erase ile silinmesi gereklidir:
flash_erase /dev/mtd8 0 0
Mount ilemi sonras /mnt dizini altna kopyalama yapmak suretiyle ilgili blme yazlabilir.
114
Gml Linux
Bunun iin flash_erase ile ilgili MTD blm silindikten sonra, nandwrite ile imajn
yazlmas gerekletirilebilir.
flash_erase /dev/mtd8 0 0
nandwrite -a -o /dev/mtd8 /tmp/yaffs.image
Ardndan ilgili blm mount edildiinde, imaj ierisinde yer alan verilere ulalabilecektir:
mount -t yaffs2 /dev/mtdblock8 /mnt
maj Oluturma
Gelitirme yaplan bilgisayardaki bir dizin yapsn yaffs2 imajna evirmek iin, yaffs2utils
paketinden kan mkyaffs2 uygulamas kullanlr. rnek kullanm:
mkyaffs2 /work/dir /tmp/yaffs.img
115
Gml Linux
Tasarm Prensipleri
UBIFS'in tasarmndaki temel hedefler:
Artan flash kapasiteleriyle byk dosya sistemleriyle performansl almak
Mount sresinin ksaltlmas
Yazma hznn artrlmas
Byk dosyalara hzl eriim
eklinde zetlenebilir.
Kullanm
Oluturulan bir UBI volume birimi, ierisinde dosya sistemi henz olmasa dahi ubifs trnde
mount edilebilir:
mount -t ubifs ubi0:test1 /mnt
116
Gml Linux
Mevcut bir dizinden UBIFS imaj oluturmak iin mtd-utils paketinden kan mkfs.ubifs
uygulamas kullanlr.
mkfs.ubifs -m 512 -c 100 -e 128KiB -x lzo -r /work/dir /tmp/ubifs.img
UBI imaj oluturmak iin mtd-utils paketinden kan ubinize uygulamas kullanlr.
Ubinize uygulamasn altrmadan nce, INI formatnda bir konfigrasyon dosyas
oluturulmaldr.
rnek kullanm:
ubinize -o /tmp/ubi.img -m 512 -p 128KiB ubinize.cfg
117
Gml Linux
# ubinize.cfg
[rootfs_volume]
mode=ubi
image=rootfs.ubifs
vol_id=1
vol_type=static
vol_name=rootfs
vol_alignment=1
[data_volume]
mode=ubi
image=data.ubifs
vol_id=2
vol_type=dynamic
vol_name=data
vol_alignment=1
vol_flags=autoresize
118
Gml Linux
gsterir, sre bitiminde periyodik alan write-back thread'i gerekli ilemleri yapacaktr.
(rnek: 3000)
dirty_background_ratio : Toplam bellek alannn maksimum ne kadarlk ksmnn dirty
page cache tutmak iin kullanlacan belirtir. Bu deer alrsa periyodik write-back
thread'i ayarlanan oran salayabilmek iin gerekli ilemleri yapar. Soft-Limit olarak
dnlebilir. (rnek: 40)
dirty_ratio : dirty page-cache oluturabilecek srelerin, yazma ilemi ncesinde
UBIFS Write-Buffer
Genel Linux write-back mekanizmasna ek olarak, UBIFS'in kendine zg write-buffer
mekanizmas da bulunmaktadr.
119
Gml Linux
UBIFS write-buffer alanlar, UBIFS kodu ierisinde, page cache ve flash alan arasnda
durur. Dolaysyla write-back mekanizmas verileri flash'a deil, UBIFS write-buffer alanna
yazar.
Write-buffer alan page cache ile karlatrdmzda ok kktr ve genellikle NAND page
size deerine eittir. (512 byte, 2Kb, 4Kb vb.)
NAND page size deeri, NAND aygt zerinde yaplabilecek minimum okuma/yazma
miktarn gsterir. Dolaysyla dirty veriler dirty_expire_centisecs'lik sre sonrasnda commit
edilir ancak verinin son ksmlar write-buffer yznden ekstra bir 3-5 saniyelik gecikmeye
tabi tutulabilir.
write-back ve Senkronizasyon
Write-back ve write-buffer mekanizmalar karsnda verilerin commit edilme zamann
kontrol iin aadaki yntemler kullanlabilir:
lgili blm -o sync parametresi ile mount edilecek olursa tm yazma ilemleri senkron
olarak yaplr (JFFS2'deki gibi) ancak performans ok ciddi biimde der.
fsync(int fd) ars ile sadece belirli bir file descriptor'a ait verilerin commit edilmesi
salanabilir.
fdatasync(int fd) ars ile dosyann meta-data bilgilerinin commit edilmemesi
120
Gml Linux
121
Gml Linux
maj Oluturma
Cramfs imaj oluturmak iin cramfstools paketinden kan mkcramfs uygulamas kullanlr.
mkcramfs /work/dir cram.img
122
Gml Linux
maj Oluturma
SquashFS imaj oluturmak iin mtd-utils paketinden kan mksquashfs uygulamas
kullanlr.
mksquashfs /work/dir squash.img
123
Gml Linux
124
Gml Linux
125
Gml Linux
126
Gml Linux
Watchdog Kullanm
Watchdog mekanizmalar, alan ana yazlmlarn beklenmedik bir ekilde sonlanmas
sonrasnda sistemin yeniden balatlabilmesine imkan tanr.
Bu mekanizma genellikle donanm tabanl bir zamanlayc (Watchdog Timer - WDT) ile
gerekletirilir.
Sistemin genel alma prensibi olduka basittir:
WDT zamanlaycsn rnek olarak 60 saniye iin balat
60 saniyelik sre bitmeden hayatta olduunu ispat et ve yeni bir 60 saniye kazan
Periyodik olarak zamanlaycya hayatta olduunuzu sylediiniz mddete sorun
olmayacaktr. Ancak bu ilemi yapamaz hale gelirseniz (uygulamanz bir SEGFAULT ile
sonlanmsa vb.) zamanlaycnn sresi dolduunda sistem otomatik olarak yeniden
balatlacaktr.
Buradaki yeniden balatma ilemi kontroll (reboot) deil, reset eklindedir.
ekirdek Destei
Sistemdeki watchdog donanmnn kullanm iin ekirdek seviyesinde src destei
salanm olmaldr.
Linux ekirdeinde watchdog donanm srcleri iin genel bir Watchdog Driver API mevcut
olup, tm donanmlar tarafndan ayn arayz, yetenekleri dorultusunda salanr. Detaylar
iin https://www.kernel.org/doc/Documentation/watchdog/watchdog-api.txt belgesini
inceleyebilirsiniz.
Watchdog Kullanm
127
Gml Linux
Watchdog Kullanm
128
Gml Linux
Watchdog Kullanm
129
Gml Linux
ioctl Arayz
Tm watchdog srcleri, destekledikleri zellikler iin ioctl arayz de salamaktadrlar.
Watchdog zamanlaycy beslemek ve yeni bir tur daha sre kazanmak iin WDIOC_KEEPALIVE
ile aadaki gibi bir ioctl ars yapabilirsiniz. 3. parametrenin ne olduunun bir nemi
yoktur:
ioctl(fd, WDIOC_KEEPALIVE, 0);
Sistemin son defa yeniden balatlmas ileminin watchdog yznden olup olmadn
WDIOC_GETBOOTSTATUS ile sorgulayabilirsiniz:
int bootfromwatchdog;
ioctl(fd, WDIOC_GETBOOTSTATUS, &bootfromwatchdog);
Watchdog Kullanm
130
Gml Linux
Cpufreq Governor
Her bir governor basite CPU alma frekansnn ne olmas gerektiine dinamik olarak
karar veren algoritmalar olarak dnlebilir.
Governor algoritmalar, belirlenen minimum ve maksimum deerler ierisinde kalmak
artyla, istatistiki olarak seilen politikaya uygun olarak kararlar vermeye alrlar.
Performance Governor
Bu governor sistemden srekli maksimum performans istendii durumda kullanlr.
Seilen alma frekans, scaling_max_freq deerini geemez.
Powersave Governor
Sistemde g tketimini minimuma getirmeye alr.
Anlk cpu kullanm isteklerine tepkisi daha yava olur.
Seilen deerler scaling_min_freq ve scaling_max_freq arasnda olur.
G tketiminin ok nemli olduu senaryolarda nerilir.
Ondemand Governor
Bu governorda CPU frekans ihtiya dorultusunda anlk olarak deitirilir.
Seim algoritmas cpu kullanmna dair aralklarla rnekler alr ve bu rneklemi karar
mekanizmasnda kullanr.
131
Gml Linux
Conservative Governor
Ondemand governor'un zelletirilmi bir hali olarak dnlebilir.
Ondemand'dan farkl olarak, Cpu frekansn azaltmak veya artrmak gerektiinde bu ilemi
kademeli olarak yapmaktadr.
freq_step, down_threshold ve sampling_down_factor parametreleriyle algoritmann
davrannda bir takm zelletirmeler yapmak mmkndr.
Userspace Governor
Bu governor sistemdeki root kullancsnn CPU frekansn spesifik olarak belirli bir deere
ayarlayabilmesini salar.
Governor yklendikten sonra, sysfs zerinden scaling_setspeed dosyas araclyla istenen
alma frekans ayarlanabilir.
Herhangi bir cpu hzn semek mmkn deildir. lgili CPU iin kullanlabilecek CPU hz
deerleri sysfs zerinde scaling_available_frequencies dosyasnda belirtilmitir:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
300000 600000 800000 1000000
Aktif governor bu dosyaya ilgili governor ismi yazlmak suretiyle deitirilebilir. rnek olarak
userspace governor kullanmak iin:
132
Gml Linux
Ardndan sistemdeki farkl cpu governor veya saat frekanslar iin toplam zamanlar time
komutu yardmyla ltmzde aadakine benzer bir sonu alnmaktadr:
133
Gml Linux
Aktif Governor
lem Sresi
Powersave
15.91 s
Conservative
6.84 s
Ondemand
5.05 s
Performance
4.70 s
15.91 s
4.70 s
cpufreq-utils
Frekans deiimi ilemlerini kolaylatrmak amal cpufreq-utils paketinden kan
uygulamalar kullanlabilir.
cpufreq-utils paketini,
http://ftp.sunet.se/pub/Linux/kernel.org/linux/utils/kernel/cpufreq/cpufrequtils.html adresinden
indirip derleyebilirsiniz. Paket ierisinden kan cpufreq-info ve cpufreq-set uygulamalar
ile ilemleri kolay bir ekilde gerekletirmek mmkndr.
cpufreq-info
$ sudo cpufreq-info
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:
driver: generic_cpu0
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 300 us.
hardware limits: 300 MHz - 1000 MHz
available frequency steps: 300 MHz, 600 MHz, 800 MHz, 1000 MHz
available cpufreq governors: conservative, ondemand, userspace, powersave, performance
current policy: frequency should be within 300 MHz and 1000 MHz.
The governor "powersave" may decide which speed to use
within this range.
current CPU frequency is 300 MHz (asserted by call to hardware).
cpufreq stats: 300 MHz:nan%, 600 MHz:nan%, 800 MHz:nan%, 1000 MHz:nan%
cpufreq-set
134
Gml Linux
userspace governor aktif iken -f parametresi ile spesifik bir frekans seimi yapmak
iin:
$ sudo cpufreq-set -g userspace
$ sudo cpufreq-set -f 600000
135
Gml Linux
Buildroot
Gml Linux sistemlerinin kullanmnda temel olarak 3 alternatif yntem bulunmaktadr:
nceden hazrlanm bir datm kullanmak (Debian, ngstrm vb.)
Desteklenen mimari says az
zelletirmek ve ihtiya duyulmayan bileenlerin kartlmas zor
Kaynak kodlardan yeniden ina etmek ok g
Elle zel bir datm hazrlamak
Uzun ve yorucu bir sre
apraz derlemeyle ilgili sorunlu uygulamalara dair detaylarn renilmek zorunda
olmas
Uygulamalarn birbirine olan bamllklarnn ynetilmesi g
Elle zel bir datm hazrlarken otomatik ina sistemi kullanmak
Her iki yntemin kt yanlarn bertaraf edip iyi yanlarn biraraya getirmeye alr
Buildroot projesi, benzer ilemleri sklkla yapmak zorunda kalan gml Linux sistem
gelitiricilerinin hayatn kolaylatrmay, bunu yaparken de ok karmak ve renilmesi
bal bana problem olan yeni bir sistem daha retmek yerine, geleneksel aralarla sreci
ynetmeyi hedefler.
Tarihe
Buildroot, 2001 ylnda uClibc gelitiricileri tarafndan test amal gelitirilmeye baland.
2005 ylnda gelitirici says biraz daha artt, ancak profesyonel bir ara olmann halen
uzanda idi.
2009 ylna kadar grece kontrolsz bir yapda proje deien hzlarda bymeye devam etti.
2009 ylndan itibaren Peter Korsgaard projenin yeni sorumlusu oldu. Bu gelimenin
ardndan nemli dizayn deiiklikleri, dzenli kan versiyonlar ve buildroot kullanan
sistemlerdeki art projeyi bugnk haline getirdi.
2015 Ocak ay itibariyle, Buildroot projesi toplam 35 MB kaynak kodundan olumakta olup,
ierisinde 1415 adet uygulama paketi yer almaktadr. 300'den fazla gelitirici projeye eitli
seviyelerde katkda bulunmaktadr.
Buildroot
136
Gml Linux
Yaklam
Buildroot temel olarak Makefile sistemi zerine ina edilmitir. Sistem yaklak olarak 1500
adet Makefile dosyasndan ( .mk uzantl) oluur.
Tm sre ncelikle ana dizinde yer alan Makefile dosyasnn okunmasyla balar. Yaplan
ilemlere gre gerektiinde ilgili dier .mk uzantl Makefile dosyalar include edilerek
ilerlenir.
Not: Projede alrken make hedeflerini ( make strace , make rootfs-clean vb.) TAB
tuu ile otomatik tamamlattrmak mmkndr, ancak otomatik tamamlama
fonksiyonunun tm dosyalar ilemesi gerektiinden Makefile saysnn okluu
nedeniyle bu ilem biraz zaman almaktadr. Byle bir durumla karlarsanz sabrla
bekleyin (5-20 saniye) ve bu zellii imdilik fazla kullanmamaya bakn.
Konfigrasyon
Buildroot projesinde konfigrasyon ilemleri iin, Linux kernel ve Busybox gibi projelerde
kullanlan Kconfig sistemi kullanlmaktadr.
Kaynak: https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt
Kconfig sistemiyle kolay bir ekilde
Seenekler arasndaki bamllklar
Farkl trlerde deikenler
artl aklar ve ntanml deerler
Sistem ii yardm metinleri
kolayca tanmlanabilmektedir.
Konfigrasyon Seenekleri
Kconfig sistemi ile yaplacak konfigrasyon ileminin sonucunda yaplan seimler kayt
edilirse, ana dizinde .config dosyas oluacaktr
Temel ama bu dosyay oluturmak olduundan, daha nce oluturulmu olan farkl bir
.config dosyas kopyalanmak suretiyle de ayn seim kmesine ulalr
Buildroot altnda ntanml gelen config dosyalar, configs/ dizini altnda bulunur
(rnek: beaglebone_defconfig)
Buildroot
137
Gml Linux
Konfigrasyon ileminde kullanacamz GUI arac iin birden fazla seenek mevcuttur:
Yntem
Aklama
xconfig
Qt-4 backend
qt4-dev
gconfig
Gtk-2 backend
gtk-2-dev, libglade-2-dev
nconfig
Ncurses backend
libncurses-dev
menuconfig
curses backend
libncurses-dev
xconfig
Kullanm: make xconfig
Qt4 tabanl bir arayz sunar.
nconfig
Kullanm: make nconfig
ncurses tabanl bir arayz sunar.
Buildroot
138
Gml Linux
menuconfig
Kullanm: make menuconfig
curses tabanl bir arayz olup, kullanmn nermekteyiz.
Tm arayzlerde ilgili seenek iin girilmi yardm bilgisine ulalabilmektedir (curses
arayznde h ksayolu ile)
139
Gml Linux
Buildroot
140
Gml Linux
Bo Konfigrasyon le Balamak
Eer hazr bir konfigrasyon dosyas kullanmak istemiyorsanz, aadaki komutla bo
bir konfigrasyon dosyas ile de ileme balayabilirsiniz:
$ make menuconfig
Bu ekilde ileme balandnda, mevcut paketler arasndan sadece busybox 'n ve
mimari olarka i386 'nn seii olduu temel bir konfigrasyon karnza gelecektir.
Srasyla buradaki menlerden gerekli seimleri yapp oluturduunuz konfigrasyonu
kaydedip, ina srecine geebilirsiniz.
Buildroot
141
Gml Linux
Balk
Deer
Target Architecture
cortex-A8
Target ABI
EABI
VFPv3-D16
ARM
142
Gml Linux
Toolchain Seimi
Bu blm ierisinde ina srecinde apraz derleme ileminde kullanlacak toolchain
seimi ve detayl konfigrasyonu yaplacaktr
Temel olarak 2 tip toolchain bulunmaktadr:
Buildroot toolchain
External toolchain
Buildroot toolchain tipi seildiinde, ncelikle toolchain'in kendisi ina edilecektir
Bu sre olduka uzun vakit almakta ve buildroot'tan bamsz olarak, toolchain ina
srelerinin genel anlamda skntl olmas sebebiyle baarszlkla da
sonulanabilmektedir
Buildroot
143
Gml Linux
zel bir nedeni yok ise toolchain'in kendisini retme srecinden kanlmasn
nermekteyiz
System Configuration
Bu blmde oluturulacak olan dosya sistemiyle ilgili baz temel ayarlar
yaplabilmektedir
Balk
Ayar
System hostname
System banner
Password encoding
/dev management
Init system
Root FS skeleton
Root password
Root parolas
read-write remount
Custom scripts
Buildroot
144
Gml Linux
System Configuration
/dev management
nemli seimlerden biri, /dev aygt dosya sisteminin nasl ynetileceinin
belirlenmesidir
Gemi yllarda statik /dev ynetimi genel olarak kullanlmaktayd. Halen daha bu
seenein anlaml olduu projeler olabilir
Ancak /dev dizinini kernel zerinden gelen event'ler ile dinamik olarak oluturan
zmlerin tercih edilmesini nermekteyiz
Bu amala userspace'de alan, udev veya mdev yardmc aralarn
kullanabileceiniz gibi, kernel seviyesinde alan devtmpfs yntemini de
kullanabilirsiniz
zellikle sistemin al hzna olumlu etkisi dnldnde, udev veya mdev yerine,
sadece devtmpfs yntemini kullanmanz neririz
Bu kullanm ekli iin kernel derleme srecinde, CONFIG_DEVTMPFS ve
CONFIG_DEVTMPFS_MOUNT seenekleri seilmi olmaldr
Kernel
Buildroot
145
Gml Linux
Paket Seimi
Sistemde yer alacak tm paket seimleri bu blm ve alt menlerinden
gerekletirilmektedir
Buildroot
146
Gml Linux
Filesystem images
Derleme ilemleri bitiminde retilecek olan dosya sistemi imaj bu blmden
belirlenmektedir
squashfs, cramfs gibi read-only compressed dosya sistemi imajlarndan, jffs2, ubifs
gibi NAND flash aygtlar iin uygun dosya sistemlerine kadar geni bir seenek kmesi
yer almaktadr
Seilen dosya sistemi imaj trne gre alan ek menlerden parametre geirmek de
mmkndr. zellikle ubifs dosya sistemi iin aadaki parametrelerin doruluu teyit
edilmelidir:
UBI logical eraseblock size
UBI minimum IO size
Maximum LEB count
UBI physical eraseblock size
UBI sub-page size
Bootloaders
Buildroot zerinden aadaki bootloader uygulamarn mimariniz iin derlemeniz
mmkndr:
U-Boot
Barebox
X-Loader
Freescale mxs
grub, syslinux
Buildroot
147
Gml Linux
Gml sistemler iin youn biimde U-Boot kullanlmakta olsa da, kod kalitesi ve build
karmakl nedeniyle gelecekte yerini yeni nesil u-boot olarak adlandrabileceimiz
barebox'a brakaca dnlmektedir
Paketler
Dosya Sistemi retimi
Buildroot Paketi Oluturma
Yardmc Adresler
Web: http://buildroot.org
Buildroot
148
Gml Linux
Buildroot
149
Gml Linux
Android Platformu
Bu blmde AOSP (Android Open Source Project) projesi kapsamnda retilmi olan yazlm
bileenlerinin kullanlarak gml Linux sistemimiz iin zelletirilmi bir Android imaj
oluturulmas ve Android gelitirme srecinin temel bileenlerinin incelemesi yaplacaktr.
Android Platformu
150
Gml Linux
sonrasnda sisteminizde birden fazla JDK versiyonu bulunuyor ise ntanml olacak olan
versiyon 7 olacak ekilde aadaki komutlarla gncelleyin:
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac
151
Gml Linux
152
Gml Linux
Kullanacanz cihaza ait kural burada yer almyorsa, USB kablosunu bilgisayarnza
taktktan sonra, lsusb komutunu altrn. Komut ktsnda yeni taktnz cihaz tahmin
edip, 8087:0024 formatndaki gibi Vendor ID : Product ID ksmlarn not ederek, udev
kurallarna bu aygt da eklemelisiniz.
153
Gml Linux
$ mkdir -p ~/bin
$ export PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
Not: Baz datmlarda ~/bin dizini kullanclarn ntanml PATH 'inde bulunuyorken
bazlarnda bulunmamaktadr. Byle bir durumda kolaylk olmas iin yukardaki
export komutunu, ~/.bashrc dosyanzn sonuna ekleyebilirsiniz.
repo aracn kurduktan sonra, almalarmz yapacamz ana dizini belirleyip oluturalm,
Ardndan repo uygulamas ile master branch'i aadaki komut ile ilklendiriyoruz:
$ repo init -u https://android.googlesource.com/platform/manifest
Komutun bitmesine yakn size isim ve e-posta adresi sorulacaktr. Bu esnada e-posta adresi
olarak bir Google hesab girilmelidir:
...
* [new tag] studio_1.0.0 -> studio_1.0.0
* [new tag] studio_1.0.1 -> studio_1.0.1
Your Name [Murat Demirten]:
Your Email [demirten@debian]: mdemirten@yh.com.tr
Your identity is: Murat Demirten <mdemirten@yh.com.tr>
is this correct [y/N]? y
Testing colorized output (for 'repo diff', 'repo status'):
black red green yellow blue magenta cyan white
bold dim ul reverse
Enable color display in this user account (y/N)? y
repo has been initialized in /home/demirten/embedded/android
154
Gml Linux
Yukardaki ilemleri yaptktan sonra, repo aracnn sync komutuyla kaynak kodlarnn
indirilmesi salanr:
$ repo sync
Bu ilem bir miktar uzun srebilir (bazen ok uzun, belki 1 gn kadar). Ocak 2015 itibariyle
yaklak toplam 20 GB' bulan kaynak dosyalar indirilecektir.
Kullanc Otorizasyonu
Google repo'larnda IP adresi baznda yaplacak isteklere ynelik bir kstlama mevcuttur.
Tek kii alyorken bu bir sknt oluturmasa da, ayn public IP adresinin paylald ve
birden fazla kiinin bu repo'lara eritii durumlarda sorun yaayabilirsiniz. Ortak IP kullanyor
olmaktan kaynaklanacak sorunlar bertaraf edebilmek iin,
https://android.googlesource.com/new-password adresindeki ynergeleri izleyerek kendinize
ait bir parola oluturabilir ve aadaki komutla repo init ilemini tekrar edebilirsiniz. Bu ilem
sonrasnda yaptnz istekler IP bazl kontrol edilmek yerine sizin kullancnza gre kontrol
edilecektir.
$ repo init -u https://android.googlesource.com/a/platform/manifest
155
Gml Linux
Build Sistemi
Android build sistemi, ak kaynak dnyasnda kendisinden nceki projelerden nemli
farkllklar iermektedir. yi ve kt yanlarn bir kenara brakp bu sistemin genel olarak
renilmesinde fayda vardr.
Build sreci geleneksel make uygulamas ile alr. Bu ynyle bir benzerlik tad
dnlebilirse de, esasen tek benzerlik bundan ibaret olup, make sistematii allagelmiin
dnda kullanlr.
Ak kaynak dnyasnda bu denli byk projelerde genellikle en st dizinde bir ana Makefile
bulunur. Build srecinin bileenlerinin seimi ve dier zelletirmeler, ana dizinde yer alan bir
konfigrasyon dosyasnda tutulur ( .config ). Konfigrasyon dosyasnn retimi grece uzun
ve detayl bir ilem olduundan, bu sreci kolaylatracak eitli aralar sunulur
(menuconfig, xconfig, sistem ii yardm vb.). Ana dizindeki Makefile, .config dosyasn iler,
alt dizinleri recursive olarak dolar ve yaplan seimler dorultusunda alt dizinlerde yer alan
Makefile dosyalarn da make ile iler.
Android build sisteminde ise ana dizinde genel bir Makefile ve konfigrasyon dosyas
bulunmaz. Alt dizinler dolalp her birindeki Makefile dosyalar zerinden make de
iletilmeye allmaz. Bunun yerine, dizin ve alt dizinlerde, Android.mk dosyas aranr. Bu
make uygulamas iin hazrlanm bir Makefile dosyasdr. Eer bir dizinde Android.mk
bulunur ise make ile ilenir ve bu noktadan sonra, dosyann bulunduu dizinin alt
dizinlerinde arama ilemi devam etmez. Yani Android.mk bulunduunda, daha derinlerdeki
dizinlere inilmez. Bir st seviyedeki dizinlerin aranmasna ve oralarda bulunan Android.mk
dosyalarnn ayn ekilde ilenmesine devam edilir.
Konfigrasyon
Build ilemine balarken ncelikle envsetup.sh betii allan kabuk ierisinde iletilir:
$ source build/envsetup.sh
Daha sonra lunch komutuyla retilecek hedef imaja ait parametreler belirtilir. Girilecek
parametrenin format BUILD-BUILDTYPE eklinde olup aadaki tabloya gre belirlenebilir:
na Sreci
156
Gml Linux
Build smi
Cihaz
Aklama
aosp_arm
ARM
emlator
aosp_maguro
maguro
aosp_panda
panda
Kullanm Amac
Nihai rn kullanmna uygun, kstl eriim
Root eriimin ve debug imkann eklendii "user" tipi
Ek debug aralaryla zenginletirilmi gelitiricilere ynelik
Yukardaki komutun almas bittiinde, ayarlanan deikenlerle ilgili aadaki gibi bir kt
verilecektir:
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.0.50.50.50.50
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.16.0-4-amd64-x86_64-with-debian-jessie-sid
HOST_BUILD_TYPE=release
BUILD_ID=AOSP
OUT_DIR=out
na Sreci
157
Gml Linux
Derleme
Derleme sreci olduka fazla zaman alacaktr. Bu nedenle ccache gibi bir compiler cache
sistemi kullanlmasnda fayda vardr.
Bunun iin USE_CCACHE ortam deikeninin deerini 1 olarak atamalyz:
$ export USE_CCACHE=1
na Sreci
158
Gml Linux
Sistem arlar
Modern iletim sistemlerinde, ekirdek kipinde alma ve kullanc kipinde alma modlar,
sert bariyerlerle birbirinden ayrlm durumdadr.
Bu ekildeki bir tasarm, sistemin salkl almas iin elzemdir.
Kullanc kipinde alan bir uygulamann, sistem arlar araclyla iletim sistemi
ekirdeinden ihtiya duyduu servisleri alabilmesi salanr.
Bununla birlikte, sistem arlar normal fonksiyon arlarna oranla olduka yksek
maliyetli ilemlerdir.
Her sistem arsnda uygulamann o anki durumunun saklanmas, ekirdein ilemcinin
kontroln ele almas ve ilgili sistem ars ile ekirdek kipinde talep edilen ilemleri
gerekletirmesi, sonra ilgili uygulamann tekrar alma sras geldiinde, uygulamann
saklanan durumunun yeniden retilip ilemlerin kald yerden devamnn salanmas
gereklidir.
Sistem arlar
159
Gml Linux
Sistem ars iin 6'dan fazla parametre gerekli olduunda, bellekteki bir veri yaps
hazrlanarak parametrelar burada saklanr, sonrasnda ilgili bellek adresi sistem arsna
parametre olarak geirilir.
Mimari Bamll
Sistem arlarnn dorudan ilemci mimarisine baml olduuna deinmitik.
rnek olarak Intel 32 bitlik ilemcilerde INT 0x80 ile trap oluturulurken, ARM mimarisinde
ayn ilem supervisor call SVC ile yaplr
Benzer ekilde Intel mimarisinde EAX yazmacna yazlan sistem arsnn numaras, ARM
mimarisinde R8 yazmacna koyulur.
Sistem arlar
160
Gml Linux
ARM mimarisinde sistem arsna ait 4 adede kadar parametre, R9 , R10 , R11 ve R12
yazmalarna aktarlr. 4 adetten fazla parametre geilmesi gerektiinde, bellek zerinde veri
yaps hazrlanarak bu blmn adresi geirilir.
Genel olarak sistem arlar performansnn ARM mimarisinde x86'ya gre daha dk
olduunu syleyebiliriz (yazma/register saysnn azl bunda etken olabilir mi dnnz).
Burada kastedilen glibc ierisindeki open() fonksiyonu deil, open sistem arsdr.
Strace zerinden sistem arsna geirilen argmanlar ve geri dn deerini (3)
grmekteyiz.
Sistem arlar
161
Gml Linux
Saniyedeki IO
149
Pentium 4 - 2 Ghz
108
69
Ayn testi dosya okuma yerine farkl sistem arlaryla da test ettiinde benzer sonularn
alndn tespi etti.
Bunun sebebi, baz x86 serisi ilemcilerde ekirdek kipine daha hzl gei iin
SYSENTER/SYSEXIT zel instruction'nn bulunmasyd. Pentium 3 serisinde varolan bu destek,
Sistem arlar
162
Gml Linux
kullanyor olabilir.
Java Virtual Machine gibi bir VM zerinde alan uygulamalar iin de benzer bir durum
sz konusudur.
Grece basit bir ilem olmasna ramen sk kullanlan bu operasyon yznden sistemlerde
nasl bir sistem ars yk olumaktadr? sorusunu kendimize sorabiliriz.
$ ldd hello
linux-vdso.so.1 (0x00007fff7d88a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2fb43a0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2fb476d000)
Sistem arlar
163
Gml Linux
Not: Konunun bundan sonras merakllar iin olup, ok gerekli olmayan bu blmn
yeni balayan kullanclar iin atlanmas nerilir.
/proc/self/maps
Linux proc dosya sisteminde /proc/<PID>/maps dosyasnda ilgili PID (process id) iin
ekirdek tarafndan yaplm olan adres haritalamas gsterilir.
zel bir durum olarak, <PID> yerine self ibaresi kullanldnda, o an bu dosya eriimini
yapan process ile ilgili dizinde ilem yaplm olur.
$ cat /proc/self/maps
00400000-0040c000 r-xp 00000000 08:02 1703938 /bin/cat
0060b000-0060c000 r--p 0000b000 08:02 1703938 /bin/cat
0060c000-0060d000 rw-p 0000c000 08:02 1703938 /bin/cat
024de000-024ff000 rw-p 00000000 00:00 0 [heap]
7ff7033c5000-7ff70369f000 r--p 00000000 08:02 2362900 /usr/lib/locale/locale-archive
7ff70369f000-7ff70383e000 r-xp 00000000 08:02 393230 /lib/x86_64-linux-gnu/libc-2.19
7ff70383e000-7ff703a3d000 ---p 0019f000 08:02 393230 /lib/x86_64-linux-gnu/libc-2.19
7ff703c69000-7ff703c6a000 rw-p 00000000 00:00 0
7fff8cd95000-7fff8cdb6000 rw-p 00000000 00:00 0 [stack]
7fff8cdfc000-7fff8cdfe000 r-xp 00000000 00:00 0 [vdso]
7fff8cdfe000-7fff8ce00000 r--p 00000000 00:00 0 [vvar]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
vsyscall
/proc/self/maps dosyasna cat uygulamas ile bir ka defa baktnzda, vsyscall
Sistem arlar
164
Gml Linux
Linux 3.0 versiyonuna kadar vsyscall tablosu kullanlm olmakla birlikte, 3.1 ve sonrasnda
bu yntem artk nerilmiyor. vDSO mekanizmas hem daha gvenli hem daha hzl.
/proc sanal dosya sistemi altndaki girdiler normal bir dosya gibi grnmesine karlk,
stat() ile bakldnda st_size deeri 0 olmaktadr. Bu durum dd uygulamasnn
ilgili offset adresine seek yaplamayacan sylemesine neden oluyor. zm iin ufak
bir yama gerekiyor
2. Yeni Linux ekirdek versiyonlarnda buradaki balang deer adresi, 7fff8cdfc000 her
uygulama iin ayn deildir. Return to libc tarz ataklar zorlatrmak iin bu deer
ancak alan uygulama ierisinden renilebilir. Bunun iin dd kodunun deitirilmesi
veya ufak bir test uygulamas yazlmas gerekiyor.
extract_region.c
Bu ilemi yapabilmek iin extract_region adn verdiimiz aadaki gibi bir uygulama
hazrlayalm:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define _FILE_OFFSET_BITS 64
int main (int argc, char *argv[])
{
if (argc != 3) {
fprintf(stderr,
"Kullanm: %s <cikti> <section>\n"
"\t<cikti>\t\t: export edilecek dosya\n"
Sistem arlar
165
Gml Linux
Sistem arlar
166
Gml Linux
$ file vdso.out
vdso.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID
[sha1]=538bea2738a229413dcc98af8f4f7127f9bca874, stripped
$ objdump -T vdso.out
vdso.out: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000000418 l d .rodata 0000000000000000 .rodata
0000000000000970 w DF .text 000000000000057d LINUX_2.6 clock_gettime
0000000000000000 g DO *ABS* 0000000000000000 LINUX_2.6 LINUX_2.6
0000000000000ef0 g DF .text 00000000000002b9 LINUX_2.6 __vdso_gettimeofday
00000000000011d0 g DF .text 000000000000003d LINUX_2.6 __vdso_getcpu
0000000000000ef0 w DF .text 00000000000002b9 LINUX_2.6 gettimeofday
00000000000011b0 w DF .text 0000000000000015 LINUX_2.6 time
00000000000011d0 w DF .text 000000000000003d LINUX_2.6 getcpu
0000000000000970 g DF .text 000000000000057d LINUX_2.6 __vdso_clock_gettime
00000000000011b0 g DF .text 0000000000000015 LINUX_2.6 __vdso_time
167
Gml Linux
#include <stdio.h>
#include <sys/time.h>
int main ()
{
int i;
struct timeval now;
struct timeval before;
struct timeval after;
gettimeofday(&before, NULL);
for (i = 0; i < 100000; i++) gettimeofday(&now, NULL);
gettimeofday(&after, NULL);
printf("Before: %li.%li\n", before.tv_sec, before.tv_usec);
printf("After : %li.%li\n", after.tv_sec, after.tv_usec);
return 0;
}
Sistem arlar
168
Gml Linux
defasnda karlk gelen bir gettimeofday() sistem ars yapldn gryoruz (rnek
ekran ktmzda ... olarak belirttiimiz blmde 100000 adet benzer ar
bulunmaktadr)
Sistem arlar
169
Gml Linux
Sistem arlarn glibc zerinden kullandmz iin, glibc tarafnda sistem arsndan
EINTR hatas geldiinde, uygulamaya geri dn deeri olarak -1 dnlr fakat errno
Sistem arlar
170
Gml Linux
Strace Kullanm
Nasl alr?
Unix tabanl sistemlerde strace gibi bir uygulamann varolabilmesi iin gereken ptrace
sistem ars uzun yllardr (SVr4 ve 4.3BSD) bulunmaktadr.
Sistem ars ismini process trace kavramndan alr. ptrace sistem ars zerinden bir
uygulama baka bir uygulamann durumunu takip edebildii gibi deiiklikler yapma
imkanna da sahip olmaktadr.
ptrace sistem ars temel olarak gdb gibi debug uygulamalarnda, strace, ltrace gibi
Tipik Kullanm
Uygulamanz strace ile aadaki biimde balatmanz yeterlidir:
$ strace ls /tmp
Strace Kullanm
171
Gml Linux
-f Parametresi
Strace'in uygulamann tm thread'lerini ve uygulamadan fork() edilen dier ocuk srelerini
takip edebilmesi iin -f parametresi verilmelidir.
$ strace -f ./example
$ strace -f -p $(pidof mysqld)
-e Parametresiyle Filtreleme
Strace kts zaman zaman takip iin olduka kalabalk olabilir.
Sadece belirli sistem arlarn takip etmek istiyorsanz e parametresi ile bunu
yapabilirsiniz:
$ strace -f -e trace=open,write,close,connect,select -p 3245
Sadece dosya ilemleriyle ilgili sistem arlarn takip etmek iin -e trace=file
kullanlabilir:
$ strace -e trace=file 4535
Sadece network ile ilgili sistem arlarn filtrelemek iin -e trace=network kullanlabilir:
$ strace -e trace=network 23232
Strace Kullanm
172
Gml Linux
Strace Kullanm
173
Gml Linux
Ptrace Engelleme
Linux altnda bir uygulamann, kendisinin root harici kullanclar tarafndan ptrace sistem
ars ile kontrol edilmesini engelleyebilmesine imkan verilmitir.
Bu ilem iin prctl zel sistem ars kullanlr. Uygulama prctl araclyla kendisi iin
PR_SET_DUMPABLE bayran temizleyecek olursa root haricindeki kullanclarn uygulamaya
sinyal gnderme hakk olsa dahi bu uygulamay ptrace ile kontrol etme anslar olmaz.
Bu zelliin en tipik kullanmlarndan biri, OpenSSH authentication agent yazlmnda
grlr. Bylelikle kullanclarn parola girme aamasnda uygulamann ptrace ile baka bir
uygulama tarafndan kontrol engellenmi olur.
Gvenlik
Linux kullanmnn yaygnlamasyla birlikte zararl yazlmlara rastlanma skl da
artmaktadr. Geleneksel Linux process modelindeki ptrace imkan seti sebebiyle,
sisteminizde kendi kullancnzla altrdnz herhangi bir yazlm ierisine zararl bir kod
enjekte edilmi ise (en basit xterm aracndan gelimi web tarayc uygulamalarna kadar),
ptrace sistem ars sayesinde alan dier tm uygulamalarnzn kontrolnn bu zararl
Strace Kullanm
174
Gml Linux
Deer
Anlam
ile derleyebilirsiniz.
Not: rnek uygulama 32 bitlik sistemler iin yazlm olup mimari farkllklar gzard
edilmitir. Bu sebeple 32 bitlik bir sistemde veya gcc-multilib kurulu ise -m32
parametresi ile derlemelisiniz.
Strace Kullanm
175
Gml Linux
/* ministrace.c */
#include <sys/ptrace.h>
#include <sys/reg.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int wait_for_syscall(pid_t child)
{
int status;
while (1) {
ptrace(PTRACE_SYSCALL, child, 0, 0);
waitpid(child, &status, 0);
if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)
return 0;
if (WIFEXITED(status))
return 1;
}
}
int do_child(int argc, char **argv)
{
char *args [argc+1];
memcpy(args, argv, argc * sizeof(char*));
args[argc] = NULL;
ptrace(PTRACE_TRACEME);
kill(getpid(), SIGSTOP);
return execvp(args[0], args);
}
int do_trace(pid_t child)
{
int status, syscall, retval;
waitpid(child, &status, 0);
ptrace(PTRACE_SETOPTIONS, child, 0, PTRACE_O_TRACESYSGOOD);
while(1) {
if (wait_for_syscall(child) != 0) break;
syscall = ptrace(PTRACE_PEEKUSER, child, sizeof(long)*ORIG_EAX);
fprintf(stderr, "syscall(%d) = ", syscall);
if (wait_for_syscall(child) != 0) break;
retval = ptrace(PTRACE_PEEKUSER, child, sizeof(long)*EAX);
fprintf(stderr, "%d\n", retval);
}
return 0;
Strace Kullanm
176
Gml Linux
}
int main(int argc, char **argv)
{
if (argc < 2) {
fprintf(stderr, "Usage: %s prog args\n", argv[0]);
exit(1);
}
pid_t child = fork();
if (child == 0) {
return do_child(argc-1, argv+1);
} else {
return do_trace(child);
}
}
Uygulama derlendikten sonra herhangi bir komutu ministrace ile altrp kty
inceleyebiliriz:
$ ./ministrace date
syscall(11) = 0
syscall(12) = 21843968
syscall(21) = -2
syscall(9) = 164245504
...
syscall(9) = 164241408
syscall(1) = Tue Mar 3 13:44:52 EET 2015
29
syscall(3) = 0
...
rnek uygulamamzda 65 satrlk bir kod ile strace uygulamasnn temel alma prensibi
gsterilmeye allmtr. Daha gelimi bir rnekte sistem arlarnn numaralarndan
isimlerine ulamak, arda kullanlan parametreleri ve geri dn kodlarnn ilgili sistem
ars zelinde anlamlarn gstermek mmkn olabilir.
Strace Kullanm
177
Gml Linux
178
Gml Linux
Make
Uygulama gelitirirken sklkla obje dosyalarmz yeniden ve yeniden oluturmak zorunda
kalrz. Yerine gre gcc , ld , ar vb. uygulamalar tekrar tekrar ayn parametrelere
arrz. te make ugulamas, programlarn yeniden derlenme srecini otomatik hale
getirmek, sadece deien ksmlarn yeniden derlenmesini salamak suretiyle zamandan
kazanmak ve ilemleri her zaman otomatik olarak doru srada yapmak iin tasarlanmtr.
Temel Kurallar
make uygulamas altrldnda, bulunulan dizinde srasyla GNUmakefile , makefile ve
Makefile dosyalarn arar. Alternatif olarak -f seenei ile Makefile olarak kullanacanz
dosyay da belirlemeniz mmkn olsa da standartlarn dna kmamakta fayda var. make
neyi nasl yapacan bu dosyalardan renecektir. Eer bulunduunuz dizinde bir
Makefile dosyas yoksa aadaki gibi bir kt alacaksnz demektir:
$ make
make: *** No targets specified and no makefile found. Stop.
Make
179
Gml Linux
Kurallar arasnda bir satr bo braklmas GNU make iin zorunlu olmamakla birlikte baz
Unix versiyonlaryla uyumluluk iin boluk braklmas gereklidir.
lk satrda hedef1 'in oluturulmasnda etkili olan, dolaysyla bamllk reten dosyalar
birbirinden boluk ile ayrlm olarak tek satrda listelenir. Eer bamllk ksmnda yer alan
dosyalardan en az birinin son deitirilme tarihi, hedef1 'den daha yeni ise, hedef1 yeniden
oluturulur. Dier durumda hedef1 'in yeniden oluturulmasna gerek olmad anlalr,
nk hedef1 'in baml olduu dosyalarda hedef1 retildikten sonra bir deiiklik
olmamtr.
NOT: Grld zere dosyalarn son deitirilme tarihleri zerinden ileyen bir
mekanizma bulunmaktadr. Sistem saatiniz ileri veya geri zplarsa kurallar doru
alamayacaktr. Bu durumda make clean ile nce tam bir temizlik yaplp yeniden
sreci balatabilirsiniz.
Eer sistem zamanndaki oynamalar nedeniyle, dosyalarn son gncellenme zamanlar,
o anki sistem saatinden daha ileride ise, make: warning: Clock skew detected. Your
build may be incomplete eklinde bir uyar alnacaktr.
Sonraki satrlarda bamllk yaratan bu dosyalardan hedef1 'in oluturulabilmesi iin gerekli
komutlar yer alr. imdi basit bir rnek iin nce yeni bir dizin oluturup ierisinde aadaki
Makefile dosyasn oluturalm:
make uygulamasna Makefile ierisindeki bir hedef kural ismini parametre olarak
Make
180
Gml Linux
4. Eer bulunduumuz dizinde bolgeler dosyas zaten mevcut ve son deitirilme tarihi,
bamllklar olan marmara , karadeniz ve ege dosyalarnn her nden de daha
gncel olsa idi, make yeni bir ilem yapmaya gerek olmadn dnecekti. Ancak
bizim dizinimizde henz bu dosyalarn hi biri yok
5. Bu nedenle bolgeler hedefini gereklemek iin ncelikle dizinde mevcut olmayan
marmara hedefini gereklemek iin ilemlere baland
6.
marmara hedefi de benzer ekilde istanbul ve bursa dosyalarna baml ve her iki
CC = gcc
CFLAGS = -O2 -Wall -pedantic
LIBS = -lm -lnsl
all: install
ornek: ornek.o
$(CC) $(CFLAGS) $(LIBS) -o ornek ornek.o
ornek.o: ornek.c
$(CC) $(CFLAGS) -c ornek.c
clean:
rm -f ornek *.o
install: ornek
cp ornek /usr/local/bin
Make
181
Gml Linux
Make
182
Gml Linux
$ make ornek.o
gcc -O2 -Wall -pedantic -c ornek.c
$ make clean
rm -f ornek *.o
$ make
gcc -O2 -Wall -pedantic -c ornek.c
gcc -O2 -Wall -pedantic -lm -lnsl -o ornek ornek.o
cp ornek /usr/local/bin
Grdnz gibi clean adnda bir dosya var olduu ve clean iin bamllk listesi
olmadndan dolay, kuraln gncelliini koruduunu ve alttaki komutlarn altrlmamas
gerektiini dnd. te bu gibi durumlar iin zel bir kural mevcuttur: .PHONY
Yukarda anlatlan problemi giderebilmek iin Makefile dosyamzn ieriine aadaki kural
da eklemeliyiz:
.PHONY: clean
Bylelikle make clean komutunun, bulunulan dizinde clean adnda bir dosya olsa bile
dzgn olarak almasn salam olduk, bir nevi clean hedefini korumaya alm olduk.
Make
183
Gml Linux
LIBS = -lm \
-lrt \
-lpthread \
$(shell pkg-config --libs openssl)
INCLUDES = -I/usr/local/include/custom
all: server client
server: common.o server.o list.o
$(CC) $(CFLAGS) $(LIBS) -o server common.o server.o list.o
client: common.o client.o
$(CC) $(CFLAGS) $(LIBS) -o client common.o client.o
common.o: common.c common.h
$(CC) $(CFLAGS) $(INCLUDES) -c common.c
server.o: server.c server.h common.h list.h
$(CC) $(CFLAGS) $(INCLUDES) -c server.c
client.o: client.c client.h ortak.h
$(CC) $(CFLAGS) $(INCLUDES) -c client.c
list.o: list.c list.h
$(CC) $(CFLAGS) $(INCLUDES) -c list.c
install: client server
mkdir -p /usr/local/bin
cp client /usr/local/bin/
cp server /usr/local/bin/
uninstall:
rm -f /usr/local/bin/client
rm -f /usr/local/bin/server
clean:
rm -f *.o server client
.PHONY: clean
Make
184
Gml Linux
Ancak gene de yukardaki gibi bir Makefile yazmak uzun srecek bir ilemdir. Eer
uygulamanz 60 adet .c dosyasndan oluuyorsa ve 60 farkl obje iin tek tek kurallar
yazmak zorunda kalyorsanz bu ho olmaz. nk tm .o dosyalarn retebilmek iin
vereceimiz komut ayn: $(CC) $(CFLAGS) $(INCLUDES) -c xxx.c Oysa biz 60 defa bu komutu
tekrar yazmak zorundayz. te bu noktada soyut kurallar (abstract rules) imdadmza yetiir.
Bir soyut kural genel olarak *.u1 uzantl bir dosyadan *.u2 uzantl bir dosyann nasl
retileceini tanmlar. Kullanm aadaki gibidir:
.u1.u2:
komutlar
komutlar
...
levi
$<
$@
$^
Bu bilgiler nda hemen bir rnek verelim. Uzants .cpp olan bir kaynak kodundan obje
kodunu retebilmek iin aadaki gibi bir kural tanmlayabiliriz:
.cpp.o:
g++ -c $<
imdi konuya biraz daha aklk getirelim. Kaynak dosyamzn ad helper.cpp ve amacmz
helper.o obje dosyasn retmek olsun. Yukardaki kural kaynak dosyamz iin altnda
.cpp.o: satr yznden helper.cpp, oluacak helper.o iin bir bamllk durumunu alr. Bu
nedenle $< deikeni helper.cpp'yi gsterir. Bu sayede helper.o dosyas retilmi olacaktr.
imdi ayn mantkla obje dosyalarndan altrlabilir programmz retelim.
Make
185
Gml Linux
.o:
g++ $^ -o $@
Bu biraz daha kark nk altrlabilir dosyamzn uzants olmayacak. Eer tek bir
uzant verilmi ise bunun birinci uzant olduu ve ikincinin bo olduu dnlr.
Soyut kurallar tanmladmzda yapmamz gereken iki ilem daha bulunur. Bunlardan
birincisi kullandmz uzantlarn neler olduunu belirtmektir. Bu ilem iin .SUFFIXES zel
deikeni kullanlr:
.SUFFIXES: .cpp .o
Dier yapmamz gereken ilem ise retilecek altrlabilir dosyamzn hangi obje
dosyalarna, obje dosyalarmzn ise hangi kaynak dosyalarna baml olduunu belirtmek
olacaktr. in en g taraf da budur. Her zaman doru deerleri yazmak o kadar kolay
olmayabilir. Bu noktada gcc derleyicisinin -M , g++ derleyicisinin -MM seenekleriyle
bamllklar Makefile dosya biimine uygun ekilde hesaplatabiliriz. Aadaki ekran
ktsna bakalm:
$ gcc -M server.c
server.o: server.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/x86_64-linux-gnu/bits/wordsize.h \
/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h \
/usr/include/x86_64-linux-gnu/bits/types.h \
/usr/lib/gcc/x86_64-linux-gnu/4.7/include/stdarg.h \
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h common.h list.h
Grld gibi server.o iin gerekli Makefile kuraln bizim iin hatasz olarak verdi. Tek
yapmamz gereken bu satrlar kopyalayp Makefile ierisine yaptrmaktr. Ancak
bamllklar hesaplandnda, esasen pek sk deimeyen sistem ktphaneleri iindeki
referans gsterdiimiz balk dosyalarnn da eklenmi olduunu gryoruz. Makefile
dosyasna her bir .o bamllk listesi iin bunlara yazarsak dosya bizim iin iyice okunmaz
hale gelecek. O yzden genel sistem balk dosyalarn atlayarak, Makefile dosyamz bu
yntemler eliinde soyut kurallarla yeniden yazmay deneyelim.
Make
186
Gml Linux
LIBS = -lm \
-lrt \
-lpthread \
$(shell pkg-config --libs openssl)
INCLUDES = -I/usr/local/include/custom
.SUFFIXES: .c .o
.c.o:
$(CC) $(CFLAGS) $(INCLUDES) -c $<
.o:
$(CC) $(CFLAGS) $(LIBS) $^ -o $@
all: server client
server: common.o server.o list.o
client: common.o client.o
common.o: common.c common.h
server.o: server.c server.h common.h list.h
client.o: client.c client.h ortak.h
list.o: list.c list.h
install: client server
mkdir -p /usr/local/bin
cp client /usr/local/bin/
cp server /usr/local/bin/
uninstall:
rm -f /usr/local/bin/client
rm -f /usr/local/bin/server
clean:
rm -f *.o server client
.PHONY: clean
Make
187
Gml Linux
nternet zerinde eitli Makefile makro ktphaneleri bulmanz mmkn. Bunlardan bizce
fonksiyon seti / kullanm kolayl / maksimum fayda dengesinde en iyilerinden biri, Alper
Akcan tarafndan hazrlanm olan Makefile.lib makro ktphanesidir. Ktphaneyi
https://github.com/alperakcan/libmakefile adresinden indirebilirsiniz.
Makefile.lib , apraz derleme ilemlerini CROSS_COMPILE_PREFIX deikeninin ayarlanmas
Make
188
Gml Linux
target-y = target1
target-y += target2
target1_files-y = \
target_file_shared.c \
target1_file_2.c \
target1_file_3.c
target1_includes-y = \
./ \
/opt/include
target1_libraries-y = \
./ \
/opt/lib
target1_cflags-y = \
-DUSER_DEFINED \
-O2
target1_ldflags-y = \
-luserdefined
target2_files-y = \
target_file_shared.c \
target2_file_2.c \
target2_file_3.c
target2_includes-y = \
./ \
/opt/include
target2_libraries-y = \
./ \
/opt/lib
target2_cflags-y = \
-DUSER_DEFINED \
-O2
target2_ldflags-y = \
-luserdefined
include Makefile.lib
Make
189
Gml Linux
Make
190
Gml Linux
include Makefile.config
MOC ?= moc
target_o-y = \
libnavigator.o
target_a-y = \
libnavigator.a
target-$(ENABLE_NAVIGATOR_DEMO) = \
navigator-demo
libnavigator.o_files-y = \
tag.h \
navigator.c \
../amalgamation/libamalgamation.o
libnavigator.a_files-y = \
libnavigator.o \
ifeq (${COMMON_POINT_TYPE}, int)
libnavigator.o_cflags-y += \
-DNAVIGATOR_COMMON_POINT_TYPE_INT=1
endif
ifeq (${COMMON_POINT_TYPE}, double)
libnavigator.o_cflags-y += \
-DNAVIGATOR_COMMON_POINT_TYPE_DOUBLE=1
endif
ifeq (${COMMON_BOUND_TYPE}, int)
libnavigator.o_cflags-y += \
-DNAVIGATOR_COMMON_BOUND_TYPE_INT=1
endif
ifeq (${COMMON_BOUND_TYPE}, double)
libnavigator.o_cflags-y += \
-DNAVIGATOR_COMMON_BOUND_TYPE_DOUBLE=1
endif
navigator-demo_depends-y = \
libnavigator.o
navigator-demo_files-y = \
navigator-qt.cpp \
navigator-qt-moc.cpp \
libnavigator.o
navigator-qt-moc.cpp: navigator-qt.h
${Q}$(MOC) ${navigator-demo_cflags-y} navigator-qt.h -o navigator-qt-moc.cpp
navigator-demo_cflags-y = \
Make
191
Gml Linux
$(shell echo $(CC) | awk '{ if (/mingw/) { print "-Wl,-Bstatic -static-libgcc -L/mingw/Qt/lib -lm
$(shell pkg-config freetype2 --libs) \
-lexpat \
-lm \
-lz \
$(shell pkg-config QtGui --libs) \
-lpthread
navigator-demo_ldflags-${ENABLE_RENDER_CAIRO} += \
$(shell pkg-config cairo --libs)
navigator-demo_ldflags-${ENABLE_COMPRESS_SNAPPY} += \
-lsnappy
navigator-demo_ldflags-${ENABLE_INPUT_TIF} += \
-lgeotiff \
-ltiff
navigator-demo_ldflags-${ENABLE_RENDER_PNG} += \
$(shell pkg-config libpng --libs)
navigator-demo_ldflags-${ENABLE_RENDER_JPEG} += \
-ljpeg
include Makefile.lib
Satr banda yer alan - karakteri, ilgili dosya include edilmek iin arandnda dizinde yer
almyorsa make srecinin hata vermeyip yoluna devam etmesini salamak iin konulmutur.
Eer make altrlrken PLATFORM deikenine atama yaplrsa, ncelikle ilgili dosya
include edilecektir.
Ardndan her koulda Makefile.config dosyasnn include edildiini grmekteyiz.
Make
192
Gml Linux
imdi PLATFORM deikenin Debian olarak atand rnek bir make kullanmn ve
Debian.config ile Makefile.config dosyalarnn ieriklerini grelim:
Make
193
Gml Linux
# Makefile.config
ENABLE_NAVIGATOR_DEMO ?= y
ENABLE_RENDER_COPYRIGHT ?= y
RENDER_COPYRIGHT_COLOR ?= 0x202a77a3
ENABLE_COMMON_CLIPPER ?= y
COMMON_FILE_CACHE_SIZE ?= 0x2000000
ENABLE_INPUT_TIF ?= y
ENABLE_INPUT_OSM ?= y
ENABLE_INPUT_JPEG_TURBO ?= y
ENABLE_INPUT_TILE ?= y
ENABLE_RENDER_CAIRO ?= n
ENABLE_RENDER_PNG ?= n
ENABLE_RENDER_JPEG ?= y
ENABLE_RENDER_JPEG_TURBO ?= y
ENABLE_RENDER_TEXT_ON_PATH ?= y
ENABLE_COMPRESS_SNAPPY ?= y
ENABLE_RENDER_FLOATING_SCALE ?= y
ENABLE_EXTERNAL_LOGGER ?= n
ENABLE_DEBUGF ?= n
ENABLE_ERRORF ?= y
ENABLE_INFOF ?= y
ENABLE_TODOF ?= n
ENABLE_ASSERTF ?= y
COMMON_POINT_TYPE ?= double
COMMON_BOUND_TYPE ?= double
Make
194
Gml Linux
Make Alternatifleri
CMake
CMake, birden ok platformu destekleyen (Linux, Apple, Windows) gl bir ina aracdr.
Gelitirilmesi byk lde Kitware firmas tarafndan yaplmaktadr.
CMake kendi kural dosyalarn ileyerek, hangi platformda alyorsa o platform iin doal
ina sistemine ait kural dosyalar oluturur (*NIX sistemler iin Makefile).
Aadaki rnek CMake dosyasn inceleyiniz:
Make
195
Gml Linux
if (${UNIX})
set (DESKTOP $ENV{HOME})
else()
set (DESKTOP $ENV{USERPROFILE}/Desktop)
endif()
set (PRJ ${DESKTOP}/common/svn )
set (FILELIST ${PRJ}/src/source.txt )
message(STATUS "CMAKE_GENERATOR : ${CMAKE_GENERATOR}")
message(STATUS "DESKTOP : ${DESKTOP}")
message(STATUS "PRJ : ${PRJ}")
message(STATUS "FILELIST : ${FILELIST}")
message(STATUS "SYSTEM_NAME : ${CMAKE_SYSTEM_NAME}")
project(project_name)
include_directories(
${PRJ}/src
${PRJ}/includes
)
# Load SRC Variable from file
file(READ ${FILELIST} SRC)
string(REGEX REPLACE "#.*$" "" SRC ${SRC})
string(REPLACE "\n" ";" SRC ${SRC})
add_executable(${PROJECT_NAME} ${SRC} )
foreach (f ${SRC})
set_source_files_properties(${f} PROPERTIES LANGUAGE CXX)
endforeach(f)
if (${WIN32})
link_directories(
)
add_definitions(
-DDEFINE1
)
target_link_libraries(
${PROJECT_NAME}
wsock32.lib
)
endif()
SCons
SCons, Python dili ile gelitirilmi, birden ok platformu destekleyen dier bir ina aracdr.
Make
196
Gml Linux
Rake
Ruby ile gelitirilmi ve daha ok Ruby projelerinde kullanlan bir ina aracdr.
Rubynin DSL tanmlama noktasndaki gl zelliklerini kullanr.
Kurallar Rakefile dosyalarnda tutulur.
Rakefile ierisinde Ruby dilinde grevler ve kurallar tanmlanabildii gibi, dilinden
kendisinden gelen ekstra zelliklerle rnein alma zamannda yeni snflar dahi retilebilir.
Aadaki rnek Rakefile dosyasn inceleyebilirsiniz:
Make
197
Gml Linux
namespace :cake do
desc 'make pancakes'
task :pancake => [:flour,:milk,:egg,:baking_powder] do
puts "sizzle"
end
task :butter do
puts "cut 3 tablespoons of butter into tiny squares"
end
task :flour => :butter do
puts "use hands to knead butter squares into 1{{frac|1|2}} cup flour"
end
task :milk do
puts "add 1{{frac|1|4}} cup milk"
end
task :egg do
puts "add 1 egg"
end
task :baking_powder do
puts "add 3{{frac|1|2}} teaspoons baking powder"
end
end
Make
198
Gml Linux
bunun gibi pek ok farkllk yznden her Unix sisteminde alabilecek bir Makefile
yazmak olduka gtr. Kullanlan ktphanelerin sistemler arasndaki farkllklar ise apayr
bir konudur. te GNU build sistemi tm bu zorluklarn stesinden gelebilmek iin
oluturulmutur.
Kdevelop gibi programlar yeni proje oluturduunuzda build sistemini de otomatik olarak
oluturmaktadrlar. Ancak oluan dosyalar fazlasyla kark olduundan bu blmde ok
daha basit rneklerle yapy anlatmaya alacaz. Buradaki temel bilgilerden
yararlandktan sonra Kdevelop vb. gibi programlarn rettii veya internetten indirmi
olduunuz herhangi bir uygulamann kaynak kodu ierisinde gezinerek farkl kullanmlar
inceleyebilirsiniz.
Gerekli Aralar
Gnu build sistemi iin gerekli aralar ve kullanm alanlar aadaki gibidir:
1. autoconf: konfigrasyon iin kullanlacak configure betik programn retir. Kodun
tanabilir olmasn etkileyecek zellikleri, zerinde alt platform iin denetler. Elde
ettii deerleri, daha nceden belirtilmi ablonlara uygun ekilde birletirerek
zelletirilmi Makefile, balk dosyalar vb. oluturur. Bu sayede program derleyecek
kullanc tek tek elle bu deiiklikleri yapmak zahmetinden kurtulur.
2. automake:, autoconf iin kullanlacak Makefile ablonlarn (Makefile.in) Makefile.am
dosyalarn temel alarak retir. Automake tarafndan retilen Makefile dosyalar GNU
makefile standartlarna uygun olup, kullancy elle Makefile dosyas oluturma
zahmetinden kurtarr. Autoconf'un alabilmesi iin ncelikle automake'in dzgn
olarak almas gereklidir.
Autoconf, Automake
199
Gml Linux
Autoconf, Automake
200
Gml Linux
Baz platfomlarda dizin eriim yetkileri iin 2. argman kullanlyorken dierlerinde tek
argman kullanld bilinmektedir.
Aakda mkdir() fonksiyonunun platformlar aras tanabilirliini bizim iin kolaylatran
AX_FUNC_MKDIR makro rnei verilmitir:
#if HAVE_MKDIR
# if MKDIR_TAKES_ONE_ARG
/* MinGW32 */
# define mkdir(a, b) mkdir(a)
# endif
#else
# if HAVE__MKDIR
/* plain Windows 32 */
# define mkdir(a, b) _mkdir(a)
# else
# error "Don't know how to create a directory on this system."
# endif
#endif
rnek Uygulama
imdi aadaki rnek uygulamamz iin GNU build sistemini nasl kullanacamz
renelim.
Autoconf, Automake
201
Gml Linux
#include <stdio.h>
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
int main (int argc, char *argv[])
{
printf("rnek alyor\n");
if (argc == 2) {
const char *target = argv[1];
int rc;
#ifdef HAVE_MKDIR
#ifdef MKDIR_TAKES_ONE_ARG
rc = mkdir(target);
#else
rc = mkdir(target, 0755);
#endif
if (rc == 0) {
printf("%s dizini oluturuldu\n", target);
} else {
fprintf(stderr, "%s dizini oluturulamad\n", target);
}
#else
fprintf(sdterr, "mkdir() desteklenmiyor\n");
#endif
}
return 0;
}
Autoconf, Automake
202
Gml Linux
dosyas olutu.
Sonraki admda autoheader komutunu altryoruz. Eer configure.ac dosyasnda
AC_CONFIG_HEADERS belirtilmemise yaplacak kontroller sonras elde edilen deerler
config.h dosyasna yazlmayacak olduundan bu adm atlayabilirsiniz:
$ autoheader
$ ls -l config.h.in
-rw-r--r-- 1 demirten demirten 1825 Dec 27 02:43 config.h.in
Autoconf, Automake
203
Gml Linux
lem sonrasnda bulununan dizinde configure adl tandk betik uygulamasn oluturmu
oluyoruz.
configure betii de olutuktan sonra automake -a komutuyla gereken dier dosyalar
oluturuyoruz:
$ automake -a
configure.ac:4: installing './compile'
configure.ac:3: installing './install-sh'
configure.ac:3: installing './missing'
Makefile.am: installing './depcomp'
Yazlmlarda olmas beklenen baz temel dosyalarn (ChangeLog, README vb.) alma
dizinimizde bulunmamas nedeniyle uyar mesajlarn grmekteyiz ama u aamada bunu
dikkate almamza gerek yok.
automake -a komutu sonras dizin ieriimiz aadaki hale gelmektedir:
$ ls
aclocal.m4
autom4te.cache
compile -> /usr/share/automake-1.14/compile
config.h.in
configure
configure.ac
depcomp -> /usr/share/automake-1.14/depcomp
install-sh -> /usr/share/automake-1.14/install-sh
Makefile.am
Makefile.in
missing -> /usr/share/automake-1.14/missing
ornek.c
Autoconf, Automake
204
Gml Linux
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking sys/time.h usability... yes
checking sys/time.h presence... yes
checking for sys/time.h... yes
checking for gettimeofday... yes
checking for mkdir... yes
checking for _mkdir... no
checking whether mkdir takes one argument... no
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
Autoconf, Automake
205
Gml Linux
Autoconf, Automake
206
Gml Linux
Artk Makefile dosyamz hazr olduunda gre, make komutu ile derleme ilemini yapabiliriz:
$ make
make all-am
make[1]: Entering directory /tmp/deneme
gcc -DHAVE_CONFIG_H -I. -g -O2 -MT ornek.o -MD -MP -MF \
.deps/ornek.Tpo -c -o ornek.o ornek.c
mv -f .deps/ornek.Tpo .deps/ornek.Po
gcc -g -O2 -o ornek ornek.o
make[1]: Leaving directory /tmp/deneme
Uygulamamz altralm:
$ ./ornek dizin1
rnek alyor
dizin1 dizini oluturuldu
Uygulamann Kurulumu
autotools bileenleriyle yaptmz bu alma, uygulamann sadece derlenmesi srecini
deil, kurulum ve sistemden kaldrma srelerini de desteklemektedir. Bu noktada dilerseniz
uygulamay sisteme kurabilirsiniz. Bunun iin uygulamann kurulaca dizinler zerinde
yazma yetkinizin bulunmas gerekecektir.
Uygulamay sistemimize kurmak iin:
$ sudo make install
make[1]: Entering directory /tmp/deneme
/bin/mkdir -p /usr/local/bin
/usr/bin/install -c ornek /usr/local/bin
make[1]: Nothing to be done for install-data-am.
make[1]: Leaving directory /tmp/deneme
autoreconf
Zaman ierisinde Makefile.am veya configure.ac dosyalarnda deiiklik yaptnzda,
autotools aralarn doru srada yeniden altrmanz gerekecektir.
Autoconf, Automake
207
Gml Linux
Autoconf, Automake
208
Gml Linux
rneimizdeki configure.in dosyas ierisinde yer almayan ama sklkla kullanacamz baz
komutlar da unlardr:
AC_PROG_RANLIB komutuyla bir ktphane gelitiriyorsak ranlib'in sistemde nasl
kullanlacan renebiliriz.
AC_PROG_CXX komutuyla sistemdeki C++ derleyicisinin ne olduunu renebiliriz.
AC_PROG_YACC ve AC_PROG_LEX komutlaryla kaynak kodlarmz lex veya yacc
dosyalar ieriyorsa bu uygulamalarn sistemde varln denetleyebiliriz.
Eer alt dizinlerde baka Makefile dosyalarmz da olacaksa bunu
AC_OUTPUT(Makefile \
dizin1/Makefile \
dizin2/Makefile \
)
komutlaryla belirtebiliriz.
Dosyalarn ieriinden bahsettikten sonra imdi de biraz nc yaptmz rnekte
altrdmz komutlardan sonra neler olduuna tekrar bakalm.
aclocal komutu altktan sonra aclocal.m4 dosyas retilir. Bu dosya ierisinde
autoconf tarafndan kullanlacak olan makrolar yer almaktadr (kendi zel makrolarmz
nasl hazrlayacamza ileride deinilecektir).
autoconf komutuyla aclocal.m4 ve configure.ac dosyalar ilenerek configure betik
program oluturulur.
automake komutu Makefile.am dosyasn temel alan bir Makefile.in oluturur. Ayrca
GNU kodlama standartlarna gre eksik olan dosyalar iin rnek birer kopya retir.
./configure komutuyla altrlan betik program daha nceden belirtilen zellikler iin
Autoconf, Automake
209
Gml Linux
eklemeliyiz:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
Burada unutulmamas gereken nemli bir nokta, config.h dosyasnn mutlaka ilk olarak
include edilmesidir.
Program kaynak kodunu bu ekilde deitirdikten sonra configure.ac dosyasna
AC_CONFIG_HEADERS([config.h]) satrn ve kontrol etmek istediimiz ilgili makrolar
eklemeliyiz.
Automake Deikenleri
Projemiz bydke kaynak kodlarn bulunduu yerler gittike karmaya balar. Bunlar
dzenleyebilmek amacyla daha hiyerarik dizin yaplar kurarz. Ancak bu defa da her bir
dizin iin uygun Makefile dosyalarn retmemiz gerekecektir. Bunun iin bu blmde
Makefile.am dosyalarndan daha detayl bir ekilde bahsedeceiz.
Makefile.am dosyalarnn genel biimi deiken = deer eklindedir. Ancak ayn zamanda,
geleneksel Makefile mantndaki gibi hedef ve soyut kural tanmlamalarn da destekler.
imdi Makefile.am dosyalarnda sklkla kullanacamz satrlara bir bakalm.
INCLUDES = -I/usr/local/include -I/usr/custom/include ...: Obje kodlarn
olutururken derleyiciye include edilen dosyalar hangi dizinlerde aramas gerektiini
belirtir. Ayrca proje kaynak kod yaps ierisindeki bir dizin seenek olarak verildi ise alt
dizinlerde yer alan kaynak programlarn hepsinin bu dosyalara eriebilmelerini
salamak amacyla tanmlama INCLUDES = -I$(top_srcdir)/src/libxxx eklinde
yaplmaldr. Buradaki $top_srcdir deikeni kaynak kod yaps ierisindeki en st
dizini tutar.
LDFLAGS = -L/usr/local/lib ...: Derleyici altrlabilir dosyalar retirken ihtiya
duyduu ktphaneleri hangi dizinlerde aramas gerektiini bu tanmla renecektir.
LDADD = test.o ... $(top_builddir)/lib/libfoo.a ... -lfoo ...: Tm oluacak altrlabilir
dosyalara linklemek istediiniz sisteme kurulu olan ve olmayan obje dosyalar burada
listelenir. Eer listelenen obje dosyas sistemde kurulu deilse dosyan tam adresi
verilmelidir ($top_builddir/lib/libfoo.a rneindeki gibi).
EXTRA_DIST = dosya1 dosya2 ...: Kaynak kod paketinizde bulunmasn istediiniz her
trl dosyay burada listeleyebilirsiniz.
Autoconf, Automake
210
Gml Linux
SUBDIRS = dizin1 dizin2 ...: Bulunulan dizin iin ilem yapmadan nce kurallarn
altrlmas gereken dizinlerdir. make uygulamas bulunulan dizinde ileme
balamadan nce, burada belirtilen dizinlerdeki Makefile kurallarn altrr ve
listelenen tm dizinler iin ilemleri bitirdikten sonra bu dizine geri dner.
bin_PROGRAMS = test test2 ...: make komutu altktan sonra retilecek ve make
install komutuyla belirli bir dizin altna kopyalanacak program adlar burada listelenir.
lib_LIBRARIES = libfoo1.a libfoo2.a ...: make komutu altktan sonra retilecek ve
make install komutuyla belirli bir dizin altna kopyalanacak ktphane dosyalarnn
adlar burada listelenir.
check_PROGRAMS = program1 program2 ... : make komutunun almas
esnasnda retilmeyip, sadece make check komutuyla retilecek, programnzn tmn
veya bir ksmn test edecek uygulamalarn altrlabilir dosya adlar listelenir.
TESTS = program1 program2 ...: make check komutu sonrasnda test amal
altrlacak dosya adlarn listeler. ou durumda TEST = $(check_PROGRAMS)
eklinde bir tanmlama yapabilirsiniz.
include_HEADERS = foo1.h foo2.h ... : /prefix/include dizini altna kurulmasn
istediiniz balk dosyalarn burada listelemelisiniz.
bin_PROGRAMS deikeninde listelediiniz her bir program iin aadaki
tanmlamalar da yapmalsnz (program kelimesi yerine programn adn yazmalsnz):
program_SOURCES = test.c test1.c test2.c test.h test1.h test2.h ...: Automake
program burada belirtmi olduunuz dosya adlar iin, C, C++ ve Fortran dillerine
zgn soyut Makefile kurallarn oluturur. Eer baka bir dil kullanlyorsa gerekli
kurallar siz vermelisiniz.
program_LDADD = $(top_builddir)/lib/libfoo.a -lnsl ...: Burada programnza
linklenmesi gereken ktphaneleri listelemelisiniz.
program_LDFLAGS = -L/dizin1 ...: program_LDADD ile belirttiiniz ktphanelerin
hangi dizinlerde aranmas gerektii burada listelenir.
program_DEPENDENCIES = dep1 dep2 ... : Programnzn derlenebilmesi iin baml
olduu dier hedefleri burada listelemelisiniz.
Autoconf, Automake
211
Gml Linux
Raspberry Pi
Raspberry Pi, Raspberry Pi Foundation tarafndan eitim amacyla gelitirilmi, tek kart,
mini bilgisayar serisidir. Model A, Model B ve eMMC flash'a sahip Compute Module olmak
zere trleri bulunmaktadr. Model A ve Model B serileri (Model B, Model B+, Model Pi 2)
srasyla $25-$35 aralnda fiyatlardan satlmaktadr.
Biz bu blmdeki incelemelerimizi Raspberry Pi 2 - Model B zerinde yapacaz. lk olarak
ksaca cihazn teknik zelliklerini ve cihazn al srecini inceleyecek, sonrasnda ise
gerekli aralar nasl edinebileceimize ve cihaz zerinde iletim sistemini nasl
altrabileceimize bakacaz.
Raspberry Pi
212
Gml Linux
Aklama
SoC
Broadcom BCM2836 (CPU, GPU, DSP, SDRAM, and single USB port)
CPU
GPU
RAM
Video
k
Hafza
MicroSD
Giri/k
Dier
213
Gml Linux
214
Gml Linux
215
Gml Linux
Al Sreci
Raspberry Pi iin ARM ilemci ana ilemci olarak deil daha ok bir yardmc ilemci
(coprocessor) olarak tasarlanmtr. Ana ilemci ise VideoCore grafik ilemcisidir. Bu
sebeple cihazn al sreci gml cihazlarn genel olarak izledii yoldan bir miktar
ayrmaktadr.
Tipik bir ARM ilemcili cihaz (kitabmzda incelediimiz dier rnek cihazlar dahil olmak
zere) al srecinde genel olarak aadaki admlar izlemektedir:
Cihaza enerji verildikten sonra ARM ilemci alr.
ARM ilemci, ilk olarak, bnyesindeki ROM bellekteki ilk nykleyici (ROM bootloader)
altrr.
ROM bootloader kendinden sonraki iletim sistemini yklemekten sorumlu nykleyiciyi
ykler.
letim sistemi bellee yklenir ve ARM ilemci tarafndan altrr.
Cihaza enerji verilmesinden iletim sisteminin yklenmesine kadar geen tm aamalarda
ARM ilemcinin rol aldn grmekteyiz. Raspberry Pi iin ise al sreci temel olarak
aadaki gibidir.
Cihaza enerji verildiinde ARM ilemci reset modundadr, yani aktif olarak
almamaktadr.
ROM bellekteki ilk nykleyici (first-stage bootloader, ROM bootloader) VideoCore GPU
iindeki kk bir RISC (Reduced Instruction Set Computer) ilemci tarafndan
altrlr.
lk nykleyici tarafndan SD karttaki FAT32 boot blm mount edilir ve ikinci
nykleyici (second-stage bootloader) bootcode.bin, GPU iindeki L2 cache'e
ekilerek, altrlr. Bu aamada ARM ilemci hala reset durumundadr.
kinci nykleyici tarafndan aslnda GPU firmware'i olan son nykleyici (third-stage
bootloader) start.elf yklenir ve altrlr. Bu aamada ekrana gkkua logosu
bastrlmaktadr.
start.elf tarafndan SD kart boot blmndeki config.txt dosyas okunur. Bu ayar
dosyas ile baz sistem ayarlar deitirilebilmekte (ARM ve GPU frekanslar, RAM
paylamlar) ayrca nykleyiciye mdahale edilebilmektedir.
SD kart boot blmnde dtb (bcm2709-rpi-2-b.dtb) ve kernel (kernel.img) dosyalarnn
bulunmas durumunda start.elf tarafndan srasyla 0100 ve 08000 adreslerine
yklenmektedir. Ayrca cmdline.txt dosyasnn bulunmas halinde dosya ieriindeki
komut satr argmanlar ekirdee geirilmektedir.
Son olarak ARM ilemci reset durumundan karlr ve iletim sistemini altrmas
Al Sreci
216
Gml Linux
salanr.
Cihaza enerji verilmesinden, iletim sisteminin altrlmasna kadar geen sre aadaki
diagramda zetlenmitir.
Al Sreci
217
Gml Linux
Gelitirme Aralar
Gelitirme aralar iin birden fazla seenek bulunmasna karn, dorudan donanm
salaycnn nerdii BCM2708 hedefli apraz derleyicileri aadaki gibi edinebilirsiniz:
$ git clone https://github.com/raspberrypi/tools
GPU nykleyicileri
Cihazn al srecini incelerken bootcode.bin ve start.elf olmak zere iki adet
nykleyicinin gerekli olduunu grmtk. Raspberry Pi iin nykleyici ve GPU firmware
dosyalarnn derlenmi hallerini aadaki gibi edinebilirsiniz, bu dosyalara ilikin kaynak kod
eriimi verilmemektedir.
$ git clone https://github.com/raspberrypi/firmware
218
Gml Linux
Yukardaki clone ilemi tm kernel kaynak kodunu gemi commit tarihesi ile birlikte
indireceinden 1 GB'n zerinde download gerektirecektir. Alternatif olarak commit
tarihesinden vazgeip son halini daha kk bir download gerekecek ekilde aadaki gibi
de indirmeniz mmkndr. Ancak bu ekilde indirme ilemi yaptnzda sonradan git pull
yapamazsanz.
$ git clone --depth=1 https://github.com/raspberrypi/linux
Derleme
Derleme srecine balamadan nce kullanacanz toolchain'in PATH ortam deikeni
ierisinde yer aldndan emin olunuz. Eer deilse ncelikle toolchain ana dizinine geip
aadaki komutlar uygulaynz:
$ cd tools
$ export PATH=$PWD/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/:$PATH
Sonraki admda Raspberry Pi 2 board'umuz iin kernel kodu ierisinden kan ntanml
konfigrasyonu uygulayalm:
$ make ARCH=arm bcm2709_defconfig
Kernel kodu ile birlikte gelen ntanml konfigrasyon dosyasnda ihtiya duyulmayacak pek
ok bileen bulunmaktadr (Kullanmayacamz network protokolleri, aygt srcleri, dosya
sistemleri gibi). Bu noktada mevcut kernel konfigrasyonu zerinde ek iyiletirme almalar
iin menuconfig aracn aadaki gibi altrp konfigrasyonu iyiletirebilirsiniz:
219
Gml Linux
220
Gml Linux
221
Gml Linux
Yukardaki rnekte u-boot kodu mainline repo'dan ekildi. Alternatif olarak u-boot mainline
kodu ierisinde Raspberry Pi destei zerinde alan Stephen Warren'in repo'sunu da
kullanabilirsiniz. Yeni gelitirilen zellikleri henz mainline koda entegre edilmeden
denemeniz gerektiinde de buray kullanabilirsiniz:
$ git clone git://github.com/swarren/u-boot.git
$ cd u-boot
$ git checkout -b rpi_dev origin/rpi_dev
Derleme
Kaynak kodu indirmi olduunuz dizine getikten sonra aadaki gibi ntanml
konfigrasyonu baz alarak derleme yapabilirsiniz:
$ make rpi_2_defconfig
$ make CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- -j2
Not: apraz derleyicinizin yol ifadesinin PATH evre deikeninde tanml olduundan
emin olunuz. Baka bir derleyici kullanyorsanz CROSS_COMPILE evre deikenini,
derleyicinizin nekini gsterecek ekilde deitirmelisiniz.
lem tamamlandnda u-boot.bin dosyas ana dizinde oluacaktr.
222
Gml Linux
Busybox
ncelikle gncel busybox kaynak kodlarn indirip diskimizde bir dizine amalyz:
$ wget http://www.busybox.net/downloads/busybox-1.23.2.tar.bz2
$ tar xf busybox-1.23.2.tar.bz2
$ cd busybox-1.23.2
Derleme ilemi tamamlandktan sonra busybox uygulamas ana dizinde oluacaktr. Daha
nce anlatld gibi busybox uygulamasn ierdii dier uygulamalara ait linkleri de
oluturmak suretiyle kullanmamz gereklidir. Bu linkleri oluturmak iin make install
komutunu verebiliriz ancak bu durumda ilgili linkler bulunduumuz yerde _install adl bir
dizinde retilecektir. Bunun yerine rnein /opt/rpi eklinde genel bir dizin ap oray kk
dosya sistemi olarak hazrlamak daha yerinde bir karar olacaktr. Aadaki gibi
CONFIG_PREFIX deikenine atama yapmak suretiyle linklerin ilgili dizinde oluturulmas
salanabilir:
$ sudo mkdir /opt/rpi
$ sudo chown -R $USER /opt/rpi
# Yukardaki 2 komutla /opt/rpi dizinini oluturup yazma yetkilerini
# kendi kullancmza vermi olduk. Bu amala herhangi baka bir dizini de kullanabilirsiniz
$ make CROSS_COMPILE=arm-bcm2708hardfp-linux-gnueabi- CONFIG_PREFIX=/opt/rpi install
223
Gml Linux
$ mkdir /opt/rpi/dev
Ktphanelerin Tanmas
Busybox sayesinde tek bir uygulama ile pek ok komuta birden sahip olduk, ancak busybox
uygulamasnn alabilmesi iin gereken libc.so.6 , libm.so.6 ve libcrypt.so.1
ktphaneleri ile paylaml ktphane kullanan tm uygulamalar iin gerekli olan ldlinux.so.3 ktphanesi de kk dosya sistemimizde /lib dizini altnda yer almaldr.
224
Gml Linux
Raspberry Pi iin daha nce edindiimiz tools dizini altndaki arm-bcm2708/armbcm2708hardfp-linux-gnueabi toolchain'ini kullanmaktaydk. Buras toolchain ana dizinidir
(Raspberry Pi iin tools arivinden 4 adet toolchain kmaktadr, biz burada rneklerimizde
kullandmz versiyon ile ilerliyoruz, dier toolchain'leri kulland iseniz sonraki komutlar da
bu dorultuda deitirmeniz gerekecektir).
Toolchain ana dizini altnda arm-bcm2708hardfp-linux-gnueabi --> lib dizin yaps ierisinde
ihtiya duyduumuz ktphaneler bulunmaktadr. Toolchain ana dizininde iken aadaki
komutlarla bunlar kk dosya sistemimize kopyalayalm:
$ cd arm-bcm2708hardfp-linux-gnueabi/lib
$ cp libc.so.6 libm.so.6 libcrypt.so.1 ld-linux.so.3 /opt/rpi/lib/
Al Betiinin Hazrlanmas
Linux sistemlerde al srecini yneten SysV Init uygulamasnn kk bir versiyonu
busybox ierisinden kmakta ve /sbin/init eklinde kk dosya sistemi zerinde linki
retilmektedir.
init uygulamas gml sistemimizde de ilk alacak uygulama olup, almaya
225
Gml Linux
#! /bin/sh
echo "Sistem aciliyor..."
# Proc dosya sistemini mount edelim
mount -t proc none /proc
# Sysfs dosya sistemini mount edelim
mount -t sysfs none /sys
# Opsiyonel olarak /tmp dizinini bellek zerinde
# tmpfs dosya sistemiyle oluturalm
mount -t tmpfs none /tmp
# devtmpfs /dev zerine overwrite edeceinden
# mount etmeden nce dizini oluturalm
mkdir -p /dev/pts && mount -t devpts none /dev/pts
226
Gml Linux
#! /bin/sh
echo "Sistem kapaniyor"
# Tm uygulamalara TERM sinyali gnder
kill -s SIGTERM -1
# 3 saniye bekle
sleep 3
# Halen uygulama kald ise KILL sinyali gnder
kill -s SIGKILL -1
# Tm mount edilmi blmlerin unmount edilmesini salayalm
# -r parametresi, umount ilemi baarsz olursa
# read-only modda remount edilmesini salar
umount -a -r
quiet Parametresi
ekirdek boot parametreleri arasna (bir sonraki blmde cmdline.txt dosyasna
yazacamz) quiet parametresini eklemeniz halinde al srasnda sistem konsoluna ok
daha az mesaj kartlr.
Bu ilem al sresinin de bir miktar ksalmasn salamaktadr. Sistemi ilk ayaa
kaldrrken tm ekirdek al mesajlarn konsolda grmek yerinde olacaktr. Ancak sistem
kararl hale geldikten sonra quiet parametresini eklemek suretiyle sreci hzlandrmanz
nerilir. Bu parametre ile alta gremediiniz mesajlara sonraki bir anda dmesg komut
ktsndan gene eriebilirsiniz.
Bu parametrenin mevcut ekirdek konfigrasyonumuzdaki etkisini test etmek iin yle bir
yntem izleyebiliriz. Eer kullanc kipinde altrlan ilk uygulama ( init ) zerinden
yukardaki rnekte altrdmz /etc/acilis betiimizde ilk i olarak ekirdek mesajlar
tampon blgesine bir mesaj gnderecek olursa, quiet parametresinin olduu ve olmad
allar karlatrabiliriz.
ekirdek mesajlarnn tutulduu tampon alanna, /dev/kmsg zel aygt dosyasna yazmak
suretiyle biz de bir mesaj koyabiliriz. Yukardaki rneini verdiimiz /etc/acilis betii
ierisinde dier komutlar altrmadan nce aadaki satr ekleyelim:
echo "quiet test mesaji" > /dev/kmsg
227
Gml Linux
quiet olmadnda:
228
Gml Linux
Cihazn Almas
Raspberry Pi 2 yalnz microSD zerinden alabilmektedir. Bu sebeple SD kart zerinde, biri
boot dosyalar dieri ise dosya sistemi iin gerekli, iki adet blmlendirme (partition)
bulunmaldr. FAT32 formatl boot blmlendirmesinde nykleyiciler, ekirdek ve gerekli
dier dosyalar bulunurken, dier blm cihazn tanyabilecei formatta bir dosya sistemini
iermektedir.
SD kart zerine gerekli dosyalar kendimiz yazabileceimiz gibi Raspberry Pi destei olan bir
datm da kullanabiliriz. imdi srayla bu yntemlere bakalm.
Cihazn Almas
229
Gml Linux
Dosya
Grevi
bootcode.bin
start.elf
GPU firmware
fixup.dat
kernel.img
Kernel imaj
config.txt
cmdline.txt
Daha nce de sylediimiz gibi config.txt dosyas ile sistem ayarlar deitirilebilmekte (ARM
ve GPU frekanslar, RAM paylamlar) ayrca nykleyiciye mdahale edilebilmektedir. Bu
dosyann ieriini BIOS ayarlarna benzetebiliriz. config.txt iinde yklenecek ekirdee
ilikin herhangi bir atf bulunmad srece start.elf, kernel.img dosyasn yklemekte ve
ARM ilemciyi reset modundan karmaktadr. ekirdek imaj olarak nykleyicilerle beraber
gelen kernel.img dosyasn kullanabileceiniz gibi daha nce derlediimiz zImage dosyasn
da kernel.img olarak kopyalayp kullanabilirsiniz.
rnek bir config.txt ierii aadaki gibidir:
kernel=kernel.img
NEML NOT: Raspberry Pi iin dier kaynaklarda da yukardaki gibi bir rnek
cmdline.txt dosyas ile karlaacaksnz. Burada verilen ekirdek al
ekilde boot edilen bir ekirdek konsola gidecek mesajlar her iki aygta da gnderir
(rneimizde seri port ve HDMI zerindeki tty konsolu) ancak sonuncu console
parametresi olarak hangi aygt belirtilmise sadece oradan girdi alr. Yani yukardaki
argmanlarla boot edecek olursanz konsol ktlar hem seri portta hem de bal ise
HDMI monitorde grnecek, Linux aldktan sonra ise seri konsoldan giri
yapamayacak, sistemdeki USB portuna takacanz bir USB klavye ile giri yapmak
durumunda kalacaksnz. Giri ilemleri iin de seri konsolu kullanmak istiyorsanz
cmdline.txt ierisinde sralamay uygun ekilde deitirebilir veya console=tty1
Cihazn Almas
230
Gml Linux
Temel bir dosya sisteminin nasl oluturulduunu kitabmzn Kk Dosya Sistemi Oluturma
blmnde bulabilirsiniz.
Artk sistemimiz SD kart zerindeki kk dosya sistemi zerinden almak iin hazr.
u-boot komut satrna dtkten sonra ekirdek ve ilgili dtb dosyasn bellein gvenli bir
alanna ekip, ekirdee kk dosya sistemi ve konsolla ilgili deerleri geirdikten sonra
aadaki gibi altrabiliriz.
mmc dev 0
fatload mmc 0:1 0x01000000 zImage
fatload mmc 0:1 0x02000000 bcm2709-rpi-2-b.dtb
setenv bootargs earlyprintk console=ttyAMA0 console=tty1 root=/dev/mmcblk0p2 rootwait
bootz 0x01000000 - 0x02000000
Cihazn Almas
231
Gml Linux
Grlecei zere ilk altrmada uboot.env adl bir dosya aranmakta ve bulunamad iin
ntanml ortam deikenlerinin kullanlacana dair bilgi verilmektedir.
uboot.env dosyasnn format basit olmakla birlikte, bir metin dosyas olarak hazrlanmas
Cihazn Almas
232
Gml Linux
arch=arm
baudrate=115200
board=rpi_2
board_name=rpi_2
bootargs=earlyprintk console=ttyAMA0 console=tty1 root=/dev/mmcblk0p2 rootwait
bootcmd=run mmcboot
mmcboot=setenv devnum 0; mmc dev 0; fatload mmc 0:1 ${kernel_addr} zImage; fatload mmc 0:1 ${fdt_addr
bootdelay=2
cpu=armv7
fdt_addr=0x2000000
fdtfile=bcm2709-rpi-2-b.dtb
kernel_addr=0x1000000
loadaddr=0x00200000
scriptaddr=0x00000000
soc=bcm283x
stderr=serial,lcd
stdin=serial,lcd
stdout=serial,lcd
usbethaddr=b8:27:eb:4c:66:85
vendor=raspberrypi
Cihazn Almas
233
Gml Linux
Not: dd ile yaplan kopyalama ileminin ilerleyiini izlemek iin baka bir terminalde
aadaki komutu girebilirsiniz.
pkill -USR1 -n -x dd
Bu ilem sonrasnda SD kartnzda daha nce bizim elle kopyaladmz dosyalar da ieren
bir boot blm ve dosya sistemine ilikin ikinci bir blm olumu olmaldr. SD kart cihaza
takp altrdmzda iletim sistemi almaldr.
Benzer ilem Raspberry Pi iletim sistemi ykleyicisi NOOBS ile de yaplabilmektedir.
NOOBS, Raspbian datmnn iermekte ayrca internet zerinden indirdii baka
datmlar da cihaz zerine kurabilmektedir. NOOBS ykleyicisini yine aadaki adresten
indirip, .zip dosyasn atktan sonra bir nceki admda yaptmz gibi dd ile SD karta
yazabilirsiniz.
https://www.raspberrypi.org/downloads/
SD kart cihaza takp enerji verdiinizde cihaz recovery modda alacaktr. Cihaz HDMI
zerinden bir ekrana baladktan sonra, GUI zerinden istediiniz datm seebilir ve
cihaza ykleyebilirsiniz.
Cihazn Almas
234
Gml Linux
235
Gml Linux
Ardndan zImage kernel imaj dosyasn TFTP sunucudan 0x1000000 gibi bir adrese
ekelim:
tftp 0x1000000 zImage
Ayn ekilde cihazmz iin TFTP sunucu ana dizinine koyduumuz bcm2709-rpi-2-b.dtb
FDT dosyasn 0x2000000 gibi bir adrese ekelim:
tftp 0x2000000 bcm2709-rpi-2-b.dtb
236
Gml Linux
Son olarak bootz komutuna kernel imajnn ve FDT imajnn bellekteki adreslerini
parametre olarak verip Linux al srecini balatalm:
bootz 0x1000000 - 0x2000000
237
Gml Linux
238
Gml Linux
239
Gml Linux
Yukardaki satr boot ykleyici tarafndan ilendiinde 1 GB bellein 128 MB' GPU
kullanmna ayrlr, kalan 872 MB ise CPU (ve Linux) tarafndan kullanlabilecek hale gelir. 1
GB bellekli modellerde GPU iin ayrabileceiniz minimum alan 16 MB, maksimum ise 944
MB olabilir.
Benzer ekilde CPU saat frekans, GPU saat frekans, SDRAM frekans, H264 Video
Decoder lisanslar vb. ayarlanabilir. Aadaki blmlerde balca konfigrasyon bloklarn
inceleyeceiz.
Bellek Konfigrasyonu
gpu_mem
Sistemde yer alan GPU'nun bellein ne kadarn kullanacan bu ekilde belirtebiliriz.
Raspberry Pi modelleri arasnda bellek farkllklar bulunduundan 256 MB, 512 MB ve 1024
MB bellee sahip Raspberry Pi modellerinde GPU iin ayrlabilecek minimum ve maksimum
deerler aadaki tablodaki gibidir:
Sistem Konfigrasyonu
240
Gml Linux
Raspberry Pi Modeli
256 MB
16 MB
192 MB
512 MB
16 MB
448 MB
1024 MB
16 MB
944 MB
Bazen ayn SD kart imajn her 3 model Raspberry Pi cihaznda kullanmak isteyebilirsiniz.
Bu senaryoda farkl modellere ynelik GPU bellek miktarn tanmlayabilmek iin, 256 MB
bellekli modellerde gpu_mem_256 , 512 MB bellekli modellerde gpu_mem_512 ve 1024 MB
bellekli modellerde gpu_mem_1024 parametrelerini kullanabilirsiniz.
NEML: gpu_mem=16 eklindeki bir tanmla GPU tarafna minimum bellek ayrmanz
gerekirse, standart start.elf ve fixup.dat dosyalar ile sistem boot edilememektedir.
Bunun iin her iki firmware dosyasnn cut-down (krplm) versiyonlar kullanlmaldr.
Raspberry Pi Firmware arivininden start_cd.elf ve fixup_cd.dat dosyalarn da SD
kartnzn ilk FAT blmne kopyalamak suretiyle al gerekletirebilirsiniz. GPU tarafna
16 MB bellek ayrldnda, GPU'nun baz zellikleri de devre d braklmakta ve daha hzl
bir al gereklemektedir. Ancak bu al iin yukarda bahsettiimiz dosyalarn da SD
kart zerinde bulunmas zorunludur.
disable_l2cache
ntanml deeri 0 olup, bu deeri 1 yapmanz halinde ARM CPU'nun GPU zerindeki Level
2 Cache alanna eriimini engelleyebilirsiniz. zellikle GPU youn uygulamalarda bu
zelliin kullanlmas tercih edilebilir.
config.txt zerinden GPU Level 2 Cache devre d brakldnda mevcut Linux ekirdek
imajnzla ARM CPU tarafnda boot gerekletiremezsiniz. Boot edebilmek iin Linux
ekirdeinin de GPU Level 2 Cache alann kullanmayacan bilecek ekilde derlenmi
olmas gereklidir. ekirdek konfigrasyonunda CONFIG_BCM2708_NOL2CACHE=y yapp yeniden
derleyerek boot ilemini gerekletirebilirsiniz.
disable_pvt
ntanml deeri 0 olup, 1 yaplmas halinde her 500 milisaniyede bir DRAM scaklnn
kontrol edilmesi fonksiyonunu devre d brakmaktadr. Her bir kontrol ortalama 16s zaman
almaktadr. Eer ortam artlarndan eminseniz az da olsa performans artrmak iin bu
zellii kullanmak isteyebilirsiniz.
241
Gml Linux
display_rotate
Ekran dndrmek veya yatay/dikey oryantasyonunu deitirmek iin kullanlr. Aadaki
tabloda display_rotate deerlerine karlk gerekleen durum bilgileri yer almaktadr:
Display_rotate deeri
Sonu
0x10000
0x20000
Not: 90 ve 270 derece dndrme ilemlerinde bir miktar ek GPU bellei gerektiinden,
GPU iin 16 MB bellek ayrmanz halinde almayacaktr. Bunun iin GPU blmne
minimum 32 MB bellek ayrmalsnz.
hdmi_safe
Bu deerin 1 yaplmas halinde HDMI monitorlerde sk karlalan otomatik alglama
sorunlarna karlk eitli workaround'ler devreye alnr. Eer HDMI ekrannda grnt
alamyorsanz bu opsiyonun deerini 1 yapp test etmeniz nerilir.
hdmi_safe=1 durumu aadaki konfigrasyona eittir:
hdmi_force_hotplug=1
hdmi_ignore_edid=0xa5000080
config_hdmi_boost=4
hdmi_group=2
hdmi_mode=4
disable_overscan=0
overscan_left=24
overscan_right=24
overscan_top=24
overscan_bottom=24
Yukarda yer alan her bir konfigrasyon anahtar deyiminin detaylarna buradan
eriebilirsiniz.
disable_splash
Sistem Konfigrasyonu
242
Gml Linux
bootcode_delay
Deer girilmesi halinde bootcode.bin ykleyicisi start.elf ikinci aama boot ykleyici
yklemeden nce girilen deer kadar saniye boyunca bekler.
Bu opsiyon Raspberry Pi cihaz ile HDMI monitorn ayn g kaynandan beslendii ve
HDMI monitor tarafnda ilklendirme ilemlerinin uzun srd senaryolarda faydal
olmaktadr.
Overclock Parametreleri
Raspberry Pi, overclock ilemleri iin ok sayda konfigrasyon opsiyonu sunmaktadr. ARM
CPU frekans, GPU ierisinde ayr ayr h264 blou, 3D blou, SDRAM frekans vb.
ayarlanabilmektedir. lgilenenler detayl bilgiye buradan ulaabilir.
nceleri Raspberry tarafndan nerilen overclock fonksiyonlarnn dnda bir parametre
kullanldnda cihaz garanti d kalyordu. Daha sonradan force_turbo parametresi ile
aktive edebileceiniz turbo mode gelitirildi. Turbo mode aktif cihazlarda alma frekanslar
sistem megul olduunda artrlmakta, sistem scakl 85C zerine ktnda ise
drlmektedir. Bu ekildeki kullanm garanti kapsamna dahildir.
Sistem Konfigrasyonu
243
Gml Linux
# cat /proc/cpuinfo
...
Hardware : BCM2709
Revision : a01041
Serial : 00000000634c6685
Temmuz 2015 itibariyle MPEG-2 codec lisans cihaz bana 2 (yaklak 8,5 TL)
civarndadr.
Lisansnz geldikten sonra config.txt ierisinde bu lisansn ilgili olduu CPU seri
numarasn belirtmeniz gerekiyor. rnek olarak yukardaki CPU iin MPEG-2 lisans
alnmsa girmemiz gereken parametre u ekilde olacaktr:
decode_MPG2=0x634c6685
Eer VC-1 codec lisans alm olsaydk bu durumda aadaki parametreyi girmeliydik:
decode_WVC1=0x634c6685
Bazen ayn SD kart imajn birden fazla rnde kullanmanz gerekebilir. Ancak szkonusu
cihazlar iin ayr ayr codec lisanslar alnm ise, her bir cihazdaki config.txt dosyasndaki
ilgili parametrelerin dzenlenmesi gereklidir.
Raspberry Pi bu durumu kolaylatrmak iin yukardaki konfigrasyon parametrelerine virgl
ile ayrlm ekilde 8 adede kadar CPU seri numaras yazlmasna imkan vermitir. Aada
3 farkl CPU seri numarasnn yer ald bir rnei grebilirsiniz:
decode_MPG2=0x634c6685,0x1234567,0x99889922
Her ne kadar birden ok seri numaras yazm mmkn olsa da, sahada byk lekli bir
kullanm ii 8 adet olduka dk bir say olarak kalmaktadr. Byle bir rn ierisinde
kullanmak istiyorsanz lisans ynetimi iin yazlm tarafnda sreci kolaylatrc ek
mekanizmalar gelitirmeyi dnmelisiniz.
Sistem Konfigrasyonu
244
Gml Linux
245
Gml Linux
Hawkboard
ARMV5/ARM926
DSP
RAM
128 MB DDR
NAND
128 MB
MMC/SD
Var
Ethernet
Var
VGA
Var
Konsol
Var
Hawkboard
246
Gml Linux
nykleyici (Bootloader)
Hawkboard, U-Boot nykleyicisini kullanmaktadr.
wget -c http://hawkboard.googlecode.com/files/u-boot-omapl1_v1.tar.bz2
tar xf u-boot-omapl1_v1.tar.bz2
cd u-boot-omapl1
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- distclean
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- omapl_hawkboard_config
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
ekirdek (Kernel)
wget -c http://hawkboard.googlecode.com/files/linux-omapl1_ver1.tar.bz2
tar xf linux-omapl1_ver1.tar.bz2
cd linux-omapl1
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- distclean
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- omapl138_hawkboard_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage
Hawkboard
247
Gml Linux
Kart kurtarma senaryolarnda genel olarak cihaza SD kart, USB veya seri port zerinden ilk
olarak nykleyicinin atlarak altrlmas hedeflenmektedir. Cihaz zerinde nykleyici
altrldktan sonra seri terminal zerinden cihazla alt seviye bir iletiim kurulabilir ve
sonraki admlara buradan devam edilebilir.
Hawkboard seri port zerinden (UART Recovery) alabilmektedir. ncesinde, daha nce
derlediimiz nykleyici dosyasn (u-boot) seri port iin uygun ekilde imzalamalyz. Bu
imzalama ve nykleyiciyi cihaza atma ilemleri iin TI tarafndan hazrlanan AIS Generator
/ UART Host Tool aralarn kullanacaz. Gerekli aralar sisteminize kurmak iin ilk olarak
aadaki zip dosyasn indirebilirsiniz.
Not: TI tarafndan salanan bu aralar, maalesef Linux karlklar olmayan, .NET
Framework bamll olan pencereli uygulamalardr. Linux altnda bu programlar
kullanabilmek iin sisteminizde mono, mono-vbnc ve wine paketleri bulunmaldr.
wget -c http://www-s.ti.com/sc/techlit/sprab41.zip
Deer
Device Type
d800k002 - ARM
Boot Mode
UART2
DDR:
Hawkboard
248
Gml Linux
zellik
Deer
Memory Type
DDR2
DRPYC1R
0x43
SDCR
0x00134632
SDCR2
SDTIMR1
0x26492a09
SDTIMR2
0x7d13c722
SDRCR
0x249
Hawkboard
249
Gml Linux
Sonrasnda, ARM Application File blmne daha nce derlediiniz u-boot dosyasn, AIS
Output File blmn de oluturulacak olan dosya ismini vererek imzalama ilemini
gerekletirebilirsiniz. Biz imzal dosyamza u-boot_uart.bin ismini verdik.
imdi imzalanm nykleyici dosyasn Hawkboard'a nasl atacamza bakalm.
OFF
ON
OFF
ON
Hawkboard
250
Gml Linux
imdi UartHost.exe uygulamasn kullanabiliriz. Uygulamaya daha nce imzaladmz uboot dosyasn ve seri portu gstermeliyiz, ayrca Wait for BOOTME seeneinin seili
olduundan emin olunuz. Bu durumda uygulamada Start butonuna bastmzda Linux
altnda aldmz rnek ekran grnts aadaki gibidir.
Hawkboard
251
Gml Linux
Sonrasnda seri terminal zerinden cihaza balanp enter tuuna bastnzda u-boot komut
satrn grmelisiniz. printenv ile nykleyicinin kulland evre deikenlerini grebilirsiniz.
hawkboard.org > printenv
bootargs=mem=128M console=ttyS2,115200n8 root=/dev/ram0 rw initrd=0xc1180000,4M ip=dhcp
bootcmd=
bootdelay=3
baudrate=115200
bootfile="uImage"
stdin=serial
stdout=serial
stderr=serial
ethaddr=0a:c1:a8:12:fa:c0
ver=U-Boot 2009.01 (Oca 21 2015 - 14:11:03)
Environment size: 254/131068 bytes
Bu aamadan sonra sistemi amak iin bir ok seenee sahibiz. Srayla bunlardan
bazlarn ksaca inceleyim.
Hawkboard
252
Gml Linux
Al srasnda root dosya sistemi olarak NFS'i kullanmak iin ise bootargs deikenine
aadaki formda deerler geirilmelidir.
setenv nfsroot ${serverip}:<Uzak makinadaki NFS dizini>
dhcp zelliinin olmamas durumunda, cihaz IP, gateway ve netmask deerlerini aadaki
gibi verebilirsiniz.
setenv ipaddr <Cihaz IP adresi>
setenv gatewayip <Gateway adresi>
setenv netmask <Netmask>
Sonrasnda daha nce ekirdei ektiiniz adresteki kodu altrarak cihaz aabilirsiniz.
bootm <ekirdein bellee ekildii adres>
imdi, bir dier alternatif olarak, cihaz NAND zerinden nasl aabileceimize bakalm.
Hawkboard
253
Gml Linux
Deer
Device Type
d800k002 - ARM
Boot Mode
NAND Flash
NAND Blmlendirmesi
ekirdek, NAND zerinde sanki bir blmlendirme (Partition) yaps varm gibi ilem
yapabilir. Bu blmlendirme, Linux kaynak kodu ierisinden sabit olarak ayarlanabilecei gibi
ekirdee nykleyici tarafndan geirilen argmanlar vastasyla dinamik olarak da
yaplabilir.
Sabit blmlendirme bilgileri arch/arm/mach-davinci/board-omapl138-hawk.c dosyasnda
mtd_partition trndeki omapl138_hawk_nandflash_partition isimli bir dizi ile temsil
edilmektedir.
Dinamik blmlendirme iin ise ekirdek kodu command line partition table parsing seenei
seilerek derlenmeli ve ekirdee mtdparts komut satr seenei geirilmelidir. rnek olarak
aadaki gibi bir blmlendirme oluturalm.
Hawkboard
254
Gml Linux
Blm
Uzunluk
U-Boot_Env
128K
U-Boot
512K
Kernel
4M
Recovery
40M
FileSystem
Kalan Bo Alan
Her bir blm zerinde, bir blok aygt (block device) olarak ilem yaplabilir. lgili dosya
dmlerini aadaki gibi listeleyebilirsiniz.
# ls /dev/mtdblock*
/dev/mtdblock0 /dev/mtdblock1 /dev/mtdblock2 /dev/mtdblock3 /dev/mtdblock4
Hawkboard
255
Gml Linux
Dosya
Tr
u-boot_nand.bin
uImage
ekirdek imaj
rootfs.sqsh
rootfs.jffs2
Gerekli dosyalar dd arac ile aadaki gibi srasyla NAND zerine yazabiliriz.
Uyar: Bu ilemler ncesinde, U-Boot komut satrndan nand erase ile tm NAND'i
silmeyi unutmaynz. Dier bir alternatif mtd-utils aralarn cihaz hedefli derleyerek ayn
ilemi Linux zerinden yapmak olabilir.
dd if=u-boot_nand.bin of=/dev/mtdblock0 bs=128k
dd if=uImage of=/dev/mtdblock2 bs=128k
dd if=rootfs.sqsh of=/dev/mtdblock3 bs=128k
dd if=rootfs.jffs2 of=/dev/mtdblock4 bs=128k
Hawkboard
256
Gml Linux
nerilen Yntem
U-Boot:
Hawkboard
257
Gml Linux
nand erase
tftpboot 0xc0700000 u-boot_nand.bin
nand write.e 0xc0700000 0x20000 0x80000
tftpboot 0xc0700000 uImage
nand write.e 0xc0700000 0xA0000 0x400000
setenv nfsroot ${serverip}:/nfsroot
Linux:
mount -t jffs2 /dev/mtdblock4 nand/
tar xf rootfs.tgz -C nand/
umount nand
Bu aamada ROM ykleyicinin, bir sonraki alta, u-boot ykleyicisini NAND zerinden
aramas iin boot anahtarlar aadaki gibi ayarlanmalyz.
1
ON
OFF
OFF
OFF
Gerekli dosyalar NAND zerine yazdktan sonra cihazn kendiliinden NAND zerinden
alabilmesi iin nykleyici zerinde baz deiiklikler yapmalyz. Cihaz resetleyerek tekrar
u-boot komut satrna delim.
ekirdee, root dosya sisteminin yerini ve tipini geirmeliyiz. Aadaki kullanmda
root=/dev/mtdblock4 dosya sisteminin aranaca NAND blmn, rootfstype=jffs2 ise
dosya sisteminin tipini gstermektedir. Sonrasnda NAND zerindeki ekirdek kodu, gvenli
bir adrese ekilip balatlmaldr. nand read ve bootm komutlar bu ileri yapmaktadr.
bootcmd ile gsterilen komutlar, alta nykleyici tarafndan otomatik olarak altrlarak,
bu komutlarn icra edilmesi salanr.
Hawkboard
258
Gml Linux
Hawkboard
259
Gml Linux
Olimex A20
Olimex firmas tarafndan gelitirilen board, Dual-Core Allwinner A20 Cortex-A7 ilemcisiyle
gelmektedir. Sadece yazlm deil, donanm da ak bir platform olarak gelitirilmekte ve tm
tasarm dosyalar paylalmaktadr.
Kartn tam ad A20-OLinuXino-MICRO olarak gemektedir fakat dokmanda ksaca Olimex
A20 adn kullanacaz.
Temel olarak aadaki bileenlere sahiptir.
lemci
ekirdek Says
DSP
Yok
GPU
Mali 400
RAM
1 GB DDR3
NAND
Yok
MMC/SD
Var
MicroSD
Var
Ethernet
Var
VGA
Var
HDMI
Var
Konsol
Var
Olimex A20
260
Gml Linux
nykleyici (Bootloader)
Olimex A20, U-Boot nykleyicisini kullanmaktadr.
git clone https://github.com/linux-sunxi/u-boot-sunxi.git
cd u-boot-sunxi/
make CROSS_COMPILE=arm-linux-gnueabihf- A20-OLinuXino-Micro_config
make CROSS_COMPILE=arm-linux-gnueabihf-
Bu aamada ana dizinde u-boot.img ve spl altnda sunxi-spl.bin dosyalar olumu olmaldr.
sunxi-spl.bin dosyas, u-boot nykleyicisini yklemekten sorumlu, greli olarak daha kk
olan nykleyici olup SPL (Secondary Program Loader) olarak isimlendirilmektedir.
Olimex A20
261
Gml Linux
cd sunxi-tools
make fex2bin
cd ../sunxi-boards/
../sunxi-tools/fex2bin sys_config/a20/a20-olinuxino_micro.fex script.bin
ekirdek (Kernel)
ekirdek kodunu aadaki gibi indirip derleyebilirsiniz.
git clone -b sunxi-3.4 https://github.com/linux-sunxi/linux-sunxi.git
cd linux-sunxi/
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sun7i_defconfig
make -j2 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage modules
Bu ilem sonrasnda, ana dizinden itibaren, ekirdek imaj ve gerekli modller aadaki gibi
bir dizin yolunda bulunacaktr. ekirdek versiyonuna gre xyz deerleri deimektedir.
arch/arm/boot/uImage
modules/lib/modules/3.4.x-y-z
Olimex A20
262
Gml Linux
Balang
Boyut
Kullanm
8KB
Blmlendirme tablosu
24KB
SPL nykleyicisi
32
512KB
u-boot
544
128KB
evre deikenleri
672
352KB
Sakl alan
1024
Not: Kart zerinde hem MMC/SD hem de mikro SD bulunmaktadr. Cihaz yalnz mikro
SD zerinden alabilmektedir, al srecini anlattmz aadaki blmlerde
onlukla mikro SD yerine yalnz SD ifadesini kullandk.
SD kart zerinde, ilk 1MB alandan sonra srasyla FAT32 ve ext4 olarak formatlayacamz
iki adet blm oluturacaz. FAT32 blmne ekirdek imaj ve ihtiya duyduu ayar
dosyasn, ext4 blmne ise dosya sistemini kopyalayacaz. lk 1MB'lk alana ise
nykleyicileri yazacaz. SD kartn hedeflediimiz son durumunu grsel olarak aadaki
gibi gsterebiliriz.
Olimex A20
263
Gml Linux
export CARD=/dev/mmcblk0
export PARTITION=p
SD kartn ilk 1MB'lk alann temizledikten sonra SPL ve u-boot nykleyicilerini aadaki
gibi yazabiliriz.
dd if=/dev/zero of=${CARD} bs=1M count=1
dd if=sunxi-spl.bin of=${CARD} bs=1024 seek=8
dd if=u-boot.img of=${CARD} bs=1024 seek=40
imdi SD kart zerinde, sonrasnda FAT32 ve ext4 olarak biimlendireceimiz, iki adet
blm oluturalm. Bunun iin sfdisk aracn kullanan aadaki betii kullanabilirsiniz.
#!/bin/sh
CARD=/dev/mmcblk0
sfdisk -R ${CARD}
cat << EOT | sfdisk --in-order -L -uM ${card}
1,16,c
,,L
EOT
Olimex A20
264
Gml Linux
TI DM6446 EVM
1 Gelitirme aralarnn hazrlanmas:
lk olarak gelitirme aralar indirilip aldktan sonra .../bin dizini altndaki derleme
aralarnn arm-linux nekine (prefix) sahip sembolik linkleri oluturulup (grece daha uzun
olan arm-none-linux-gnueabi neki ile uramamak iin), dizin yolu PATH deikenine
eklenmi ve bir evresel deikende saklanmtr.
wget -c http://www.codesourcery.com/sgpp/lite/arm/portal/package6488/public/arm-none-linux-gnueabi/ar
arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
tar jxvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
cd arm-2010q1/bin/
for i in `ls`; do s=`echo $i | cut -b 24-`; ln -s $i arm-linux-$s; done
export PATH=$(pwd):$PATH
export DEVELOPMENT_TOOLS=$(pwd)
TI DM6446 EVM
265
Gml Linux
-#define CONFIG_SYS_USE_NOR
+#define CONFIG_SYS_USE_NAND
-#undef CONFIG_BOOTDELAY
#define CONFIG_BOOTDELAY 5
Ayrca bootcmd, bootargs gibi evresel deikenlerin deerleri hard coded olarak buradan
ayarlanabilir.
u-boot temel olarak yukardaki gibi derlenmesine karn birka problemle karlalabilir. uboot derleme ilemi konak makinann doal C derleyici ile balayan bir sretir ve konak
makinaya bamll vardr. Konak bilgisayardaki /usr/local/include altndaki baz balk
dosyalarnn varl derleme ileminde sorunlara yol aabilmektedir(u-boot, sistemde var
olan balk dosyalar ile ilgili konfigrasyon sonucunda yanl bir varsaymda bulunuyor
olabilir.). Konfigr ileminden nce konak bilgisayarda geici olarak /usr/local/include dizinin
adn deitirmek sorunu zebilir.
mv /usr/local/include /usr/local/_include
3 ekirdein derlenmesi:
En son DaVinci linux ekirdei asadaki yol izlenerek derlenmitir.
git clone git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci.git linux-davinci-2.6
cd linux-davinci-2.6
make ARCH=arm davinci_all_defconfig
make ARCH=arm menuconfig [1]
make ARCH=arm CROSS_COMPILE=arm-linux- uImage
TI DM6446 EVM
266
Gml Linux
export ROOTFS=/tmp/dosyasistemi
mkdir -p ${ROOTFS}
wget -c http://www.busybox.net/downloads/busybox-1.17.1.tar.bz2
tar jxvf busybox-1.17.1.tar.bz2
cd busybox-1.17.1/
make defconfig
#make menuconfig [ilave ayarlar yaplmas durumda...]
make CROSS_COMPILE=arm-linuxmake CROSS_COMPILE=arm-linux- CONFIG_PREFIX=${ROOTFS} install
busybox iinden kan rnek inittab zerinde deiiklik yaplarak dosya sisteminde
kullanlabilir.
cp examples/inittab ${ROOTFS}/etc
inittab dosyasna aadaki satr eklenmeli veya aklama eklinde olan benzer satr ayn
forma dntrlmelidir.
::respawn:/sbin/getty -L ttyS0 115200 vt100
TI DM6446 EVM
267
Gml Linux
#!/bin/sh
mount -t proc proc /proc
mount -t devpts devpts /dev/pts
/dev altndaki gerekli aygt dmleri ve pts dizini aadaki gibi oluturulabilir veya
dmler konak bilgisayardan cp komutuna -a anahtar verilerek kopyalanabilir.
mknod -m 666 ${ROOTFS}/dev/tty c 5 0
mknod -m 666 ${ROOTFS}/dev/console c 5 1
mknod -m 666 ${ROOTFS}/dev/tty1 c 4 1
mknod -m 666 ${ROOTFS}/dev/tty2 c 4 2
mknod -m 666 ${ROOTFS}/dev/tty3 c 4 3
mknod -m 666 ${ROOTFS}/dev/tty4 c 4 4
mknod -m 666 ${ROOTFS}/dev/random c 1 8
mknod -m 666 ${ROOTFS}/dev/urandom c 1 9
mknod -m 666 ${ROOTFS}/dev/ptmx c 5 2
mknod -m 666 ${ROOTFS}/dev/zero c 1 5
mknod -m 666 ${ROOTFS}/dev/null c 1 3
mkdir -p ${ROOTFS}/dev/pts
Cihaz bu noktadan sonra bu dosya sistemi kullanlarak nfs zerinden alabilir, cihaza seri
port zerinden login olunabilir. A zerinden login olmak iin kk bir SSH2 sunucu ve
istemci uygulamas olan Dropbear aadaki admlar izlenerek derlenmi ve cihaz zerinde
altrlmtr.
wget -c http://matt.ucc.asn.au/dropbear/releases/dropbear-0.52.tar.gz
tar xf dropbear-0.52.tar.gz
cd dropbear-0.52/
./configure --host=arm-linux --disable-zlib
make PROGRAMS="dropbear dbclient dropbearkey scp" MULTI=1 STATIC=1
cp dropbearmulti ${ROOTFS}/usr/bin
Dropbear uygulamasnn cihaz zerinde altrlmas iin cihaz zerinde aadaki admlar
izlenebilir.
TI DM6446 EVM
268
Gml Linux
cd /usr/bin
ln -s dropbearmulti dropbear
ln -s dropbearmulti dbclient
ln -s dropbearmulti dropbearkey
ln -s dropbearmulti scp
mkdir -p /etc/dropbear
dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
Cihazda /etc altnda kullancnn id numaras, home dizini ve sisteme login olduunda
altralacak olan programn belirtildii passwd dosyas oluturulmaldr. root kullancs iin
passwd dosyasnn ierii aadaki gibi olabilir.
root::0:0:root:/home/root:/bin/sh
/etc/passwd dosyasnda kriptolu olarak tutulacak olan, root ifresi passwd komutu ile
oluturulabilir. devpts mount edildikten ve dropbear uygulamas balatldktan sonra cihaza
ssh zerinden uzaktan balanlabilir.
mount -t devpts devpts /dev/pts
dropbear
269
Gml Linux
Sistem FLASH zerinden alacaksa CS2 SELECT pinlerinden jumper ile FLASH seilmeli
ve ilemci ayarlar ile al modunun deitirildii, kart zerinde S3 etiketli, kullanc
anahtarlar aadaki konumlara getirilmelidir.
1 ON
2 OFF
3 ON
4 ON
.... (ilgisiz)
Cihazn NAND flashnn bo olmas durumunda cihaz almayacaktr, ayn durum NOR
FLASH iinde geerlidir. Bu rnek iin cihazn NANDine ubl ve u-boot nykleyici iftinin
atlmas gereklidir. Bunun icin kullanc anahtarlarndan ilk ikisi ON konumuna alnarak cihaz
UART zerinden boot moduna alnmaldr. Bu durumda konak bilgisayardan cihaza minicom
ile balanldnda ekranda DaVinci yongas iindeki ROM hafzada saklanan, kullancnn
deitiremeyeci, ROM Boot Loader(RBL) tarafndan gnderilen BOOTME mesaj
grntlenecektir. nykleyici ifti seri port zerinden cihaza aadaki gibi yazlabilir.
TI DM6446 EVM
270
Gml Linux
wget -c http://sourceforge.net/projects/dvflashutils/files/DM644x/v2.00/DM644x_FlashAndBootUtils_2_00
tar zxvf DM644x_FlashAndBootUtils_2_00.tar.gz
cd DM644x_FlashAndBootUtils_2_00/DM644x/GNU
./sfh_DM644x.exe -erase -flashType NAND -targetType DM6446 -p /dev/ttyUSB0
u-boot olarak, deneme kartnn reticisi Spectrum Digital tarafndan salanan nand flash
paketinden kan u-boot kullanldnda(u-boot-567-nand.bin) temel iki sorunla
karlalmtr[2], kaynak koddan derlenen u-boot ile bu sorunlar yaanmamtr. ubl olarak
seri programlama paketiyle gelen dosya kullanlmaldr.
Sonrasnda ilk iki kullanc anahtar OFF yaplarak cihaz tftp ve nfs zerinden alabilir veya
ekirdek ve dosya sistemi imajlar kalc olarak NAND flash zerine yazlabilir. rnek al
senaryolar ksmnda gerekli u-boot evresel deikenlerinin deerleri verilmitir.
TI DM6446 EVM
271
Gml Linux
ekirdek command line partition table parsing seenei seilerek derlenmise, mtdparts
komut satr seenei kullanlarak partisyon yaps dinamik olarak oluturulabilir. DM644x
EVM iin kullanmna rnek aadaki gibidir.
mtd id bilgisine(davinci_nand) alan bir sistemde aadaki gibi ulalabilir, idye eklenen 0
aygt numarasdr.
root@dm6446-evm:~# ls /sys/bus/platform/drivers
davinci_emac dm9000 gen_nand i2c_davinci
davinci_nand edma gpio-keys serial8250
TI DM6446 EVM
272
Gml Linux
Cihaz nfs zerinden aldktan sonra, ilgili mtdblock aygt jffs2 trnde mount edilip dosya
sistemi arivi iinde alabilir. rootfs.tar isimli bir dosya sistemi arivi nand flash zerine
aadaki gibi yazlabilir.
mkdir -p /mnt/nand
mount -t jffs2 /dev/mtdblock2 /mnt/nand
tar xvf rootfs.tar -C /mnt/nand
sync
umount /mnt/nand
8 rnek al senaryolar:
Gelitirme ve son alma durumu iin uygun olan iki rnek alma senaryosuna ilikin
nemli u-boot evresel deikenleri ve ilgili komutlar aadaki gibidir.
TI DM6446 EVM
273
Gml Linux
[1]
mtd ve IDE ilgili baz anahtarlar asadaki gibi atanmtr.
CONFIG_MTD=y
CONFIG_MTD_PARTITIONS=y
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLKDEVS=y
CONFIG_MTD_BLOCK=y
CONFIG_MTD_NAND=y
CONFIG_MTD_NAND_VERIFY_WRITE=y
CONFIG_MTD_NAND_IDS=y
CONFIG_MTD_NAND_DAVINCI=y
[2]
http://c6000.spectrumdigital.com/davincievm/revd/files/nand_flash_package.zip
Linux ekirdeinin balarken yapt ilk ilemlerden bir tanesi nykleyici tarafndan
kendisine geirilen donanm platformuyla ilgili makina numarasn, kendisinin destekledii
makina numaralar ile karlatrmaktr. nykleyici tarafndan yanl bir makina numaras
gnderildiinde cihazn al mesajlar aadaki gibi sonlanacaktr.
Starting kernel ...
Uncompressing Linux................... done, booting the kernel
Starting kernel mesaji nykleyicinin son, Uncompressing Linux ile balayan mesaj ise
ekirdein ilk mesajdr. ekirdek kodu ierisinde konsol(burada ttyS0) balatlmadan nce
alan kodlarla ile mesajlar grmek iin ekirdek CONFIG_DEBUG_LL anahtar set
edilerek derlenmelidir. Cihaz ekirdee, konsol argmanna ek olarak,
"earlyprintk=serial,ttyS0" argmanlar geirilerek balatldnda ekran kts aadaki gibi
olmaktadr. Desteklenen makina tipleri ekirdein konfigrasyonuna gre birden ok olabilir.
TI DM6446 EVM
274
Gml Linux
NAND flash paketinden kan u-boot ekirdee DAVINCI_EVMin numaras 901 saysn
gndermek yerine DAVINCI_DVDPnin numaras olan 854 gndermektedir(al
ekrannda bu saylarn 16lk tabandaki karlklar grlmektedir). ekirdek kaynak kodu
ieresindeki mach-types.h dosyasinda aadaki deiiklik yaplarak bu sorun alabilir.
//#define MACH_TYPE_DAVINCI_DVDP 854
#define MACH_TYPE_DAVINCI_EVM 854
//#define MACH_TYPE_DAVINCI_EVM 901
Bir dier problem ise ekirdein FLASHdan hafzaya(RAM) ekildikten sonra balatlmas
srasnda dorulama hatasnn alnmasdr. Hata mesaj aadaki gibidir.
DaVinci EVM # bootm 0x82000000
## Booting image at 82000000 ...
Image Name: Linux-2.6.35
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1557300 Bytes = 1.5 MB
Load Address: 80008000
Entry Point: 80008000
Verifying Checksum ... Bad Data CRC
OK
[3]
serkan@serkanDesktop:~/garbage/temporary/davinci/DM644x_FlashAndBootUtils_2_00/DM644x/GNU$ ./sfh_DM64
---------------------------------------------------- TI Serial Flasher Host Program for DM644x
(C) 2010, Texas Instruments, Inc.
Ver. 1.67
-----------------------------------------------------
Flashing UBL and application image: ubl/ubl_DM6446_NAND.bin and u-boot.bin. the NAND flash device on
Attempting to connect to device /dev/ttyUSB1...
Press any key to end this program at any time.
TI DM6446 EVM
275
Gml Linux
TI DM6446 EVM
276
Gml Linux
KAYNAKLAR
http://processors.wiki.ti.com/index.php/Serial_Boot_and_Flash_Loading_Utility
http://c6000.spectrumdigital.com/davincievm/revd/files/DaVinciEVM_FAQ.html
http://processors.wiki.ti.com/index.php/Kernel_-_Common_Problems_Booting_Linux
Uyar: Nande uboottan yazarken blocksizen kat olmaldr.
TI DM6446 EVM
277
Gml Linux
BeagleBoard
Bu blmde, cihaz zerinde herhangi bir alt seviye yazlm yok iken, cihazn nasl aldna
gz atacaz.
BeagleBoard seri port (UART Recovery) veya SD kart zerinden (MMC Recovery) alabilir.
Biz burada ikinci yntemi kullanacaz.
Cihaz aabilmek iin bir nykleyici (bootloader) iftine, Linux ekirdeine ve dosya
sistemine ihtiyacmz olacak. Cihaza enerji verildiinde, ilk olarak, ilemci yongasna retim
aamasnda kodlanan nykleyici (ROM Bootloader) almaktadr. Bu ilk nykleyiciyi, ilev
olarak, bilgisayarlarmzdaki BIOS yazlmna benzetebiliriz. Sonrasnda, bu nykleyici
tarafndan MLO (MMC Loader) isimli kk bir nykleyici yklenmekte, MLO ile de,
ekirdei yklemekten sorumlu ikinci nykleyici olan U-Boot yklenmektedir.
imdi srasyla nykleyici iftini, ekirdei ve dosya sistemini nasl oluturabileceimize
ksaca bakalm.
Elde edeceimiz nihai dosyalar bir dizinde toplamak, sonrasnda SD karta yazma ileminde,
iimizi kolaylatracaktr. Bu dizinin yol ifadesini DEV_DIR isimli bir evre deikeninde
tutalm.
export DEV_DIR=<Dizin Yol fadesi>
BeagleBoard
278
Gml Linux
BeagleBoard
279
Gml Linux
Dosya Sistemi
Basit bir dosya sistemini BusyBox kullanarak oluturabileceiniz gibi hazr bir dosya sistemi
de kullanabilirsiniz. Biz burada dosya sistemini kendimiz oluturacaz.
Not: Hazr bir dosya sistemi kullanmak istiyorsanz, Angstrom datmn dosya
sistemini kullanabilirsiniz. Bu dosya sistemini, aadaki balanty kullanarak, internet
zerinden de kolaylkla oluturabilirsiniz.
http://narcissus.angstrom-distribution.org/
Bu durumda apraz derleyicinizin kulland standart C ktphanesi ile dosya sistemi
bnyesindekinin uyumluluunu kontrol etmelisiniz.
Dosya sistemini oluturmak iin temel olarak BusyBox kodunu derleyecek, asgari al
betiklerini, aygt dmlerini oluturacak ve apraz derleyicinin kulland standart C
ktphenesini dosya sistemine kopyalayacaz.
BusyBox kodunu aadaki gibi indirip derleyebilirsiniz.
export ROOTFS=<Dosya Sisteminin Saklanaca Dizin Yolu>
mkdir -p $ROOTFS
wget -c http://www.busybox.net/downloads/busybox-1.23.0.tar.bz2
tar xf busybox-1.23.0.tar.bz2
cd busybox-1.23.0
make defconfig
make CROSS_COMPILE=arm-none-linux-gnueabimake CROSS_COMPILE=arm-none-linux-gnueabi- CONFIG_PREFIX=${ROOTFS} install
Bu aamadan sonra ROOTFS evre deikeniyle gsterilen dizinde asgari dizin yaps
oluacaktr.
Gelitirme aralarnn iindeki lib dizinini hedef dosya sisteminde / altna kopyalayalm.
cp -a <Gelitirme Aralar Ana Dizini>/arm-none-linux-gnueabi/libc/lib ${ROOTFS}
BeagleBoard
280
Gml Linux
Bu aamada gerekli al betiklerini oluturalm. inittab ve rcS olmak zere iki adet betie
ihtiyacmz olacak. BusyBox iinden kan rnek inittab dosyasn hedef dosya sistemimize
koplayalayp zerinde deiiklik yapabiliriz.
cp examples/inittab ${ROOTFS}/etc
Cihaza seri terminal zerinden ulaabilmek iin, inittab dosyasna aadaki satr eklenmeli
veya aklama eklinde olan benzer satr ayn forma dntrlmelidir.
::respawn:/sbin/getty -L ttyS0 115200 vt100
/etc/init.d altnda ise ierii aadaki gibi olan rcS betii oluturulmal ve gerekli izinleri
verilmelidir.
#!/bin/sh
mount -t proc proc /proc
mount -t devpts devpts /dev/pts
Son olarak, /dev altndaki gerekli aygt dmleri ve pts dizinini aadaki gibi oluturabiliriz.
BeagleBoard
281
Gml Linux
Bu aamada dosya sistemimizi hazrlam olduk, daha sonra SD kart zerine yazmak iin
dosya sistemimizi ariv halinde saklayabiliriz.
tar czvf rootfs.tgz -C ${ROOTFS} .
cp rootfs.tgz ${DEV_DIR}
SD Kartn Hazrlanmas
SD kart zerinde, biri FAT32 dieri ise ext3 eklinde biimlendirilecek iki adet blme
(partition) ihtiyacmz olacak. FAT32 blmne nykleyicileri ve ekirdei, ext3 blmne
ise dosya sistemini tayacaz. SD kart zerindeki blmlendirme ve biimlendirme ilerini,
komut satrndan elle yapmak yerine, Angstrom dosya sistemi bnyesindeki mkcard.txt
betiini kullanabiliriz. Betii aadaki gibi indirebilirsiniz.
wget -c http://downloads.angstrom-distribution.org/demo/beagleboard/mkcard.txt
Betie SD kartmza ilikin aygt dmn (device node) geirmeliyiz, sistemimiz iin rnek
aadaki gibidir:
./mkcard.txt /dev/mmcblk0
Not: SD kartnza ilikin aygt dmn fdisk -l ile sisteminizdeki blmleri inceleyerek
bulabilirsiniz. fdisk komutunu root haklaryla altrmalsnz.
Not: Betie daha yakndan baktmzda, srasyla SD kartn boyutunun hesaplandn,
sfdisk ile iki adet blmn oluturulduunu, sonrasnda bu blmlerin mkfs.vfat ve
mke2fs ile biimlendirildiini grmekteyiz. FAT blmnn bootable olduuna dikkat
ediniz.
BeagleBoard
282
Gml Linux
BeagleBoard
283
Gml Linux
BeagleBoneBlack
Beagle Bone Black son zamanlarda popler olan, 50$ mertebesindeki fiyat ve genileme
imkanlaryla ne kan bir gelitirme platformudur.
lemci
RAM
512MB DDR3
Storage
GPU
3D hzlandrc
NEON Destei
Var
USB Host
Var
USB Power
Var
Micro SD Kart
Var
Ethernet
Var
HDMI
Var
Konsol Kablosu
NAND Flash
Yok
BeagleBoneBlack
284
Gml Linux
Konsol Kablosu
BeagleBone-Black versiyonunun beraberinde konsol kablosu gelmemektedir
Bootloader seviyesinde konsol eriimi iin FTDI-TTL 3.3V USB dntrc kablosuna
ihtiya bulunmaktadr.
BeagleBoneBlack
285
Gml Linux
Out-Of-Tree build yntemi ile $HOME/beagle dizini altnda build dizini ierisinde buildroot
ana alma dizinimizi oluturalm:
$ cd buildroot
$ make O=$HOME/beagle/build beaglebone_defconfig
lem bitiminde ana beagle alma dizininiz altnda, build dizini oluacaktr.
Bu noktadan sonra buildroot ile ilgili tm ilemlerinizi, build dizini altnda iken
gerekletirmelisiniz:
$ cd $HOME/beagle/build
Buildroot Konfigrasyonu
Buildroot ierisinden kan beaglebone_defconfig dosyasnda board ile ilgili temel ayarlar
mevcuttur.
Bununla birlikte aadaki temel balklar iin konfigrasyon zerinde dzenlemeler
yaplmaldr:
Kullanlacak toolchain seimi
Dosyalarn download edilecei dizinle ilgili dzenlemeler
lem sonucunda oluturulacak dosya sistemi tipi
/dev ynetimi iin tercih edilen yntem
Sistemde yer almas istenilen paketler
Bunlar temel dzenlemeler olup, ncelikle bu balklara deinilecektir.
Toolchain Seimi
Buildroot ierisinde toolchain seiminde External Toolchain kullanm nerilir. External
Toolchain kullanlaca belirtildikten sonra, toolchain tipi seilmelidir
Genelde 3 toolchain tipi bulunur:
BeagleBoneBlack
286
Gml Linux
BeagleBone-Black zerinden NAND flash deil, eMMC bulunduundan ext4 gibi blok tabanl
aygtlar zerinde alan dosya sistemleri kullanlmaldr.
$ wget "http://arago-project.org/git/projects/?p=am33x-cm3.git;a=blob_plain;f=bin/am335x-pm-firmware.
BeagleBoneBlack
287
Gml Linux
Kernel Derleme
Derleme ilemi ncesinde oluan kernel dosyasn sktrma ve u-boot kernel balk
bilgilerini eklemek iin gerekli yardmc aralarn kurulu olduundan emin olunuz:
$ sudo apt-get install lzop u-boot-tools
Kernel derleme ilemini aadaki admlarla yapabilirsiniz (tftp sunucu ana dizini /srv/tftp
olduu varsaylmtr):
$ make ARCH=arm beaglebone_defconfig
$ make ARCH=arm \
CROSS_COMPILE=/home/demirten/beagle/build/host/usr/bin/arm-linux-gnueabihf- \
uImage dtbs -j4
$ make ARCH=arm \
CROSS_COMPILE=/home/demirten/beagle/build/host/usr/bin/arm-linux-gnueabihf- \
uImage-dtb.am335x-boneblack -j4
$ cp arch/arm/boot/uImage-dtb.am335x-boneblack /srv/tftp/uImage
Nfs-Root alma
Aadaki ekilde u-boot zerinden temel deikenleri ayarlayarak NFS zerinden boot
ilemini gerekletirebilirsiniz:
setenv serverip 192.168.7.1
setenv ipaddr 192.168.7.2
setenv console ttyO0,115200n8
setenv rootpath /home/demirten/beagle/build/target
uEnv.txt Kullanm
BeagleBoneBlack iin hazrlanan u-boot imaj, almaya baladnda uEnv.txt dosyas
bulmas halinde ierisindeki deikenleri import etmektedir. Bu metin dosyasn doru
ekilde dzenlemek suretiyle al ilemini u-boot imajn yeniden retmek zorunda
kalmakszn kalc olarak zelletirmeniz mmkndr.
rnek bir uEnv.txt dosyasnn ierii aada listelenmitir:
BeagleBoneBlack
288
Gml Linux
kernel_file=zImage
initrd_file=uInitrd
serverip=192.168.7.1
ipaddr=192.168.7.2
rootpath=/home/demirten/beagle/rootfs
console=ttyO0,115200n8
loadkernel=load mmc ${mmcdev}:${mmcpart} 080200000 ${kernel_file}
loadinitrd=load mmc ${mmcdev}:${mmcpart} 081000000 ${initrd_file}; setenv initrd_size ${filesize}
loadfdt=load mmc ${mmcdev}:${mmcpart} 0x815f0000 /dtbs/${fdtfile}
BeagleBoneBlack
289
Gml Linux
EKLER
Bu blmde belirli bir ak ierisine girmeyen konulara deinilmektedir.
EKLER
290
Gml Linux
Yukardaki rnekte Prolific markal seri eviricinin ttyUSB0 ismiyle sisteme ilitirildii
belirtilmektedir. Sistemimiz tarafndan bu ekilde tannm olan seri eviriciyi, /dev/ttyUSB0
aygt dosyas zerinden kullanabiliriz.
Bilgisayarnza taklan usb seri eviriciler Linux tarafndan tanndktan sonra, kullandnz
datma gre devtmpfs veya udev zmlerinden biriyle /dev dizini altnda otomatik
olarak aygt dosyas doru major, minor ve aygt trn gsterecek ekilde oluturulur. Usb
seri eviricilerde isimlendirme ayn anda takl her bir eviri iin ttyUSB0 , ttyUSB1 ,
ttyUSBX eklinde yaplr.
Not: Usb seri evirici takl durumda ve bir uygulama tarafndan kullanmdayken
kartlp tekrar taklacak olursa, sistem tarafndan yeni bir numara ile isimlendirilip
kullanma sunulacaktr. dmesg komut ktsnda her zaman doru aygt ismini
grebilirsiniz.
291
Gml Linux
Grld zere dialout grubuna yeliimiz bulunmuyor. Gruba kendimizi ye yapmak iin
Debian tabanl sistemlerde aduser uygulamasn kullanabiliriz:
$ sudo adduser demirten dialout
Adding user `demirten' to group `dialout' ...
Adding user demirten to group dialout
Done.
Grup yeliimiz gerekleti. Ancak grafik oturumlarnda grup yelik bilgilerini ilk login
ileminde kontrol edilip, sonrasnda alan tm srelere ayn bilgiler aktarlmaktadr. Bu
sebeple deiikliklerin etkin olmas iin grafik oturumundan k yaptktan sonra tekrar giri
yapmal veya sisteminizi yeniden balatmalsnz. Bu ilemin ardndan seri evirici cihaz
zerinde okuma - yazma yetkileriniz olacak ve rahatlkla alabileceksiniz.
292
Gml Linux
Uygulama ilk aldnda ntanml olarak /dev/modem gibi bir aygt dosyasn amaya
alr, dosyay bulamadnda sonlanr.
Bu sorunun stesinden gelmek iin uygulamay -s parametresi ile dorudan ayarlar
ekranyla aabilirsiniz:
$ minicom -s
+---------------------------------------------------+
| A - Serial Device : /dev/ttyUSB0 |
| B - Lockfile Location : /var/lock |
| C - Callin Program : |
| D - Callout Program : |
| E - Bps/Par/Bits : 115200 8N1 |
| F - Hardware Flow Control : No |
| G - Software Flow Control : No |
| |
| Change which setting? |
+---------------------------------------------------+
| Screen and keyboard |
| Save setup as dfl |
| Save setup as.. |
| Exit |
| Exit from Minicom |
+--------------------------+
A tuuna basarak aygt ismini, E tuu ile seri port hzn ayarlayabilirsiniz. Ardndan Exit ile
ktnzda ilgili seri portu kullanabiliyor olacaksnz.
Uygulama ana ekrannda iken CTRL-A + O ile konfigrasyon ekranna dnebilir, CTRL-A + X
ile uygulamadan kabilir, CTRL-A + W ile line wrap modunu aktifletirebilir, CTRL-A + Z ile
dier ksayollar hakknda yardm alabilirsiniz.
minicom uygulamas genellikle alkanlk edinmi kiilerce kullanlr. Yeni balayanlar iin
kullanlmas pek nerilmez.
gtkterm
293
Gml Linux
screen
oklu terminal ynetimi iin kullanlan screen uygulamasna alkn iseniz seri port eriimi
iin de aadaki ekilde kullanabilirsiniz:
$ screen /dev/ttyUSB0 115200
294
Gml Linux
Kurulum
Gml sistemler zerinde alrken bilgisayarnzda TFTP sunucu servisinin bulunmas
neredeyse zorunludur. Linux platformlarnda alan birden fazla TFTP sunucu uygulamas
mevcuttur. Debian tabanl bir datm kullanyorsanz, tftpd-hpa , tftpd veya atftpd
paketlerinden birini sisteminize kurabilirsiniz. Biz burada ftpd-hpa paketinin kullanlmasn
neriyoruz:
$ sudo apt-get install tftpd-hpa
295
Gml Linux
Kurulum sonras TFTP servisi 69 nolu UDP portunu dinlemeye balayacaktr. Dosyalar
TFTP sunucu zerinden dier sistemlere sunmaya balamak iin, ilgili dosyann kullanlan
TFTP sunucu uygulamasnn dinledii ana dizin veya altndaki bir dizine kopyalanmas ve
dosya izinlerinin herkes tarafndan okunmasna imkan verecek ekilde dzenlenmesi
gereklidir.
Paket kurulumu sonrasnda TFTP sunucu ana dizininin ne ekilde ayarlandn renmek
iin, /etc/default/tftpd-hpa dosyasnda yer alan TFTP_DIRECTORY deikeninin ne ekilde
ayarlanm olduuna bakabilirsiniz. Genellikle /var/lib/tftpboot veya /srv/tftp gibi
dizinler kullanlmakta olup, isterseniz bu dizini deitirip servisi yeniden balatabilirsiniz.
Kullanm kolayl salamas asndan, ilgili tftp ana dizininin sahibini kendi kullancnz
olacak ekilde deitirirseniz, sonrasnda bu dizine yapacanz kopyalamalarda root
olmanza gerek kalmayacaktr:
$ sudo chown -R $USER /var/lib/tftpboot
NOT: Tftp sunucu paket adlar ve ntanml olarak bakt ana dizinler kullanlan Linux
datmna gre farkllk gsterebilir.
Dosya Gnderme
Bazen gml Linux sisteminizden bir dosyay d ortama tamak istediinizde TFTP'nin
tek alternatif olduu durumlarla karlaabilirsiniz (sisteme dosyay yazabileceiniz herhangi
bir yazlabilir ortam taklamyor olabilir vb.) Bu durumda muhtemelen busybox ierisinde tftp
istemcisi de derlenmi olacandan, sistemde yer alan bir dosyay a zerindeki bir tftp
sunucusuna gnderebilirsiniz. Tftp istemci uygulamasnn genel kullanm:
# tftp
BusyBox v1.23.0 (2015-01-22 18:30:08 EET) multi-call binary.
Usage: tftp [OPTIONS] HOST [PORT]
Transfer a file from/to tftp server
-l FILE Local FILE
-r FILE Remote FILE
-g Get file
-p Put file
-b SIZE Transfer blocks of SIZE octets
296
Gml Linux
Yukardaki komut doru olmasna ramen dosyay TFTP sunucunuza aktarma ileminde
hata alacaksnz. Dnen hata mesaj aklayc olmadndan asl problemin ne olduunun
anlalmas gtr.
Buradaki problem, TFTP sunucunun gvenlik nedeniyle kurulduu sisteme bir dosyann
gnderilebilmesi (upload) iin, n art olarak dosyann yazlaca dizinde, ayn isimle bir
dosya olmasn ve bu dosyann eriim yetkilerinin herkes tarafndan yazlabilir olacak ekilde
dzenlenmi olmasn gerektirmesidir.
Yani TFTP sunucuda mevcut olmayan bir dosyann, tftp istemcileri zerinden yklenmesi
mmkn deildir. ncelikle dosyay oluturup eriim yetkilerini dzenler isek, yukardaki
upload ilemi baaryla sonulanacaktr. Bunun iin TFTP sunucu sisteminde ilgili TFTP
sunucu ana dizininde aadaki komutlar altrmalyz:
$ touch rnek.bin
$ chmod 666 rnek.bin
297
Gml Linux
lem bitiminde NFS sunucunuz otomatik olarak alacaktr. Ancak bu noktada NFS
sunucumuz henz bilgisayarmzda yer alan hangi dizinleri a zerinde paylama amak
istediimizi bilmediinden, herhangi bir paylam salamayacaktr.
Ayn NFS sunucu zerinde, birden fazla dizini birbirinden farkl yetkilendirme ve
kstlamalarla a paylamna aabiliriz.
Herhangi bir dizini NFS sunucu zerinden paylatrmak iin, /etc/exports dosyasna
dizinle ilgili bir ayar satr girilmesi gereklidir. Bu dosyann sahibi root kullancs olduundan,
sudo mekanizmasyla herhangi bir editrle ap aadaki gibi bir satr ekleyebiliriz:
# /etc/exports
/home/demirten/beagle 192.168.100.0/24(rw,no_root_squash,no_subtree_check)
NFS sunucu zerindeki /etc/exports dosyasnda izin verdiiniz ip aralklarnn dndaki bir
sistem ilgili kaynaa ulamaya altnda, NFS sunucunuz tarafndan reddedilecektir.
Gml sisteminizde nfs mount ilemlerinde permission denied mesajlar alyorsanz, NFS
298
Gml Linux
Yukardaki gibi bir unmatched host log mesajn grdnzde, ilgili sistem iin de paylam
dizinini eriime amak istiyorsanz, /etc/exports dosyasndaki ilgili kurala ait IP/A
Maskesi blmn geniletmeniz veya tm IP adresleri iin eriim vermek istiyorsanz, *
zel karakterini kullanmalsnz.
/etc/exports dosyasnda deiiklik yaptktan sonra NFS servisini yeniden balatabilir:
299
Gml Linux
300
Gml Linux
301
Gml Linux
C6Run
C6Run, TI tarafndan, ift ekirdekli (ARM+DSP) heterojen ilemcileri iin gelitirilmi bir
projedir. ARM Linux ve C6000 DSP ekirdei ieren sistemler hedeflenmektedir.
Projenin 2011 yl itibariyle gelitirilmesi sonlanmasna karn, proje indirilebilmekte ve
kullanlabilmektedir.
C6Run, DSP ile ilgili birok detay gizlediinden ve burada DSP kullanm hakknda genel bir
fikir vermeyi amaladmzdan bu projeyi kullanacaz.
Bu blmde ilk olarak, projeye ilikin aralar sistemimize nasl kuracamza, sonrasnda
DSP hedefli kodu nasl retebileceimize bakacaz.
C6Run Kurulumu
Kurulum ilemine ilk olarak kk bir balang paketi indirerek balayacaz. Projenin dier
bamllklarn, bir tanesi hari, bu paket zerinden salayacaz. Ayrca derlenmi bir
kernel dizinine de ihtiyacmz olacak. Balang paketini aadaki gibi indirebilirsiniz.
wget -c https://gforge.ti.com/gf/download/frsrelease/535/4556/%43%36%52%75%6e%5f%30%5f%39%37%5f%30%33
Uyar: ndirdiimiz paketin, 0.98 numaral bir st versiyonu bulunmasna veya SVN
zerinden son halinin indirilebilmesine karn, sonrasnda birok probleme neden
olmakta o yzden 0.97 numaral bu versiyonu kullanmanz neriyoruz.
Paketi ap, DSP derleyicisi hari dier bamllklar aadaki gibi sisteminize ykleyip
kurabilirsiniz. Bu amala ana dizin iindeki Makefile dosyasnda get_component isimli bir
hedef bulunmaktadr.
tar xf C6Run_0_98_03_03.tar.gz
cd C6Run_0_98_03_03
make get_components
DSP'ye ilikin aralar ise sistemimize elle kurmalyz. Bu aralara ilikin kurulum dosyasn
aadaki balantdan indirebilirsiniz. 7.2.2 versiyonunu seiniz.
http://software-dl.ti.com/codegen/non-esd/downloads/download.htm
C6Run
302
Gml Linux
DSP veya ARM derleyicinizi baka bir yere kurduysanz veya baka bir apraz derleyici
kullanyorsanz, bu deikenlere uygun deerleri vermelisiniz.
platforms/hawkboard/platform.mak dosyasnda ise derlenmi ekirdek dizinini gstermeliyiz,
ngrlen deeri aadaki gibidir.
LINUXKERNEL_INSTALL_DIR ?= $(HOME)/workdir/hawkboard/kernel/
C6Run
303
Gml Linux
export PATH=$PATH:$(pwd)/bin
make examples
make INSTALL_DIR=/tmp/hawkdps install_programs
Hedef platform iin derlenmi rneklerle beraber, gerekli ekirdek modlleri ve betiklerler
aadaki gibi olacaktr.
# ls /tmp/hawkdps/
cmemk.ko dsplinkk.ko examples loadmodules.sh test unloadmodules.sh
C6Run
304
Gml Linux
#include <stdio.h>
#include <time.h>
#include <math.h>
#if defined(_TMS320C6X)
#elif defined(__GNUC__)
#include <sys/time.h>
#endif
#define N 1000000
typedef unsigned long long timestamp_t;
int i;
timestamp_t t0, t1;
float secs;
double d;
static timestamp_t get_timestamp () {
#if defined(_TMS320C6X)
return (timestamp_t) clock();
#elif defined(__GNUC__)
struct timeval now;
gettimeofday (&now, NULL);
return now.tv_usec + (timestamp_t)now.tv_sec * 1000000;
#endif
}
void bench() {
t0 = get_timestamp();
for (i = 0; i < N; ++i) {
d = sin(i) * cos(i);
}
t1 = get_timestamp();
secs = (t1 - t0) / 1000000.0L;
printf("%d times sin(i) * cos(i) sec: %f\n", N, secs);
}
int main() {
bench();
return 0;
}
Ayn uygulamay ayrca ARM hedefli derleyerek, bench fonskiyonunda geen sreleri
karlatrabilirsiniz. Kullandmz apraz derleyici iin derleme ilemi aadaki gibi
olacaktr.
C6Run
305
Gml Linux
Not: ARM ve DSP modllerinde sistem zamannn farkl ekilde alndna ve kodda bu
blmlerin _TMS320C6X ve __GNUC__ makrolaryla birbirinden ayrldna dikkat ediniz.
C6Run
306
Gml Linux
#include <stdio.h>
#include <time.h>
#include <math.h>
#if defined(_TMS320C6X)
#elif defined(__GNUC__)
#include <sys/time.h>
#endif
#define N 1000000
typedef unsigned long long timestamp_t;
int i;
timestamp_t t0, t1;
float secs;
double d;
static timestamp_t get_timestamp () {
#if defined(_TMS320C6X)
return (timestamp_t) clock();
#elif defined(__GNUC__)
struct timeval now;
gettimeofday (&now, NULL);
return now.tv_usec + (timestamp_t)now.tv_sec * 1000000;
#endif
}
void bench() {
t0 = get_timestamp();
for (i = 0; i < N; ++i) {
d = sin(i) * cos(i);
}
t1 = get_timestamp();
secs = (t1 - t0) / 1000000.0L;
printf("%d times sin(i) * cos(i) sec: %f\n", N, secs);
}
void bench();
int main() {
bench();
return 0;
}
bench kodunun bulunduu kaynak kodu, aadaki gibi bir statik ktphaneye
dntrdkten sonra uygulamamza linkleyebiliriz.
C6Run
307
Gml Linux
C6Run
308
Gml Linux
DSP Testi
Bu blmde daha nce derlediimiz rnek uygulamalar nasl altracamza bakacaz.
Daha nce C6Run iindeki rnekleri derleyip bir dizinde saklamtk. Bu dizinin iereini
tekrar hatrlayalm.
# ls /tmp/examples/
cmemk.ko dsplinkk.ko examples loadmodules.sh test unloadmodules.sh
2 adet ekirdek modlnn, rnekleri ieren examples dizinin, ayrca modlleri yklemek ve
kaldrmak iin, loadmodules.sh, unloadmodules.sh isimli betiklerin bulunduunu
grmekteyiz.
C6Run modllerinin bellein neresini kullanacaklar nem tamaktadr. Modllerin bellekte
kullanacaklar alann balang ve biti adresleri derleme zamannda deitirilebilei gibi
ykleme zamannda da belirtilebilir. Biz burada ngrlen deerleri kullanacaz.
loadmodules.h dosyasnda bu adresler aadaki gibi gsterilmektedir.
DSP_REGION_START_ADDR="0xC2000000"
DSP_REGION_END_ADDR="0xC4000000"
Hawkboard iin ekirdek kodu ise 0xC000000 adresinden balamaktadr, ekirdein DSP
modlleri iin ayrlm alana tamasn nlemek iin ekirdei kulland alan, modllerin
balang adresi olan, 0xC2000000 adresinde sonlandrmalyz.
Bu durumda ekirdek 0xC000000 ile 0xC2000000 arasnda bulunmaldr, ekirdek iin
ayrlan alan 0x2000000 yani 32M olmaldr. ekirdein bu blgeyi kullanmasn salamak
iin ekirdee mem=32M boot argman geirilmelidir. Bu ilem U-Boot zerinden aadaki
gibi yaplabilir.
loadmodules.sh ile gerekli modlleri ykledikten sonra, proje iinden kan ya da kendi
derlediiniz test uygulamalarnz altrabilirsiniz.
ARM ve DSP hedefli derlenen FFT uygulamalar iin elde ettiimiz sonular aadaki
gibidir.
DSP Testi
309
Gml Linux
# ./cfft_arm
N=16,nTimes=100: 0.007027 s
N=32,nTimes=100: 0.017506 s
N=64,nTimes=100: 0.04224 s
N=128,nTimes=100: 0.098568 s
N=256,nTimes=100: 0.226512 s
N=512,nTimes=100: 0.510898 s
N=1024,nTimes=100: 1.15786 s
N=2048,nTimes=100: 2.61276 s
N=4096,nTimes=100: 5.8848 s
N=8192,nTimes=100: 12.8365 s
N=16384,nTimes=100: 27.6982 s
# ./cfft_dsp
N=16,nTimes=100: 0.056423 s
N=32,nTimes=100: 0.055537 s
N=64,nTimes=100: 0.058968 s
N=128,nTimes=100: 0.059059 s
N=256,nTimes=100: 0.06587 s
N=512,nTimes=100: 0.080403 s
N=1024,nTimes=100: 0.107609 s
N=2048,nTimes=100: 0.168634 s
N=4096,nTimes=100: 0.302576 s
N=8192,nTimes=100: 0.619787 s
N=16384,nTimes=100: 1.33111 s
Kullandnz DSP modlnn sabit (fixed point) ya da kayan noktal (floating point) oluuna
gre bu sonular deiecektir. Ayrca ARM tarafndan DSP modlne yaplan arlar
maliyetli olduundan mmkn olduunca az ar yaparak, ar bana daha fazla ilem
yapmak daha uygun olacaktr.
DSP Testi
310
Gml Linux
311