Wiki

Clone wiki

chocos / 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