Umbrella OS

5

I oto jest UmbrellaOS
screenshot-20201007155704.png
Może niektórzy pamiętają mój poprzedni system operacyjny, BSCS, ale ten zawierał niestety trudny do rozwiązania błąd zmiany dysku, którego nie udało mi się rozwiązać. Moje drugie podejście do tego problemu to UmbrellaOS.
UWAGA: Nie zapewnia ochrony przed desczem
Domyślnym znakiem zachęty jest tylda (~) co można jednak zmienić za pomocą polecenia ask. Jest jeszcze polecenie zmieniające tryb ekranu, restartujące komputer itd. (brak obsługi dysków na razie).
Aktualna lista poleceń:

ask x - ustaw znak zachęty
mode x - ustaw tryb ekranu
boot - restart komputera
type - narzędie "cat"
info - informacje o systemie
echo xxx - wyswietl napis, ta sama komenda co na dosie
abcd xxx - wykonuje program w języku ABCD (https://esolangs.org/wiki/ABCD)
halt - zatrzymanie CPU za pomocą opkodu F4h, a jak zawiedzie - za pomocą pętli nieskończonej

Oczywiście projekt zamierzam rozwijać i dodawać nowe polecenia. Inspiracją do 2giego podejścia do stworzenia OS'a był Cyjon OS.

2

UmbrellaOS ma od teraz możliwość programowania
screenshot-20201008084236.png
Wszystko za sprawą tego, że dodałem do systemu interpretator języka ABCD (wersja z małymi literami, w oryginale należy stosować duże) https://esolangs.org/wiki/ABCD. Jestem świadomy, że ABCD nie jest z wielu powodów najlepszym językiem programowania, ale na pewno jest najprostszy do zaimplementowania w asmie (zarówno 8080 jak i x86, w tym przypadku x86). Aby rozszerzyć możliwości interpretatora, planuję dodać stos, możliwość czytania pamięci ram (na przykład aby dowiedzieć się jaki jest ustawiony znak zachęty), operacje bitowe i arytmetyczne, pętle... oczywiście pod warunkiem że zmieszczę się w boot-sektorze :). Na screenshocie widzimy szyfrowanie i odszyfrowywanie kodu Cezara za pomocą ABCD.

0

Ale to przecież nie jest OS, bo odpalasz to w Dosboxie. To co zrobiłeś to co najwyżej jakiś shell.

1

Ładnie. Pochwalisz się kodem? Myślałeś nad ładowaniem większej liczby sektorów, żeby nie mieć ograniczenia do 446 bajtów?

0

W sumie dwie nowe miniaktualizacje
Po pierwsze, teraz wiersz poleceń jest case-insensitive, jak w DOSie (choć UmbrellaOS nie ma z systemem Marka Zbikowsiego nic wspólnego):
screenshot-20201008135929.png
A po drugie, kolor znaków jest zmieniony na fioletowy (aby to zobaczyć, najpierw musimy przejść rzecz jasna w tryb graficzny komendą mode B*):
screenshot-20201008140259.png
*Standardowo tryb ekranu w poleceniu mode ma być cyfrą dziesiętną, ale tryb graficzny ma numer 18 (12 szesnastkowo) więc gdy podamy duże B, to w wyniku odejmowania 66-48=18 ustawimy właśnie ten tryb.

5

Jako element edukacyjny rzecz zawsze wartościowa i za to gratuluję. Jednak to co robisz na miano systemu operacyjnego nie zasługuje ( z definicji).
Obecnie to program uruchamiany z MBR. Nawet bardzo stare biosy były wielokrotnie bardziej skomplikowanymi aplikacjami a jednak na miano systemów operacyjnych nie zasługują.
Jak chcesz napisać system operacyjny to przynajmniej dowiedz się czym takowy jest: https://pl.wikipedia.org/wiki/System_operacyjny

1

mógłbym to zrobić za pomocą int13h ale wtedy musiałbym z góry wiedzieć z czego odpalany jest system

Number dysku z którego jest odpalony system dostajesz w rejestrze DL:

An MBR is loaded by the BIOS at physical address 0x7c00, with DL set to the "drive number" that the MBR was loaded from.

https://wiki.osdev.org/MBR_(x86)#MBR_Bootstrap

2

oczywiście pod warunkiem że zmieszczę się w boot-sektorze

Dobrze rozumiem, że nie masz zaimplementowanego bootloadera w tym projekcie i nie wychodzisz poza boot-sektor? Jeśli tak jest to, żebyś mógł pisać o tym, że Twój projekt jest chociaż zalążkiem systemu operacyjnego powinieneś chociaż załadować więcej sektorów, napisać minimalistyczny kernel i skoczyć do tego kernela za pomocą bootloadera właśnie. To co zaimplementowałeś teraz to raczej shell. Przecież już samo ograniczanie się do tych 512 bajtów powinno być zachęcające, żeby jednak większą ilość miejsca mieć do dyspozycji. Możliwe, że ją znasz, ale ta strona https://wiki.osdev.org/Main_Page jest bardzo przydatna jeśli chce się stworzyć autorski OS.

0

No, wresczie UmbrellaOS ma więcej miejsca :)
screenshot-20201008160703.png
Oczywiście na screenie tego nie widać. Wszystko dzięki "agencji mieszkaniowej" int13h oraz użytkownikowi @mad_penguin, który przysłał mi odpowiedź, skąd wiedzieć pod jakim numerem jest nośnik z systemem. Przez rozszerzenie możliwości systemu, DOSBox odmówił współpracy, i od teraz będę musiał testować system pod Bochsem. Na razie nie wiem jeszcze co zrobić z tym bonusowym pół kilobajta.

