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