Wiki
Clone wikichocos / ELF - Plan Prezentacji
Zredagowane
1. Wstęp
- Tytuł
- Przedstawić się
- W skrócie powiedzieć o czym będzie prezentacja
- Plan prezentacji
2. Demonstracja efektu, który chcemy osiągnąć
- Przygotowujemy prosty hello world
- Kompilujemy go
- Przesyłamy plik ELF/CBIN do płytki => w jaki sposób to przesyłamy (HTTP server + komenda na linuxie, żeby przesłać plik - curl prawdopodobnie)
- ChocoOS ładuje nasz program do ramfs i następuje jego odpalenie
3. Metoda 1. - Własny format pliku wykonywalnego
- Spróbować skompilować najprostszy program -> pokazać jak wygląda plik wynikowy
- nie da się tego uruchomić dynamicznie, bo są sekcje zależne od miejsca w pamięci ROM/RAM
- Pokazujemy skrypt linkera niezależny od adresów ROM/RAM - w jednym, ciągłym bloku zaczynającym się od adresu 0x0000
- Dynamiczne ustalenie miejsca w pamięci
- złe odwołania do zmiennych i skoki do funkcji (adres 0 to adres NULL)
- -fPIC - Position Independent Code i tablica .got
- Nie wiemy gdzie są sekcje (np .got) podczas odpalania, wiec potrzebujemy .header oraz .sections
- Nie wiemy gdzie jest punkt startowy - dodajemy wpis MainFunction do .headera - zbadać czy to potrzebne
- Trzeba dodać -nostartfiles -> żeby nie dodawał dodatkowych śmieci -> jakich
- Rozmiar stosu dla głównego wątku -> przemyśleć czy potrzebne i w jaki sposób go podawać - albo do .header albo w linkerze
- Próbujemy to odpalić
- Chcemy coś wydrukować na ekranie - printf wołamy i cyk - nie kompiluje się (nie linkuje)
- jak uciszyć linker -> printf jako zmienna
- jak dać możliwość wpisania adresu systemowi -> sekcja pamięci .syscalls
- nie wiemy który adres systemowej funkcji jest który, więc potrzebujemy tablicy SystemCalls z nazwami - podczas ładowania programu do pamięci, system uzupełnia tablicę .syscalls, ale jeszcze trzeba uzupełnić zmienne printf, więc potrzebujemy funkcji inicjalizującej przed main
Notatki
- Wstęp i cel
- Pokazać ideę programów dynamicznych z grafiką przedstawiającą wysokopoziomowe oddzielenie systemu od programu, oraz interfejsem pośredniczącym
- Można zadać pytanie do publiczności o możliwe zastosowanie odpalania takiego pliku (odp. np. stworzenie systemu a'la Linux, uniwersalny bootloader + wymyślić jakieś jeszcze) - do rozważenia, na którym etapie prezentacji to poruszyć
- Opis sekcji pamięci (todo: których? Które są zdefiniowane standardem elf, a które przez chocoosa? Pytanie do publiczności - "Dlaczego bss i data są w osobnych sekcjach?")
- Krótko wspomnieć o etapach kompilacji (kompilacja i linkowanie) i połączyć to z wyjaśnieniem czym jest linkowanie statyczne i dynamiczne
- Dynamiczne linkowanie -> jak wygląda z uwzględnieniem tablicy plt, got, i rel.plt
- Struktura pliku ELF
- Jak odczytywać plik ELF - narzędzie readelf
- Jak wygląda uruchomienie ELF-a na PC ( wspomnieć o MMU)
- Przykładowe implementacje (patrz: trello)
- Potencjalne problemy z uruchomieniem pliku ELF na embedded - ze względu na brak MMU
- Przygotowanie pliku ELF (jak go skompilować) - również przygotowanie skryptu linkera (adresy sekcji po kolei od zera)
- Wytłumaczenie połączenia pomiędzy programem a systemem operacyjnym (.syscalls)
- Runtime linker i proces odpalania programu przez system
- Rozmiar pliku ELF i standardowe sposoby zmniejszenia go
- Przedstawienie alternatywnego rozwiązania dynamicznego ładowania plików - CBIN oraz przedstawienie jego rozmiaru
- A może live-demo? Kamera ustawiona na wyświetlacz LCD tak, aby każdy w jakiś sposób mógł odpalić sampla z "Hello World" na tym wyświetlaczu? Np można by można przygotować prosty serwer HTTP, na którym piszę się kod sample apki, a potem kompiluje go i wysyła do urządzenia? Zrobiłoby wrażenie i ożywiło publiczność
- Redukowanie rozmiaru ELFa
Updated