0

Pierwsze korzyści z wprowadzenia second-stage
screenshot-20201008173416.png
Jak się zapewne domyślacie jest to nic innego jak pomoc, której tekst jest umieszczony w 2gim sektorze dysku.

1
Manna5 napisał(a):

(choć UmbrellaOS nie ma z systemem Marka Zbikowsiego nic wspólnego):

Swoją drogą to ciekawe że w 2020 wszystkie pliki .exe i .dll w windowsie nadal zaczynają się jego inicjałami a jego nazwisko nie jest szczególnie znane.
Co do projektu to rozumiem że masz dużo frajdy i się dużo przy nim uczysz, ale myślę że zdajesz sobie sprawę że nikt go nigdy nie zainstaluje i nie użyje (nie dałeś chyba nawet linka żeby to umożliwić), więc nie musisz opisywać tak dokładnie instrukcji jego użytkowania. Jak chcesz się pochwalić to możesz napisać tylko co już system potrafi.

edit:
hah - sprawdziłem i jego inicjały MZ oraz tekst "This program cannot be run in DOS mode." przedostały się oczywiście nawet do web assembly w blazorze (demo https://blazor-demo.github.io/ ). To już nadaje się do programistycznych WTF jak dalece może zajść :)

2
Manna5 napisał(a):

I oto jest UmbrellaOS

Próbowałeś to odpalić na fizycznym komputrze, bez emulacji? :-)

kilka wyzwań:

  • obsłużyć ładowanie reszty OSa z jakiegoś prostego filesystemu (FAT12/FAT16/FAT32 albo nawet exFAT) żeby móc cokolwiek więcej załadować i mieć wszystko (poza bootloaderem) w normalnych plikach
  • odpalić tryb chroniony
  • napisać diagnostycznego "bluescreena" (będzie bardzo potrzebny żeby widzieć co się stało, a nie tylko zwiecha lub reset przy każdym wyjątku)
  • przerwanie BIOSu odpalać z wykorzystaniem v86 (i w miarę postępów, uniezależniać się od BIOSu)
2

System plików.. jest
screenshot-20201012144245.png
Każdy system operacyjny, nawet amatorskie dzieło jedenastolatka, potrzebuje systemu plików. Na zrzucie ekranu widać listę plików wypisaną poleceniem list (zamierzam zmienić je wkrótce na dir jak w CP/M i DOSie). UmbrellaFS cechuje brak katalogów, ale za to nazwy plików mogą być bardzo długie, bo są definiowane dynamicznie. Na razie jest to RAM-dysk, ale planuję dodać obsługę plików zapisanych na dyskach. Plik 2nd_file.bmp ma rozszerzenie wskazujące na to, że jest obrazkiem, ale UmbrellaOS obrazków nie obsługuje (jakby ktoś się błędnie domyślił).

0

Pracuję nad nowymi operacjami na systemie plików, teraz type
screenshot-20201014194321.png
No, teraz a właściwie trochę później będziemy mieli polecenie type. Jescze jednak nad tym pracuję. Aktualnie jest to polecenie wywoływane bez parametrów i wypisuje wszystkie dostępne pliki. Docelowo ma działać dokładnie tak jak na CPM/DOS ale bez wildcardów.

1

Fajnie, może załóż jakiegoś bloga czy jak to się tam teraz nazywa i tam się chwal postępami, chętni na pewno będą śledzić.
Zastanawia mnie - ile potrzeba pracy żeby taki własny system mógł uruchomić prostą aplikację typu hello world, ale skompilowaną w języku wyższego poziomu, np w takim C? (kompilowaną z zewnątrz, nie na tym samym systemie)

0
obscurity napisał(a):

Fajnie, może załóż jakiegoś bloga czy jak to się tam teraz nazywa i tam się chwal postępami, chętni na pewno będą śledzić.

