Architektura Komputerów i Systemy Operacyjne: Klawiatura MMIO, Wyjątki MIPS oraz Skrypty Bash

Enviado por Anónimo y clasificado en Otras materias

Escrito el en polaco con un tamaño de 5,23 KB

Obsługa Wejścia-Wyjścia oraz Przerwania

Klawiatura jest mapowana w pamięci (MMIO) pod adresem 0xffff0000 (rejestr sterujący) i 0xffff0004 (rejestr danych). Bit 0 rejestru sterującego (Ready Bit) ma wartość 1, gdy znak jest gotowy do odczytu.

Odczyt metodą odpytywania

  • Program wchodzi w pętlę, w której ciągle odczytuje rejestr sterujący urządzenia.
  • Sprawdza w nim wartość specjalnego bitu gotowości (Ready Bit).
  • Dopóki bit ten ma wartość 0 (oznaczającą "brak danych"), pętla kontynuuje działanie.
  • Gdy bit gotowości zmieni się na 1 (co oznacza "nowy znak jest dostępny"), program wychodzi z pętli.
  • Następnie program odczytuje rejestr danych, aby pobrać właściwy znak.

Wyjątki w Architekturze Procesora

Wyjątek (Exception): To synchroniczne zdarzenie, spowodowane bezpośrednio przez wykonywaną instrukcję, które przerywa normalny bieg programu. Synchroniczne oznacza, że jeśli uruchomisz ten sam program z tymi samymi danymi 100 razy, wyjątek zawsze wystąpi w tym samym miejscu.

Przebieg zdarzenia

  • Incydent: Jednostka arytmetyczno-logiczna (ALU) wykonuje instrukcję add i jej wewnętrzne obwody wykrywają, że wynik nie mieści się w 32 bitach (nastąpiło przepełnienie).
  • Blokada: Procesor nie zapisuje błędnego wyniku do rejestru docelowego. Przepływ sterowania zostaje natychmiast zatrzymany – następna instrukcja z programu nie zostanie pobrana.

Zapis do "Czarnej Skrzynki" (Koprocesor 0)

  • W rejestrze EPC (Exception Program Counter) zostaje zapisany adres pamięci instrukcji add, która spowodowała problem.
  • W rejestrze Cause zostaje zapisany kod numeryczny. Pole ExcCode w tym rejestrze przyjmuje wartość 12 (oznaczającą przepełnienie arytmetyczne).
  • W rejestrze Status jądro może ustawić specjalne bity, np. przełączając procesor z trybu użytkownika (user mode) w tryb jądra (kernel mode), co daje mu dostęp do chronionych zasobów.
  • Automatyczny Skok: Procesor ignoruje to, co miał robić dalej i bezwarunkowo ustawia swój licznik programu (PC) na stały, z góry zdefiniowany w architekturze adres: 0x80000180.

Skrypty Bash – Podstawy

  • Anatomia: Zaczynaj od #!/bin/bash. Uruchamiaj przez ./skrypt.sh (po chmod +x).
  • Zmienne: NAZWA="wartość" (bez spacji!), odwołanie $NAZWA.
  • Argumenty: $1, $2 (argumenty), $# (liczba argumentów).
  • Warunki if: if [ warunek ]; then ... fi. Warunek to program test. Najważniejsze: [ -f "$PLIK" ] (plik?), [ -d "$KATALOG" ] (katalog?), [ "$A" = "$B" ] (stringi równe?), [ $N -eq $M ] (liczby równe?).
  • Pętle for: for i in lista; do ... done. Lista to np. *.txt lub {1..5}.
  • Debugowanie: bash -x skrypt.sh pokazuje wykonanie krok po kroku.
  • Lab 7 Wyjątek: Synchroniczny błąd w programie (np. przepełnienie, zły adres). Przerywa normalne działanie.

Koprocesor 0 (CP0) i Procedura Obsługi

  • Procedura sprzętowa: Procesor zatrzymuje się, zapisuje stan do Koprocesora 0 i skacze pod stały adres jądra (0x80000180).
  • Koprocesor 0 (CP0): "Czarna skrzynka" procesora.
  • EPC (Exception Program Counter): Zapisuje adres instrukcji, która spowodowała błąd (GDZIE?).
  • Cause: Zapisuje kod numeryczny przyczyny wyjątku (CO SIĘ STAŁO?).
  • Exception Handler: Kod jądra, który diagnozuje problem na podstawie Cause i EPC i decyduje co robić (np. zabić proces).
  • eret: Instrukcja powrotu z obsługi wyjątku do przerwanego programu.

Operacje Wejścia-Wyjścia na Plikach

  • Deskryptor pliku (int fd): Mała liczba całkowita, "uchwyt" do otwartego pliku. 0, 1, 2 są zarezerwowane.
  • Cykl życia: open() -> read()/write() w pętli -> close().
  • open(plik, flagi, prawa): Zwraca deskryptor (fd) lub -1. Flagi: O_RDONLY, O_WRONLY, O_CREAT (utwórz), O_APPEND (dopisz), O_TRUNC (skasuj zawartość).
  • read(fd, bufor, ile): Czyta ile bajtów. Zwraca liczbę przeczytanych bajtów, 0 na końcu pliku, -1 przy błędzie.
  • write(fd, bufor, ile): Zapisuje ile bajtów. Zwraca liczbę zapisanych bajtów lub -1.
  • close(fd): Zamyka deskryptor. Niezwykle ważne, aby to robić!

Entradas relacionadas: