Wątek przeniesiony 2022-10-20 14:11 z C/C++ przez kq.

System Operacyjny a proces.

0

Hej
Od dłuższego czasu zastanawiam jak jest wykonywana kontrola wykonywanego programu przez system operacyjny(Tak na niskim poziomie).
Procesor wykonuje zestaw instrukcji(Kod systemu operacyjnego), uruchamiając swój program jest on wrzucany do pamięci i jest wykonywany tzn.jest mu przydzielany czas procesora.
Patrząc na to jak na zbiór instrukcji która jest kolejno wykonywana, to mamy instrukcje systemu następnie jest jump do instrukcji programu, wykonanie tego programu przez ileś ms i ponowny jump do kodu systemu operacyjnego. Tak jak by ten nasz program był zmodyfikowany i pomiędzy instrukcje naszego kodu był wrzucany jakiś jump do kodu systemu. W jaki sposób procesor jest wywłaszczany, Jump, Przerwania? Jak przerwania to w jaki sposób są rzucane? Jak to się dzieje? Gdzie można o tym poczytać? Jakie książki byście polecali ?

3

Poszukaj sobie po haśle "wprowadzenie do systemów operacyjnych", np. https://edu.pjwstk.edu.pl/wyklady/sop/scb/

4

@krancki:

Z ważnych rzeczy, to współczesne procesory "pecetowskie" *)praktycznie wszytskie mają tryby, ochronę. Ostatnim, który zupełnie nie miał, to był 8086 (na którym chodził de facto jednoprocesowy DOS - przypadkowa zbieżność? nie do końca) Program w DOS mógł podmieniać wektory przerwań, ustawiać chipy itd...

Do dziś pamietam chyba pierwszą dla mnie większą anglojezyczną książkę z "wolnego świata", od producenta (IBM?), była o martwym dziś systemie OS/2, szczegółowo opowiadała o ochronie i poziomach procesora, dostępnych już od 286

Procesory wyższej klasy (mainframe) miały to 10-20 lat wcześniej, więc żadna nowatorska idea, tylko dojrzałość do implemenatcji

Brakuje mi tego zdecydowanie w tym, jak sobie wstępnie wyobrażasz S.O. Wręcz ogólnie myślisz DOS-em .
Więc doczytać coś zaawansowanego o procesorach, też (choć niekoniecznie wszytskie rozdziały jednakowo gorliwie)

*) tzn współcześnie rzecz biorąc, bez mikrokontrolerów

2
krancki napisał(a):

Patrząc na to jak na zbiór instrukcji która jest kolejno wykonywana, to mamy instrukcje systemu następnie jest jump do instrukcji programu, wykonanie tego programu przez ileś ms i ponowny jump do kodu systemu operacyjnego. Tak jak by ten nasz program był zmodyfikowany i pomiędzy instrukcje naszego kodu był wrzucany jakiś jump do kodu systemu. W jaki sposób procesor jest wywłaszczany, Jump, Przerwania? Jak przerwania to w jaki sposób są rzucane? Jak to się dzieje? Gdzie można o tym poczytać? Jakie książki byście polecali ?

Ogólnie to system operacyjny zmienia rejestry systemowe: rejestr segmentu kodu, rejestr segmentu stosu i rejestr segmentu danych. Przed powrotem z przerwania ustawia je dla kolejnego procesu i wykonuje skok do segmentu kodu, kontynuując od uprzednio zapisanego miejsca. Na przykład dla Intela sprzętowe przełączanie zadań jest opisane w In­tel® 64 and IA-32 Ar­chi­te­c­tu­res So­f­twa­re De­velo­per’s Ma­nu­als w tomie 3 rozdziale 7.3. Sprzętowe oznacza, że procesor obsługuje rozkazy, które dokonują automatycznie zmiany rejestrów systemowych i kontrolują uprawnienia. W najnowszych, czyli 64‐bitowych procesorach, wymagane jest ustawianie uprawnień dla procesów do obszarów pamięci, zwanych tutaj stronami pamięci, względem dawniejszych metod, jakimi były segmenty. Czyli proces może sobie pisać i wykonywać kod tylko w tych stronach pamięci, które ma tak ustawione, ponieważ inaczej wystąpi błąd ochrony pamięci.