Zastanawia mnie - ile potrzeba pracy żeby taki własny system mógł uruchomić prostą aplikację typu hello world, ale skompilowaną w języku wyższego poziomu, np w takim C? (kompilowaną z zewnątrz, nie na tym samym systemie)

Trzeba by obsłużyć jakiś popularny format exeka (jak ELF pod Linuxem czy PE pod Windowsem) i napisać loader (przynajmniej uproszczony, by z poziomu asm załadować pierwszy plik).
Do tego potrzebny byłby support ze strony kompilatora. Więc potrzebny jest kompilator który wygeneruje taki exek ale bez zależności od konkretnego systemu (Linux, Windows) które to zależności trzeba najpierw wykastrować, powoli zastępując własnym runtime'em zależnym od kernela naszego systemu...

Nikt nie mówił że pisanie OSa jest łatwe.

0

A teraz, możemy doprecyzować, zawartość którego pliku chcesz wypisać
screenshot-20201015171746.png
Oczywiście, na razie określamy plik za pomocą identyfikatora, nie nazwy (jak w BSCS), docelowo ma być za pomocą nazwy. W formie pośredniej polecenie type już działa prawidłowo. Poza tym, w międzyczasie czas na małe omówienie systemu plików UmbrellaFS. Jest on w gruncie rzeczy bardzo prosty. Oto jego struktura:
-Na początku dysku jest bajt oznaczający liczbę plików na dysku (jak wynika z ograniczeń ośmiu bitów, możesz mieć maksymalnie 255 plików)
-Dla każdego pliku:
-Nazwa (ASCII), null-terminated
-Treść pliku
-Znak ASCII RS - Record Separator (zastanawiam się cały czas nad zmianą na FS - File separator), dziesiętnie 30
-Na końcu znak ASCII GS - Group Separator, dziesiętnie 29
Na pierwszy rzut oka wydaje się trudny w operowaniu na nim, lecz w rzeczywistości jest to jakoś możliwe.

0
Azarien napisał(a):

Trzeba by obsłużyć jakiś popularny format exeka (jak ELF pod Linuxem czy PE pod Windowsem) i napisać loader (przynajmniej uproszczony, by z poziomu asm załadować pierwszy plik).
Do tego potrzebny byłby support ze strony kompilatora. Więc potrzebny jest kompilator który wygeneruje taki exek ale bez zależności od konkretnego systemu (Linux, Windows) które to zależności trzeba najpierw wykastrować, powoli zastępując własnym runtime'em zależnym od kernela naszego systemu...

Nikt nie mówił że pisanie OSa jest łatwe.

Myślałem o jakimś prostszym sposobie i własnym formacie execa, jeśli to ma być naprawdę osobny system to czemu ma używać formatu windowsa czy linuksa - no chyba że to wyderOS i będzie obsługiwał wszystkie natywnie, ale wtedy pewnie siostra by musiała pomóc.

Miałem na myśli coś w stylu kompilacji w normalnym kompilatorze i transpilacji - wyjęcie sekcji skompilowanego kodu i danych i poprawienie offsetów w adresach i podmiana zależności do systemu (dla hello worlda nie powinno być tego aż tak wiele?) - wydaje mi się to prostsze i realnie wykonalne w pojedynkę, dlatego pytam czy się tak da czy są jakieś przeszkody o których nie wiem. Wskoczenie na wyższy poziom by przyspieszyło tworzenie takich poleceń jak "type" i szybciej by można było dojść do jakichś ciekawych rezultatów

0

A może.. dodałbym przerwanie UmbrellaOSa
Niedawno wpadłem na pomysł, że być może dodam do UmbrellaOS'a moje własne przerwanie, int 40h. Proszę jednak o informację co było by lepsze dla osoby piszącej aplikacę UmbrellaOSową - przerwanie 40h 55h czy po prostu wywoływanie funkcji API po adresach. Co o tym myślicie?

1

Mamy już możliwość wskazywania plików po nazwach
screenshot-20201019164037.png
Teraz to wygląda trochę lepiej, składnia komendy type jest teraz identyczna jak w CP/M (tylko bez wildcardów). Skopiuję jeszcze kod wyszukujący plik po nazwie z polecenia type tworząc nową komendę, call - do uruchamiania programów. Assembler na początku potrafi zniechęcać, ale potem nie jest to takie trudne.

1

A oto pierwsza aplikacja UmbrellaOS
umbrellaos_apprunner.png
Nie wiedziałem, że uda mi się to zrobić tak szybko. Kod źródłowy przykładowej aplikacji:

db "JM"
mov ecx,@f
call puts
ret
@@:
db "Hello!",0
2

