Implementacja komunikatu rozruchowego

https://chacker.pl/

Jednym z naszych wymagań protokołu jest to, że komunikacja musi być inicjowana przez jądro, wysyłając informacje o swoim środowisku wykonawczym do klienta. Spełnimy ten wymóg, implementując „komunikat rozruchowy”, który dostarcza następujących informacji:

  • Przestrzeń adresów fizycznych (z punktu widzenia jądra uruchomionego

na maszynie wirtualnej).

  • Adresy jądra (symbole). Służy to dwóm celom. Pierwszym jest poinformowanie klienta, gdzie załadowane jest jądro, aby nie nadpisało go przypadkowo podczas wstrzykiwania kodu. Drugim jest dostarczenie adresów znanych funkcji jądra, które mogą być używane przez kod zewnętrzny.

Informacje z komunikatu rozruchowego zostaną zakodowane na liście asocjacyjnej, gdzie pierwszy element każdej pary jest ciągiem identyfikacyjnym zawartości drugiego elementu. Układ drugiego elementu jest specyficzny dla rodzaju dostarczanych informacji (zwykle kodowanych jako podlista). W tym przypadku użyjemy ciągów „symbols” i „mmap” do oznaczania informacji. Konstruowanie „symboli” jest proste; po prostu tworzymy z nich listę asocjacyjną nazw symboli i ich adresów:

W tym przypadku podajemy adresy nagłówka ELF jądra, końca segmentu BSS oraz funkcji put_va i send_msg. Aby skonstruować „mmap”, zmodyfikujemy kod bootstrap, aby wykorzystać obszar multiboot info (MBI) dostarczany przez GRUB:

Definicja kmain musi zostać dostosowana, aby przyjąć MBI jako argument. Dodamy również kod, który konstruuje i wysyła komunikat rozruchowy:

Ostatnim elementem jest funkcja put_mbi służąca do analizowania MBI i konstruowania „mmap”:

UWAGA Aby przejść przez MBI, potrzebujemy definicji z pliku „multiboot2.h” dostarczonego przez GRUB.

Funkcja put_mbi (1) wyszukuje MULTIBOOT_TAG_TYPE_MMAP (2) w MBI, aby znaleźć strukturę multiboot_tag_mmap. Ta struktura zawiera informacje o przestrzeni adresowej w serii wpisów iterowanych przez put_mmap (3) w celu wygenerowania „mmap”. Każdy z tych wpisów reprezentuje zakres pamięci i zawiera jego adres bazowy, długość i typ pamięci. Jak dotąd to wszystko, czego potrzebujemy do komunikatu rozruchowego.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *