Moja nowa obsesja '.NET OS'

29 Maja 2017

Bez pomysłów nie ma innowacji. Niektóre pomysły są lepsze, niektóre gorsze, jedne proste, inne skomplikowane i czasochłonne. Od jakiegoś czasu nachodzi mnie pomysł napisania systemu operacyjnego, który opisuję poniżej.

Zacznę od tego, że zdaję sobie sprawę jak ciężko jest napisać od podstaw system operacyjny. Trochę mnie to smuci, ale kluczem jest też wykombinowanie jak najprościej stworzyć coś ciekawego.

Ale zacznę od początku. Istnieje coś takiego jak C# Open Source Managed Operating System (w skrócie Cosmos). Dzięki projektowi IL2CPU można przetranspilować bibliotekę napisaną pod .NET CLR do kodu maszynowego. Dzięki temu można napisać swój własny system operacyjny w dotnecie. Jest to mega pomysł i chcę tego użyć, aby nie pisać systemu operacyjnego w C/C++.

Wiadomo, że napisanie systemu zajmuje bardzo dużo czasu i nie jest proste, bo dotyka zarządzania pamięcią, procesami, wątkami, systemem plików, zegarem, komunikacją sieciową, itp, itd.

Do tego chcę aby ten system miał jeszcze jedną cechę. Uruchamiał programy napisane w dotnecie. Czyli, żeby działała na nim jakaś wersja CLR. I tu się pojawiają straszne schody.

Dzięki temu, że Microsoft pracuje nad CoreCLR i jest ma on otwarty kod żródłowy, można próbować kilka rzeczy:

  1. Przepisać CLR na .NET - to jest chyba strzał w stopę. Ściągnąwszy repo, odpaliłem cat $(find . -type f | grep .cpp) | wc -l, żeby zliczyć linie kodu źródłowego w C++. I wyszło ponad 1,5 miliona.
  2. Napisać swoją bibliotekę standardową C zgodną ze stworzonym systemem operacyjnym i napisać swój kompilator C/C++ i spróbować skompilować CoreCLR - to wydaje mi się mało możliwe.
  3. Napisać mój OS tak aby był komptybilny z Linuxem - móc uruchomić na nim skompilowany pod Linuxem CoreCLR
  4. Porzucić pomysł pisania swojego systemu operacyjnego na niskim poziomie, wziąć jakiś mały *NIX i napisać tylko część udostępnioną dla użytkownika - to wydaje się najbardziej do zrobienia

Tak czy inaczej, jest to niemała zagwozdka. W wakacje będę miał nieco więcej czasu i może coś w kierunku tego zrobię.

Generalnie abstrachując od faktycznej implementacji problemu, chcę uzyskać coś takiego

    .NET applications
-------------------------
       .NET shell 
-------------------------
      .NET Runtime
-------------------------
      Process Manager
-------------------------
     Operating System

Wszystkie aplikacje z jakimi będzie się stykał użytkownik byłyby napisane w dotnecie. Process Manager byłby dostępny z jakiegoś wywołania systemowego i pozwalał na inicjalizację nowego procesu CLR i ładowania aplikacji, przełączanie aplikacji w dostępie do procesora i ich zabijanie. Użytkownik korzystał by z powłoki np. Powershell i uruchamiał swoje aplikacje dotnetowe.

Jeśli byłoby to możliwe, to również sporym osiągnięciem byłoby ułatwienie komunikacji między procesowej, z których każdy działa w oparciu o dotnet.

Użycie Powershella mogłoby np. pozwolić aby aplikacje nie dostawały w Main() argumentów w postaci stringów, a faktycznych obiektów. Choć wsparcie tego pewnie musiałoby się również znaleźć w Runtimie.

W każdym razie jest to jakiś pomysł. Zanim będę w stanie zacząć nad nim pracować muszę się jeszcze dużo nauczyć. Ale do tej pory będzie mnie co jakiś czas nachodził i gnębił. W sumie spędziłem dziś jakieś 4 godziny nad tym tematem, po czym stwierdziłem, że moje dotychczasowe plany są zbyt nieosiągalne i powinienem wykombinować coś innego.

Trochę przypomina mi to historię z poprzednim dużym pomysłem.