Nowa aktualizacja, przerwanie UmbrellaOS'a int 55h już działa!
Tym razem nie ma screenshota do pokazania, bo z punktu widzenia użytkownika wszystko wygląda tak samo. Zmienia się jednak kod przykładowego programu hello.com:

db "JM"
mov ecx,@f
mov ah,3
int 55h
ret
@@:
db "Hello!",0

Oczywiście, można po prostu wywoływać procedury systemowe bezpośrednio, ale z przerwaniem kod jest krótszy (2 bajty na przerwanie zamiast pięciu na wywołanie procedury po 32bitowym adresie). Lista dostępnych funkcji przerwania w UmbrellaOS:

mov ah,1
mov al,<kod_ascii_znaku>
int 55h ;wypisz jeden znak
mov ah,2
int 55h ;pobierz znak z klawiatury do AL
mov ah,3
mov ecx,<adres_tekstu_null_terminated>
int 55h ;wypisz tekst na konsolę
mov ah,4
mov ecx,<adres_buforu>
int 55h ;wpisanie tekstu z klawiatury do naciśnięcia klawisza o kodzie 13 (najczęściej Enter)
mov ah,5
int 55h ;restart komputera, to samo co int 19h

Wybrałem 55h dlatego, że 5 to moja ulubiona cyfra, LOL. Druga rzecz, którą zmieniłem to optymalizacja - do tego momentu kod wyszukujący plik był po prostu skopiowany z kodu polecenia type do polecenia call, teraz jest zawarty w osobnej procedurze.

0

Kolejny "dwupak" aktualizacji UmbrellaOS'a
screenshot-20201030105137.png
Tym razem aktualizacje też są dwie. Pierwsza, łatwo zauważalna to kontrola hasła (na razie nie można go zmieniać). Druga, którą też na screenshocie zobaczyć można, ale mniej rzuca się w oczy jest mała restrukturyzacja wiersza poleceń. To najlepiej zaprezentować graficznie:
screenshot-20201030113017.png
UWAGA: Tak naprawdę zamknięcie powłoki głównej nie skutkuje bezpośrednio resetem, ale wraca do kontrolera hasła, który automatycznie uznaje, ze użytkownik chce zakończyć pracę z systemem i resetuje komputer.
Na zrzucie ekranu na początku uruchomiłem program, który najpierw pyta mnie o imię, potem przechodzi na drugi plan i uruchamia powłokę (testowo uruchamiam tam polecenie echo hi), którą zamykam, a aplikacja nadal przechowuje moje imię i dopiero teraz mnie wita. Następnie ręcznie uruchamiam podpowłokę poleceniem sbcp (mnemonik SuBCommandPrompt), wykonuję testowe polecenie i wracam na poziom główny poleceniem exit. Jeśli wpisałbym i zatwierdził exit drugi raz, maszyna wirtualna zostałamy zresetowana, ale na screenshocie nie byłoby tego widać. Wcześniej nie było w ogóle żadnego stosu powłok, wiersz poleceń był tylko jeden.

0

A teraz obsługa backspace i powtarzania poleceń
screenshot-20201031123406.png
Pisząc funkcję wczytywania ciągów znaków z klawiatury, łatwo zapomnieć o możliwości usunięcia ostatnio wpisanego znaku klawiszem Backspace. UmbrellaOS do tej aktualizacji na to nie pozwalał, lecz teraz już tak. Inną rzeczą, której brakowało mi podczas debugowania linii poleceń UmbrellaOS, było powtarzanie poleceń, jak w wierszu poleceń Windows strzałką w górę. I tą możliwość dziś dodałem, ale do powtarzania poleceń zamiast strzałki w górę wybrałem ESC. Trzecia zmiana to informacja o błędnym poleceniu - wcześniej nierozpoznane komendy były ignorowane.

2

do powtarzania poleceń zamiast strzałki w górę wybrałem ESC

Nie uważasz, że może to być nieco mylące?

W zasadzie wszystkie inne systemy operacyjne implementują ESC jako przerwanie obecnej operacji, zamknięcie aplikacji itd., a nie powtórzenie poprzednio wykonanej operacji.

1

Zgodnie z uwagą @Patryk27 ustawiłem ESC jako zamknięcie aplikacji, a do powtarzania polecenia będzie odtąd służyć strzałka w górę, tak jak w DOSie. Jest też oczywiście opcja nie reagowania na ESC (domyślnie wyłączona), używa jej kontroler hasła.

2

UmbrellaOS wypisuje aktualny stan rejestrów
screenshot-20210211121512.png
Chciałbym poinformować, że w związku z tym, że UmbrellaOS miał już dużą funkcjonalność, kod wyglądał jednak brzydko, przez co zdecydowałem się napisać go od nowa. W nowej odsłonie systemu zacząłem właśnie od tej czynności.

0

A także pamięci
screenshot-20210211131951.png

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