Click here to Skip to main content
15,867,308 members
Articles / Programming Languages / C#

Cosmos - C# Open Source Managed Operating System

Rate me:
Please Sign up or sign in to vote.
4.99/5 (187 votes)
23 Jul 2014CPOL7 min read 332.6K   324   102
Build your own OS in Visual Studio and C#.

Cosmos?

Cosmos is an acronym for C# Open Source Managed Operating System. Despite C# being in the name, VB.NET, Fortran, and any .NET language can be used. We chose the C# title because our work is done in C#, and because VBOSMOS sounds stupid.

Cosmos is not an Operating System in the traditional sense, but instead, it is an "Operating System Kit", or as I like to say "Operating System Legos", that allows you to create your own Operating System. However, having been down this path before, we wanted to make it easy to use and build. Most users can write and boot their own Operating System in just a few minutes, and using Visual Studio.

Cosmos lets Visual Studio compile your code to IL and then Cosmos compiles the IL into machine code.

Status

This article was originally written in 2008. Cosmos has come a long way since then and many of the screens, especially the build process, look significantly different now. If you like what you see here, I strongly suggest you check out the more recent builds as we have made a lot of progress since then.

Dev Kit or User Kit?

Cosmos comes in two flavors, a user kit and a dev kit. The user kit hides the kernel source away from the user, and presents a new project type in File, New. Building a new Operating System is as simple as File, New, writing a few lines of code, and pressing F5 to build and run it. The user kit is a bit old though, and is really only designed to interest people in obtaining the dev kit.

The dev kit is available as a project on CodePlex, and the Cosmos website is www.GoCosmos.org..

Dev Kit

To get the dev kit, simply sync the sources from the CodePlex project. It might appear daunting at first, 43 projects? A lot of these projects are demos, tests, and playgrounds.

Note that Visual Studio Express cannot handle the solution folders. Because of this, Express users should use the Flat solution file, but first, you must update the Flat solution file from the main solution using the Flat file updater utility.

Image 1

In the Boot folder, and then the Demo folder, you will see a CosmosBoot project. This is the empty shell used in the user kit for the new project template. This is the minimal Operating System that Cosmos can build. You can copy this file and change it to your needs. Let's take a quick look.

Image 2

Properties and References are standard parts of any .NET project. Let's look in Program.cs.

Note on images: CodeProject limits images to 600 pixels in width. I've chosen to crop the width to retain readability.

Image 3

Init is the entry point that will be called after the system is booted. This is where you put your code. Some sample code has been generated already, and you can change it. Be sure to leave the first two lines alone, they initialize memory, hardware, etc.

Let's take a look at something a little more complex though. Here is a demo called Guess. It is a simple application which asks the user to guess a number. As you can see, it is all standard C# code, and aside from the first two lines for booting, the code can function unchanged on Windows.

Image 4

Now, let's run it. Are you expecting some complicated process involving batch files and CD-R's? If so, you will be disappointed. Simply press F5 in Visual Studio to run it. Instead of the project running immediately, you will see a Cosmos Builder Options window.

Image 5

The builder supports many environments including physical hardware. Virtual Machines are easier to develop against, and are certainly easier to take screenshots of, so I will use VMWare for this article.

With these options set, I clicked the Build button (the Enter key also proceeds). Next, a build progress window will appear. Cosmos is now compiling the IL to machine code, linking and preparing the boot image.

Image 6

When this is done, the window will disappear, and VMWare will automatically be launched with an ISO mounted.

Image 7

Select "Power on this virtual machine", and the Guess demo will boot.

Image 8

This is the demo, booted directly to hardware. There is no need for Windows, Linux, or any other Operating System to run this code. During the boot process, you may notice SysLinux. The SysLinux however is not a Linux distribution, but instead, just a boot loader used to read files from the disk. We use SysLinux instead of Grub because it has support for PXE and other options. SysLinux is only used for the initial loading of the Cosmos binaries, and as soon as Cosmos is loaded, SysLinux is unloaded, and is not used to run Cosmos code.

Graphics, Network, File Systems

Ease of use, or what I like to call "Nail the basics", is a priority for us. However, graphics and other things will follow in the future. Currently, we are working on a wide range of file systems including FAT and ext2. We are also working on Ethernet support, and can already send basic UDP packets, and are working on TCP support as well.

Debugging

Debugging Operating Systems is typically inconvenient and hinders progress. Because of this, just as we did with making the build and boot process, we strived to make the debugging process easy. The debugger is still a work in progress, but is already quite advanced for an Operating System debugger.

Image 9

Adding the Cosmos.Debug namespace gives the code access to communicate directly with the debugger.

Image 10

In the Guess demo, I am adding a Debugger.Send, which will write a debug string to the debugger. This can be used to track code execution, but can also be used for watching variables. In this case, I will use it to write out the magic number.

Image 11

Notice I have also added a Debugger.Break. This will force the program to execute a breakpoint at that location.

Now, let's run the Guess again. Which demo is booted is selected in Visual Studio simply by selecting it as the startup project for the solution.

Image 12

This time in debugger options, Source and User Only is selected. Source tells the debugger to debug C# code, rather than the lower level IL. And, User Only tells the debugger not to trace into the Cosmos Kernel or the .NET libraries. This speeds up execution, but also lets me focus on tracing just the demo code.

Image 13

Note that this time it did prompt us for the number? This is because it hit the breakpoint. Another window will appear as well, this is the Cosmos Debugger.

Image 14

The message and breakpoint are displayed in the trace log, and the code is selected for the breakpoint. Breakpoints occur on the next statement after the requested break.

Now, we can use the Step button (F11, just like Visual Studio) to step through the code. Each step is recorded in the trace log, and previous items can be selected to walk backwards through the code. The trace log functions similar to the call stack window in Visual Studio.

Image 15

Press continue (F5), and the code will run again until a breakpoint is encountered in the code, or requested from the debugger. After Continue, a new button will appear that allows a forced instant break. After Continue, the code will continue, and we will be prompted for the number.

Image 16

We can also turn tracing on and off for specific sections of code, using the Cosmos.Debug namespace.

Image 17

This will cause the trace log to be populated with all the statement executions between the TraceOn and TraceOff, without needing to step through each statement manually.

Image 18

This time Cosmos & User is selected to show more details in the trace log. Normally, this option is only needed by developers working on the Cosmos kernel source.

Image 19

Conclusion

Cosmos is an open source project, as included as part of its name. I hope this article gives an easy to understand introduction. If you are interested in Operating System development, I hope you will try Cosmos!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Cyprus Cyprus
Chad Z. Hower, a.k.a. Kudzu
"Programming is an art form that fights back"

I am a former Microsoft Regional DPE (MEA) covering 85 countries, former Microsoft Regional Director, and 10 Year Microsoft MVP.

I have lived in Bulgaria, Canada, Cyprus, Switzerland, France, Jordan, Russia, Turkey, The Caribbean, and USA.

Creator of Indy, IntraWeb, COSMOS, X#, CrossTalk, and more.

Comments and Discussions

 
GeneralMy vote of 5 Pin
royal-roi-leroy11-Jun-16 3:39
royal-roi-leroy11-Jun-16 3:39 
GeneralRe: My vote of 5 Pin
Chad Z. Hower aka Kudzu11-Jun-16 4:43
Chad Z. Hower aka Kudzu11-Jun-16 4:43 
QuestionCosmos on a bare metal device? Pin
Austin Mullins24-Jul-14 8:42
Austin Mullins24-Jul-14 8:42 
This project is intriguing, as it opens possibilities for porting .NET libraries and practices to minimal environments. My question is, how minimal can you get with Cosmos? Is there a subset of the framework that will compile for bare-metal embedded devices (e.g. ARM cores)? What are the true, minimal hardware requirements?
AnswerRe: Cosmos on a bare metal device? Pin
Chad Z. Hower aka Kudzu25-Jul-14 7:00
Chad Z. Hower aka Kudzu25-Jul-14 7:00 
GeneralMy vote of 5 Pin
Member 1022385427-Feb-14 5:24
Member 1022385427-Feb-14 5:24 
GeneralRe: My vote of 5 Pin
alexissizla11-Jun-16 21:35
alexissizla11-Jun-16 21:35 
GeneralMy vote of 4 Pin
Mic8-Aug-13 12:27
Mic8-Aug-13 12:27 
GeneralMy vote of 5 Pin
Gun Gun Febrianza7-Jun-13 18:43
Gun Gun Febrianza7-Jun-13 18:43 
GeneralMy vote of 5 Pin
CS140118-Oct-11 20:57
CS140118-Oct-11 20:57 
GeneralMy vote of 5 Pin
Filip D'haene31-May-11 4:46
Filip D'haene31-May-11 4:46 
GeneralMy vote of 5 Pin
xComaWhitex14-Jan-11 23:17
xComaWhitex14-Jan-11 23:17 
GeneralNew updated release and article! Pin
Chad Z. Hower aka Kudzu6-Aug-10 15:53
Chad Z. Hower aka Kudzu6-Aug-10 15:53 
QuestionError Pin
WildN00b22-Jul-10 1:32
WildN00b22-Jul-10 1:32 
AnswerRe: Error Pin
Matthijs ter Woord22-Jul-10 1:53
Matthijs ter Woord22-Jul-10 1:53 
GeneralCosmos.Compiler.Builder Pin
joe10429-May-10 22:43
joe10429-May-10 22:43 
GeneralRe: Cosmos.Compiler.Builder Pin
Chad Z. Hower aka Kudzu31-May-10 9:20
Chad Z. Hower aka Kudzu31-May-10 9:20 
GeneralReading / Writing to disk Pin
xlar5414-Apr-10 20:01
xlar5414-Apr-10 20:01 
GeneralRe: Reading / Writing to disk Pin
Chad Z. Hower aka Kudzu18-Apr-10 14:05
Chad Z. Hower aka Kudzu18-Apr-10 14:05 
GeneralError Pin
Thomas de Roo7-Mar-10 9:24
Thomas de Roo7-Mar-10 9:24 
GeneralRe: Error Pin
Chad Z. Hower aka Kudzu14-Mar-10 8:25
Chad Z. Hower aka Kudzu14-Mar-10 8:25 
QuestionShow Image Pin
Rex 12411-Mar-10 7:42
Rex 12411-Mar-10 7:42 
AnswerRe: Show Image Pin
ben.Kloosterman1-Mar-10 12:48
ben.Kloosterman1-Mar-10 12:48 
AnswerRe: Show Image Pin
bader115-Mar-10 12:30
bader115-Mar-10 12:30 
GeneralFiles Pin
MatheusMK313-Feb-10 11:59
MatheusMK313-Feb-10 11:59 
GeneralRe: Files Pin
Thomas de Roo7-Mar-10 8:48
Thomas de Roo7-Mar-10 8:48 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.