Introduction - about
back
Welcome to the pages of BlueIllusion OS.
BlueIllusion is a micro kernel based operating system, which operates on the Intel X86
Architecture. It uses some features like paging to some excess to get work done. Other
things like TSS-based Hardware task switching aren't used. See the HowTo linked at the
bottom of this page to learn, how multitasking can be done and how it is done in
BlueIllusion. It will - in the future - have a graphical user environment, which I intend
to be analogous to the MAC OS 9 GUI, with a Menu bar that appears when moving the mouse
to the upper border of the screen - as well as support for a right-click-popup menu under
the mouse at needs.
Features
- Grub as bootloader
- protected mode
- stack based software multitasking
- multithreading
- multi level scheduling of task control blocks
- async. messagepassing
- semaphores
- shared memory,memory mapped files
- signals/events - the events are a separate subsystem, capable of sending small
messages to any process/thread, which has registered an event handler for the event queue
- this gonna be revised
- keyboard,mouse,floppy,ATA/ATAPI driver(thanks to Andy McLaughlin!)
- PCI
- supports VBE 2.0 - 8,16,24,32 bit linear framebuffer
- filesystem access: iso9660,ext2 --> open,close,read,write;ls,cd [dir]
- multithreaded filesystem service
- pipes
- Virtual File System Layer
- fork,exec,exit,create_proc system calls to create/delete processes & load executables
- create_thread(),exit_thread() to create/delete threads. No allocation of heap space for thread stacks. It's done in the kernel.
- command line arguments (argc,argv)
- advanced and object oriented GUI implementation
- UI event subsystem and UI library
- TCP/IP Protocol Suite & Sockets Layer & Lance NIC Driver
what's required to run it:
- Ix86 Architecture - Standard PC
- 64 MB RAM
- Floppy Drive
- VESA VBE 2.0 capable video card for GUI mode
- Keyboard, Mouse
Available Applications:
- init.bin - the first user process - launched by the kernel
- shell.bin - the main interaction tool - launched by init
- calc - a small command line tool to perform calculations
- help - A tool which prints out a nifty help text - will be enhanced
- more - displays the content of a file on screen
- ps - print the table of processes
- ls - prints the contents of a directory - has some nifty flags
- rm - remove a given file
- rmdir - get rid of a directory
- mkdir - create a directory
- kill - either send a signal to a process or remove it directly
- argvtest - a tool to test command line arguments
- semtest - a tool to test BlueIllusion Semaphores
- launcher - that's the user part of the BlueIllusion GUI
- rechner - a small calculator
- guistarter.bin - the stub process for console applications
- devconf - views all the devices present on the system
- guitest - basically that's a draw application
- gtop - a version of top - guified - to kill processes/threads
- hangman - this is a small hangman game
- edit - a small text editor
- touch - the unix like touch-command: create a file if it's not present
- cp - simple copy program - nothing recursive yet
- killall - kill all the instances of a program
- yes - spills the word yes or any string to the standard output stream
- test - performs boolean tests on arithmetic expressions and file queries
- echo - spills to standard output what is passed as command line argument
- tee - outputs anything coming from stdin to stdout and to every indicated file
- true - returns 1 to the calling process
- false - returns 0 to the calling process
- ln - creates a hard link to a given file provided target & link are in the same file system.
- showimage - loads a bmp image and displays it on screen.
- background - loads a bmp image and sets it as the system background. Will be enhanced to serve as the global UI settings manager.
- mount - mounts a device to a given mountpoint in the VFS tree.
- unmount - removes a given filesystem from the VFS tree.
- cdrom - useful to issue commands like open door, close door etc. to the cdrom drive.
- lsdev - lists all devices registered with the os.
- useradd - adds a user to the user database
- userdel - removes a user from the user database
- userlist - lists all users in the user database
- userman - the GUI application responsible managing the user database
- pointer - a small program for the gui - to load a pointer image
- pipetest - this thing is for testing the pipes subsystem. It's fairly simple.
- mknode - creates a named node in the pipes subsystem
- rmnode - removes a named node from the pipes subsystem
- date - shows the current date and time on cmdline
- clock - displays a clock in gui mode
- login - user login.
- logout - closes all processes launched by the user in question.
- glogin - graphical user login. Is only available in GUI mode.
- splashscreen - just displays a nice picture on screen. exits on receipt of signal 31
- mpgplay - just plays a movie - no sound yet!
- mv - in development
- toe - in development
- grep - in development - most prolly a port of gnu grep
Graphical User Interface - current and future state:
- Server managed offscreen bitmap
- Server managed windows: the server knows how to draw widgets and windows
- Server managed clipping: the server performs the clipping upon drawing a window to the offscreen bitmap, ere it blits the affected region to the linear framebuffer
- client side drawing: the client gets a client area where to draw on, alongside with the offscreen buffer mapped in as shared memory. It also gets a set of clips, which is to be iterated on each pixel the client want to set. If pixel is in no clip area, it can't be set. Implemented and works. present controls: ui_client_control and ui_textarea, which extends ui_client_control.
- client side drawing of window client area and widgets --> in development
- client side clipping: for each pixel, the list of clips for window in which the pixel is to be set, shall be queried. kinda function: bool in_valid_area(x,y). Client side clipping. --> in development.
- serverside widgets: single line edit, text edit, text, menubar, menu, menuitem, listbox, checkbox, radiobutton, scrollbar (horizontal, vertical), icon, canvas (doodle control), close button, iconify button, title bar, amm. the menubar and the menu are actually containers.
- serverside containers: tab page container (for tabbed organizations of widgets inside a window - very handy), grid layout container (for ordered layout of controls - they are placed automatically inside a calculated grid which the grid layout calculates.
- client side application for main communication with server and the management of iconified and other windows (one can bring each and every window to top with that application) - and for launching applications: the launcher. It's like the task bar of windows or Apple's finder.
- clipped drawing primitives.
actual development on kernel parts
- fs service: creating VFS-Drivers for device FS
- gui service going multithreaded
- adding widgets to the GUI
- enhancing process service to feature UID/GID and to communicate them with FS Service
- tcp/ip protocol suite is in development stage. Currently Debugging & Feature adding: Fetch_Raw_Packet interface. Routing Table as Radix Tree. Packet Filtering. Drivers.
- PCI-subsystem is in development/planning stage - enumeration already
present
known bugs
- Keyboard mapping not complete
- block cache not yet suitable for mmap/mumap. Need more flexible mechanisms
- the textEdit control has some slight issues with the placement of characters. If
scrolling, it displaces the first character of the last line. Surely this is due to some
faulty logic inside the draw() function of this control. Further it isn't suitable for shell stuff.
TODO:
- semaphores: on exit, system task should also scan the semaphores whether the task
is waiting for some ressourse - and remove it. We don't want dead tasks hang around. To
have this be handled easier: introduce new field in the TCB: sem_t *sem: the semaphor the
process is waiting on.No searches,just removing. Easy stuff.
- semaphores: implement the loop for execution of a set of operations as well as
the tester which tells whether the set of operation on the set of semaphores will go good
- done, yet to be tested!
- semaphores: implement the init on creation feature I 've planned. It is no
good to have creation and initialization be two separate calls. Going the - providing a
feature - way, I'll make the whole thing more flexible and it's the programmers choice
whether to init the set of semaphors upon creation or afterwards.
- signals: a component of the micro kernel task control management - to redirect the
current stream of control to a signal handler registered by the task/process.- partially
done, but functional!
- make the gui run with the new design of IO streams - partially done, needs
debugging -> That's removed completely. Pipes is the way to go.
I tend to put quite some things directly into the micro kernel for I don't consider them
to be executeable with performance by a service. Especially the signals handling I put in
the micro kernel as a whole to avoid needless context switches to the mm service. Just
give them an extra call via the newly introduced system call interface - which I've
designed for exactly this use: semaphores, signals.
Something to be fleshed out toroughly is the design of a suitable communication scheme
between libUI and GUI service. I'm gonna have a mixed approach: shared memory/pipes for
direct drawing on so called canvas controls and named controls loaded and drawn by GUI
service. Images shall be loaded by application and transferred to the gui service via
Pipe. Gonna think about it a bit more.
Recently, I've brought PCI support to BlueIllusion. What is still to be done: Power
up/Power Down of a given Device, Sharing of IRQ-Lines - This requires a special treatment
of the interrupt requests by the ISR: Something like: Am I responsible for the device
firing this IRQ? No? Next ISR. This means to walk throu a chain of ISR's until the
responsible one is found - or a global ISR is called at the end.
TCP/IP is implemented & ready for debugging. a few subprotocols are still missing (ARP/ICMP/UDP), and drivers are yet to be developped, but these aren't so much of work as what's already achieved I reckon. I've already performed the tcp open/close connection stuff via LoopBack Device. Looks like it is working. because the accept() call returns a valid socket descriptor (which is an integer, like the fd which FS service returns)
Feel free to download BlueIllusion from the Downloads Section.I 'm glad for every
feedback or critics.
Current Version in development: BlueIllusion 0.08 15072007
last modified: 15.07.2007
back