6
krancki napisał(a):

Patrząc na to jak na zbiór instrukcji która jest kolejno wykonywana, to mamy instrukcje systemu następnie jest jump do instrukcji programu, wykonanie tego programu przez ileś ms i ponowny jump do kodu systemu operacyjnego. Tak jak by ten nasz program był zmodyfikowany i pomiędzy instrukcje naszego kodu był wrzucany jakiś jump do kodu systemu. W jaki sposób procesor jest wywłaszczany, Jump, Przerwania? Jak przerwania to w jaki sposób są rzucane? Jak to się dzieje? Gdzie można o tym poczytać? Jakie książki byście polecali ?

Do tego co zostało już napisane dodam, że są dwa sposoby wywłaszczenia procesu.

  • Przerwanie sprzętowe, które oddaje kontrolę jądru systemu. Przerwanie może zmienić kontekst na jakiś inny proces albo wątek.
  • Wejście do systemu operacyjnego (w przypadku Unixów, nie wiem jak jest w Windowsami). Operacje na plikach, sieciowe, zarządzenie pamięcią, zarządzanie wątkami i procesami, operacje na semaforach są pod spodem wywołaniami systemowymi, które powodują wejście do kodu jądra. Podczas takiego wywołania systemowego, jądro może wywlaszczyć proces i zmienić kontekst na inny.
4

Przerwanie aktualnie wykonywanego procesu polega na emisji przerwania sprzętowego.
W każdym z procesorów czy to będzie µC (jakaś atmega,PIC itp.), ARM czy intel, za przerwania odpowiada licznik (timer).

Ten timer jest ustawiany podczas startu systemu.
W linuksach masz zmienną _SC_CLK_TCK (o ile mnie pamięć nie myli), która to jest ustawiana i kompilowana razem z jądrem. Ona determinuje maksymalny czas procesu (kwantu wykonywania).

W linku, który podał @overcq warto przeczytać rozdział 6 o przerwaniach.
W starszych intelach - pentiumach - timer był na zewnątrz procesora w osobnym układzie (podpięty pod któreś IRQ) w nowszych jest wewnątrz (?).

Rozszerzając to co napisał @nalik, przerwanie wykonywania procesu może zajść z wielu powodów:

  1. Przekroczenie timera co emituje przerwanie sprzętowe, które to zatrzymuje pracę programu i jest wykonywane to co znajduję się w kodzie, na który wskazuje wektor przerwania.
  2. Program wywołał funkcję systemu operacyjnego. Tutaj jądro może zadecydować żeby przełączyć na inny proces.
  3. Przerwanie sprzętowe
  4. Różne wyjątki związane z pracą procesora, jak niepoprawna instrukcja, dostęp do pamięci z zza dozwolonego zakresu itp. (nieobecne w prostych µC).
  5. Różne dziwaczne intelowskie mechanizmy bezpieczeństwa, wirtualizacje itp. (nieobecne w prostych µC oraz prawie wszytkich ARM).
  6. Pozostałe (których tu nie wymieniłem) takie jak przerwania programowe int itp. (nieobecne w prostych µC - z małymi wyjątkami).
  7. Oddanie czasu do procesora przez proces.

Po przerwaniu procesu następuje decyzja systemu co zrobić dalej.
Tutaj wchodzą w grę priorytety procesów i algorytmy szeregowania(jest ich wiele).

Każda z klas przerwań na intelu oraz procesorach rodziny ARM powinna mieć zdefiniowany osobny stos (tak zazwyczaj jest - inicjacja podczas startu systemu).
Ogólnie rzecz ujmując architektura intelowska jest bardzo skomplikowana.

Myślę, że udało mi się nakreślić jak to działa i nie popełniłem zbyt wielu błędów :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1