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ę
addi 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(pochmod +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.*.txtlub{1..5}. - Debugowanie:
bash -x skrypt.shpokazuje 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ć!