Linux w systemach embedded / Marcin Bis. – Warszawa, 2011 Spis

Transkrypt

Linux w systemach embedded / Marcin Bis. – Warszawa, 2011 Spis
Linux w systemach embedded / Marcin Bis. – Warszawa, 2011
Spis treści
Wstęp
17
1.
1.1.
1.2.
1.3.
1.4.
1.4.1.
1.4.2.
1.4.3.
1.4.4.
Szybkie wprowadzenie do wbudowanego Linuksa
Architektura
Linux = Linux wbudowany
„Widok z helikoptera"
ARM
Cortex
ОМАР
Operacje zmiennoprzecinkowe
XScale
23
24
25
26
31
33
33
33
34
2.
2.1.
2.2.
2.3.
2.4.
2.5.
2.6.
2.7.
2.7.1.
2.7.2.
2.8.
Bardzo szybki start
Zanim zaczniemy
Cross-kompilator
Jądro - przygotowanie
Podstawowe narzędzia
Biblioteka standardowa C
Pliki urządzeń, skrypty startowe i konfiguracja
Ram dysk
Jądro - kompilacja
Uruchomienie systemu w emulatorze
Uruchomienie systemu na urządzeniu
35
35
36
37
38
39
39
42
42
42
43
3.
Środowisko cross-kompilacji dla architektury ARM
3.1.
Po co nam cross-kompilator?
3.2.
Zanim zaczniemy: Decyzje projektowe
3.2.1. Nazwa toolchaina i jej znaczenie
3.2.2. (E)ABI
3.2.3. Wersja procesora i architektury
3.2.4. Zestawy instrukcji: ARM i Thumb
3.2.5. Kolejność bajtów w słowie
3.2.6. Operacje zmiennoprzecinkowe
3.2.7. Obsługa wątków
3.3.
Zaczynamy: Przygotowanie systemu
3.3.1. Konto robocze
3.3.2. Środowisko
3.4.
Pliki nagłówkowe jądra
3.5.
GMP
3.6.
MPFR
3.7.
MPC
3.8.
Zlib
3.8.1. Binutils
3.9.
GCC - wersja pomocnicza
3.10. Biblioteka standardowa C
3.10.1. uClibc
3.10.2. eglibc
3.11. Iibelf
45
46
47
48
50
52
54
55
56
57
58
58
59
60
61
61
61
62
62
65
66
67
69
74
3.12. GCC - wersja docelowa
3.13. Korzystanie z toolchaina
3.13.1. Dodatkowe biblioteki kompilatora
3.13.2. chrpath
3.13.3. Usuwanie zbędnych symboli debuggera
3.13.4. Prosta weryfikacja działania kompilatora
3.14. Co dalej?
74
76
76
76
78
78
79
4.
Narzędzia automatyczne
4.1.
Gotowe toolchainy
4.1.1. CodeSourcery
4.1.2. Linaro
4.2.
Crosstool- ng
4.2.1. Instalacja
4.2.2. Konfiguracja i budowanie toolchaina
4.2.3. Minimalna wspierana wersja jądra
4.2.4. Konfiguracja dla procesorów armv7
4.2.5. Toolchain prekonfigurowany
4.3.
Buildroot
4.3.1. Instalacja
4.3.2. Konfiguracja z nowym toolchainem
4.3.3. Wybór programów i bibliotek
4.3.4. Format docelowego systemu plików
4.3.5. Buildroot z gotowym toolchainem
4.3.6. Kompilacja
4.3.7. Zmiana konfiguracji, przebudowanie lub usunięcie pojedynczego pakietu
4.3.8. Zmienne środowiskowe
4.3.9. Przeniesienie katalogu Buildroota
4.3.10. Korzystanie z narzędzi
4.3.11. Błędy w działaniu Buildroota
4.3.12. Co dalej?
4.4.
OpenWRT
4.4.1. Instalacja OpenWRT w wersji binarnej na urządzeniu
4.4.2. MenedŜer pakietów
4.4.3. Obsługa Opkg
4.4.4. Przykład: udostępnianie dysku USB dla systemów Windows
4.4.5. Dodatkowe narzędzia - SDK
4.4.6. Dodatkowe narzędzia - ImageBuilder
4.4.7. Instalacja OpenWRT (z kodu źródłowego)
4.4.8. Prototypowanie: OpenWRT w QEMU i na urządzeniu
4.5.
Scratchbox
4.5.1. Scratchbox2
4.5.2. Scratchbox2 - Instalacja
4.5.3. Scratchbox2 - Przygotowanie i konfiguracja
4.5.4. Jak to działa?
4.5.5. Uruchamianie i debugowanie programów bezpośrednio na urządzeniu
4.5.6. Scratchbox (1) - instalacja i konfiguracja
4.5.7. Jak korzystać z gotowych pakietów?
4.5.8. Scratchbox (1) - Budowanie pakietów ze źródeł
4.6.
Inne narzędzia
4.6.1. Emdebian
81
82
83
85
85
85
86
89
91
91
92
93
93
94
96
97
99
99
100
100
101
101
102
102
102
105
105
106
107
108
108
111
114
115
115
116
117
118
121
126
130
131
131
4.6.2.
4.6.3.
4.6.4.
4.6.5.
4.7.
4.7.1.
4.7.2.
4.7.3.
Ptxdist
LTIB
MeeGo
OpenEmbedded
Instalacja systemu Debian 6.0 w wersji dla architektury ARM
Instalacja - etap I (stacja robocza)
Instalacja - etap II (urządzenie)
Instalacja - etap III (podstawowa konfiguracja)
133
134
135
137
139
140
141
142
5.
5.1.
5.1.1.
5.1.2.
5.1.3.
5.2.
5.2.1.
5.2.2.
5.2.3.
5.3.
5.4.
Emulatory
QEMU
Instalacja
Emulowane platformy ARM
Kompilacja QEMU ze źródeł
Emulacja BeagleBoard, DevKit8000 i innych platform OMAP3
Typowe paramerty wywołania
Obrazy dysków i kart pamięci
Obsługa sieci
Obrazy płyt i dysków
Emulacja urządzeń MTD
143
145
145
146
148
150
152
153
154
156
156
6.
Konfiguracja i kompilacja jądra
6.1.
Wersje Linuksa
6.1.1. Rozwój jądra 2.6
6.1.2. Wersje eksperymentalne
6.1.3. Dodatkowa dokumentacja
6.1.4. Jak zdobyć kod źródłowy jądra
6.1.5. Czy kompilować?
6.2.
Konfiguracja kodu źródłowego
6.2.1. General set-up
6.2.2. Enable loadable module support
6.2.3. Enable the block layer
6.2.4. System Type
6.2.5. Processor type and features
6.2.6. Boot options
6.2.7. CPU Power Management
6.2.8. Floating poin emulation
6.2.9. Power management and ACPI options
6.2.10. Bus options (PCI etc)
6.2.11. Executable file formats / Emulations
6.2.12. Networking support
6.2.13. Device Drivers
6.2.14. Firmware Drivers
6.2.15. File systems
6.2.16. Kernel hacking
6.2.17. Security options
6.2.18. Cryptographic API
6.2.19. Virtualization
6.2.20. Library routines
6.2.21. Kompilacja i instalacja
6.2.22. Dodatkowa dokumentacja
159
159
159
161
161
162
163
164
167
167
167
168
169
169
170
170
170
170
170
171
171
172
172
172
173
173
173
173
173
174
7.
Jak działa jądro?
7.1.
Z czym się zmagamy?
7.2.
Sterownik urządzenia
7.3.
Przestrzeń uŜytkownika - procesy
7.3.1. Cykl Ŝycia procesu, monitorowanie procesów
7.3.2. Szeregowanie procesów
7.3.3. Komunikacja między procesami
7.3.4. Monitorowanie pamięci
7.4.
Interfejsy udostępniane przez jądro
7.4.1. Wywołania systemowe
7.4.2. System plików proc i inne oparte na pamięci RAM
7.4.3. Pliki urządzeń
7.4.4. udev
7.4.5. mdev
7.4.6. Pozostałe mechanizmy komunikacji
7.5.
Po stronie jądra
7.5.1. Moduły
7.5.2. Skąd wziąć narzędzia do zarządzania modułami?
7.5.3. Jak ich uŜywać
7.5.4. Frame worki
7.5.5. Model urządzeń w jądrze
7.5.6. Magistrala
7.5.7. Przykład: magistrala USB
7.5.8. Specyfika systemów wbudowanych
7.5.9. Przykład - port szeregowy w procesorach firmy Atmel
7.5.10. Zasoby urządzeń
7.5.11. Sterowniki - podsumowanie
7.6.
Obsługa USB
7.6.1. Klient USB
7.6.2. File-backed Storage Gadget
7.6.3. Ethernet Gadget (with CDC Ethernet support)
7.6.4. Serial Gadget (with CDC ACM and CDC OBEX support)
7.7.
GPIO w Linuksie
7.7.1. LED Class Driver
7.7.2. GPIO keys
7.7.3. Ogólny sterownik GPIO
7.8.
Korzystanie z innych magistral
7.9.
Zarządzanie energią
7.9.1. Liczniki
7.9.2. Usypianie i przywracanie stanu systemu
7.9.3. Interakcja z przestrzenią uŜytkownika
7.9.4. Co robi procesor, gdy nic nie robi?
7.9.5. Inne mechanizmy zarządzania energią
175
175
176
177
179
184
184
185
187
189
190
194
196
198
200
200
201
202
203
204
205
205
206
208
208
210
211
212
213
214
215
216
217
218
219
222
223
224
225
226
227
227
230
8.
8.1.
8.1.1.
8.1.2.
8.1.3.
8.1.4.
231
231
231
232
233
234
Programowanie w jądrze
Zanim zaczniemy
Układ katalogów
Język programowania i kompilator
Brak biblioteki standardowej języka C
Przenośność
8.1.5. Rozmiar słowa
8.1.6. Typy nieprzejrzyste
8.1.7. Kolejność bajtów w słowie
8.1.8. Typy o stałych rozmiarach
8.1.9. Brak operacji zmiennoprzecinkowych
8.1.10. Nie ma stałego API
8.1.11. Zarządzanie pamięcią
8.1.12. Synchronizacja jądra
8.1.13. Obsługa przerwań
8.1.14. Licencjonowanie jądra
8.1.15. Prototypowanie sterownika
8.2.
Własne moduły jądra
8.2.1. Niezbędne narzędzia i przygotowanie
8.2.2. Kod źródłowy jądra
8.2.3. Pierwszy moduł
8.2.4. Kompilacja pierwszego modułu
8.2.5. Dołączanie modułu do kodu jądra
8.2.6. Funkcje udostępniane przez moduły
8.2.7. Parametry modułów
8.2.8. Parametry konfiguracyjne w /proc/sys
8.2.9. Obsługa systemu plików debugfs
8.2.10. Urządzenie znakowe
8.2.11. Inne operacje na plikach - mmap
8.3.
Przykład z Ŝycia: sterownik portu szeregowego
8.3.1. Implementacja przesyłania danych
8.3.2. Wysyłanie oparte na próbkowaniu
8.3.3. Wysyłanie oparte na przerwaniach
8.3.4. Implementacja odbierania danych
8.3.5. Linie kontroli modemu
8.3.6. termios
8.3.7. Konsola
235
236
236
237
237
237
238
241
243
246
247
248
248
248
249
250
251
253
255
257
259
261
264
268
271
272
272
272
274
275
275
9.
9.1.
9.2.
9.3.
9.3.1.
9.3.2.
9.3.3.
9.3.4.
9.4.
9.4.1.
9.4.2.
9.4.3.
9.4.4.
9.5.
9.6.
9.7.
9.8.
9.8.1.
9.8.2.
277
278
281
282
282
284
287
287
288
290
293
296
299
302
303
306
307
307
308
System bazowy
Instalacja Busyboksa
Ramdysk
Urządzenie blokowe
Systemy plików dla urządzeń blokowych
Karty pamięci
System plików squashfs
FUSE i NTFS
Pamięć Flash
Opcje konfiguracji jądra
Podział na partycje
Systemy plików dla urządzeń MTD
UBI
Rozwiązania hybrydowe
Sieciowy system plików
XIP
Obsługa systemów plików
Montowanie
Kontrola wykorzystania przestrzeni dyskowej
9.9.
Szyfrowane systemy plików
9.9.1. ecryptfs
9.9.2. device-mapper
9.10. Praca z urządzeniem - narzędzia pomocnicze
9.10.1. Kopia zapasowa
9.10.2. Minicom
5.10.3. Aktualizacja systemu na urządzeniu
309
309
310
311
311
312
315
10.
Uruchamianie systemu
10.1. Bootstrap
10.1.1. Uruchamianie systemu z karty SD
10.2. SAM-BA
10.2.1. RomBOT
10.2.2. Wersje
10.2.3. Korzystanie z programu
10.2.4. SAM-BAiLinux
10.2.5. Zmiany w kodzie appletów
10.3. Toshiba AC100 (NVIDIA Tegra 2)
10.3.1. Narzędzia deweloperskie
10.3.2. Konfiguracja jądra i systemu bazowego
10.3.3. Programowanie urządzenia
10.4. Bootloader pierwszego poziomu
10.4.1. X-Ioader
10.4.2. AT9IBootstrap
10.4.3. Freescale i.MX23
10.4.4. AT91 - własny program uruchomieniowy
10.4.5. Parametry jądra
10.5. u-boot
10.5.1. Instalacja u-boota
10.5.2. Pomoc
10.5.3. Zmienne środowiskowe u-boota
10.5.4. TFTP
10.5.5. Instalacja i konfiguracja serwera tftpd
10.5.6. mkimage
10.5.7. Przykłady korzystania z u-boota
10.5.8. Modyfikacja kodu źródłowego
10.6. Jądro systemu
10.6.1. Co się dokładnie dzieje w jądrze?
10.6.2. Proces numer 1
10.7. Optymalizacja czasu uruchamiania systemu
10.7.1. Bootloader
10.7.2. Jądro
10.7.3. System bazowy
317
318
321
323
323
327
328
330
331
332
333
336
337
338
338
339
339
342
343
344
345
345
346
347
347
348
349
349
351
352
355
355
356
356
360
11.
Diagnostyka
11.1. Sprzętowe narzędzia debugowania
11.1.1. Oscyloskop
11.1.2. JTAG
11.1.3. Obsługa urządzeń JTAG
11.2. Debugowanie aplikacji
11.2.1. Instalacja
365
366
366
367
368
369
370
11.2.2. Korzystanie z GDB
11.2.3. Graficzne nakładki na GDB
11.3. Siedzenie procesów
11.3.1. Analizowanie działania skryptów
11.3.2. Stracę
11.3.3. Śledzenie systemu
11.4. Debugowanie jądra
11.4.1. Opcje debugowania jądra
11.4.2. Jak dobór kompilatora wpływa na jądro
11.4.3. Wpisywanie komunikatów
11.4.4. Poziomy rejestrowania
11.4.5. Bufor komunikatów
11.4.6. dev_info i dev_err
11.4.7. Preprocesor C i przydatne makra
11.4.8. Dedykowany system plików
11.4.9. Oops
11.4.10. Magic SysRq
11.4.11. Debugowanie pamięci jądra
11.4.12. Zastosowanie GDB do debugowania jądra
11.5. KGDB
11.5.1. Przygotowanie KGDB do pracy
11.6. Debugowanie przy uŜyciu QEMU
11.6.1. Debugowanie jądra przy pomocy QEMU
11.6.2. Debugowanie U-BOOT-a
11.6.3. Debugowanie uClibc
370
374
374
374
375
375
376
377
378
379
379
380
381
381
383
384
384
385
385
385
386
388
388
390
390
12.
Przykładowe projekty
12.1. Skąd się bierze dystrybucja Linuksa?
12.2. Konfiguracja wstępna
12.3. Biblioteka ncurses
12.4. PowerTOP
12.5. Dźwięk w systemie Linux
12.5.1. OSS
12.5.2. ALSA
12.5.3. alsa-lib
12.5.4. SALSA
12.5.5. Narzędzia ALSA
12.5.6. Serwery dźwięku
12.5.7. Portaudio
12.6. Gstreamer
12.6.1. Korzystanie z GStreamera
12.7. Mplayer
12.7.1. MPlayer i video41inux
12.8. Synteza mowy - rozwiązania opensource
12.8.1. Espeak
12.8.2. Festival - Flite
12.8.3. Komercyjne rozwiązania syntezy mowy
12.9. zlib
12.10. Kodowanie i dekodowanie dźwięku
12.10.1. Mp3
12.10.2. Dekompresja mp3
393
393
394
396
398
399
399
400
401
403
404
405
406
407
409
413
414
416
416
418
419
419
420
421
421
12.10.3. Kompresja mp3
12.10.4. AAC/MP4
12.10.5. RealAudio
12.10.6. WMA
12.10.7. Ogg
12.11. Szyfrowanie
12.11.1. Szyfry symetryczne
12.11.2. Instalcja openssl
12.11.3. Instalacja ccrypt
12.11.4. Szyfry z kluczem jawnym
12.11.5. Podpis elektroniczny
12.11.6. Szyfrowanie haseł w Linuksie
12.11.7. Szyfrowanie z kluczem jawnym w praktyce
12.11.8. Własne CA, obsługa certyfikatów
12.11.9. Propozycje uŜycia
12.11.10.Wydajność szyfrowania
12.12. Serwer SSH
12.12.1. Uruchomienie serwera
12.12.2. Rozwiązywanie problemów
12.13. DirectFB
12.14. QT
12.14.1. Instalacja za pomocą Buildroota
12.14.2. Instalacja zindywidualizowana
12.14.3. Praca z biblioteką QT - GUI
12.15. QTOPIA
12.15.1. QT x86
12.15.2. Biblioteki pomocnicze: uuid, tslib, jpeg
12.15.3. QT ARM
12.15.4. Przykładowa aplikacja
12.16. Maszyna wirtualna Javy (MIDP + CDC, CLDC)
12.16.1. Java w systemach wbudowanych
12.16.2. gej
12.16.3. Biblioteka klas
12.16.4. JamVM
12.16.5. JamVM - testy
12.16.6. PhoneME
12.17. Obsługa systemów plików i urządzeń MTD
12.17.1. ext2, ext3, ext4
12.17.2. LZO
12.17.3. MTD
12.18. Drukowanie
12.18.1. CUPS
12.18.2. Jak to działa?
12.18.3. Skąd wziąć sterowniki?
12.18.4. Instalcja komponentów systemu drukowania
12.19. Zegar czasu rzeczywistego
12.20. stracę
12.21. Serwer HTTP
12.21.1. Sterowanie LED-ami
12.22. Sieci bezprzewodowe
12.22.1. Wprowadzenie w pigułce do 802.11
424
425
426
426
426
432
434
436
436
437
438
439
440
442
445
445
446
447
447
447
452
452
453
455
460
461
461
464
465
466
467
469
469
472
473
473
475
475
476
478
479
479
481
482
483
486
488
489
490
491
492
12.22.2. Wi-Fi
12.22.3. Protokół
12.22.4. Bezpieczeństwo
12.22.5. Obsługa w systemie Linux
12.22.6. Przykładowe urządzenie
12.22.7. Interfejsy
12.22.8. Tryby pracy interfejsu
12.22.9. Sieć Ad-Hoc
12.22.10. Podłączanie do punktu dostępowego WPA2
12.22.11. Konfiguracja punktu dostępowego
12.23. Zdalne sterowanie urządzeniem
12.23.1. VNC
12.23.2. X11vnc
12.23.3. LibVNCServer
12.23.4. Bufor ramki
12.23.5. Uinput
12.23.6. FbVNC
12.24. Przygotowanie systemu do uruchomienia
12.24.1. Konfiguracja
12.24.2. Przygotowanie
12.24.3. Kopiowanie plików i bibliotek
12.24.4. Haki
12.24.5. Skrypty startowe i pliki konfiguracyjne
12.24.6. Przygotowanie obrazu
492
493
493
495
495
500
501
502
503
504
505
505
506
507
508
510
512
517
518
519
520
521
522
523
A.
A.1.
A.2.
A.2.1.
A.3.
A.3.1.
A.3.2.
A.4.
A.4.1.
A.4.2.
525
525
527
528
533
533
534
538
538
539
Przygotowanie środowiska pracy
Wybór dystrybucji
Dobór sprzętu
Konfiguracja wirtualnej maszyny
Instalacja systemu Debian/GNU Linux
Skąd wziąć nośniki instalacyjne
Instalacja
Uwagi dotyczące uŜytkowania systemu
Konto administratora
Instalacja oprogramowania
B.
Polecenia powłoki
B.1.
Podstawowe narzędzia powłoki
B.1.1. Obsługa plików i katalogów
B.1.2. Wyświetlanie informacji o plikach
B.1.3. Wyświetlanie zawartości plików
B.1.4. Dopasowywanie nazw plików - znaki wieloznaczne
B.1.5. Przeszukiwanie plików
В. 1.6. Zmiana praw plików
В. 1.7. Porównywanie zawartości plików i katalogów
B.1.8. Wyszukiwanie plików
B.1.9. Przekierowania
B.1.10. Kontrola procesów
B.1.11. Rozmiary plików i partycji
B.1.12. Archiwa
B.1.13. Drukowanie
541
541
541
542
542
543
543
543
544
544
544
545
545
545
546
B.1.14. Zarządzanie uŜytkownikami
B.1.15. Zarządzanie czasem
B.1.16. Pomoc
B.1.17. Obliczenia
B.1.18. Administracja
B.1.19. Jądro, sprzęt, moduły
B.1.20. Interfejsy jądra
B.1.21. Praca zdalna
B.1.22. HTTP
B.2.
Edytor tekstu VIM
B.3.
Skrypty powłoki
B.4.
Kompilator gcc
546
546
547
547
547
548
548
549
549
549
552
554
C.
C.1.
C.2.
C.2.1.
C.2.2.
C.2.3.
C.2.4.
C.2.5.
C.2.6.
C.2.7.
C.3.
C.3.1.
C.3.2.
C.3.3.
555
555
556
556
556
557
558
558
558
559
561
561
563
564
Praca z kodem źródłowym, system kontroli wersji GIT
Tworzenie łat
Korzystanie z GIT-a
Początek pracy
Nowy projekt
Pobranie istniejącego projektu
Historia zmian
Tworzenie łat
Gałęzie projektu
Praca grupowa
Przeglądanie plików źródłowych
Grep i wyraŜenia regularne
cscope
LXR
oprac. BPK

Podobne dokumenty