Joined: Wed Sep 29, 2010 9:19 am Posts: 22 Location: Almeria, Spain
|
Hi! I'm back again after being very busy at work... Wow! This thread has turned into a very interesting discussion! And it's most welcome -- each one has his own set of goals and opinions (all of them respectable, of course) and I think it's always good to listen to everyone's ideas and points of view, in order to check whether my decisions remain valid or should be given a second thought... It's now hard to quote every interesting comment here... but I'll make some generic comments anyway, in no particular order: - My real desire is to build (and design) several, fairly heterogeneous computers, thus I need some kind of abstraction (hardware independence) in order to hopefully reduce the effort of writing software for them. Certainly, abstraction adds complexity and impairs performance, thus a reasonable balance must be found.
- I'm a firm believer on 90% solutions: by setting my goals a bit lower, effort and complexity might be greatly reduced. But if one tries to get the full functionality/flexibility of a "current" OS, things will get awfully complicated, well beyond the capabilities of a human being, even a bunch of them.
- I like GUIs, I've been using them from 1987 (Atari ST, then since 1995 with MacOS). I haven't used a CLI since then... well, not quite: after switching very unwillingly to OS X in 2005, I had to use that bash thing So my ultimate goal is to implement at least a rudimentary GUI, while keeping compatibility with previously written unaware, console-type applications.
- I was taught in college that an OS was, among other things, "an organic set of routines". It seems that a collection of useful routines is always a nice thing, but what does make it into a full-fledged OS? Hard to tell, I'm afraid...
- Also, in my platform (at least in the current state of things) there isn't a clear separation between firmware, kernel, OS, even applications. I don't mind putting a "whole" OS into ROM, or if I limit the firmware to the initial hardware test and booting the desired OS from a mass storage device into RAM. I'm more interested in a sort of logic modularity -- the ability to combine the set of desired kernel functions, device drivers, etc for the required system.
- I understand that for some uses (control devices, etc) maximum efficiency is needed, thus a versatile, abstract OS won't do -- direct hardware access would be the key then. But even if the driver architecture I implemented (a last-minute addition, I admit ) allows programming with no knowledge at all about the actual device (for no direct access is needed), the OS itself doesn't prevent direct access if needed -- obviously, the advantage of device-independence is lost then. See next point for an exception:
- As a proof of concept, I designed some protecting hardware which causes exception-like calls in case of direct I/O access, "illegal" instructions and the like. But such hardware is optional and, anyway, my current API provides a mechanism for direct hardware access (although slow). If speed is a concern, that mechanism could be used for disabling the protection hardware, if installed, and then do freely whatever is requiered.
- FORTH is quite interesting as a programming language, both for efficiency and ease of implementation. But I prefer letting it as a developer application running into the environment, than being the main interface between apps and hardware. Could be used as well as a shell interface for the underlying OS although I'm not very fond of CLIs... but definitely will be useful during the development of the GUI I made a stub of a debugger (which IMHO is the main justification for a CLI) in a similar RPN fashion, indeed.
- While cooperative multitasking is OK and in a way makes some things easier, there's also a catch: it works too as an application quality metric. If the app doesn't yield CPU to other processes in a regular and timely fashion, system responsiveness will suffer greatly My idea was to implement preemptive multitasking which isn't hard to set up, but needs to take care about some issues: particularly, reentrancy. While my system calls are (or will be) reentrant, I'm afraid that my current device drivers aren't At this present, early stage, no form of multitasking is implemented; but this will change soon, and some drivers should be revised. While some access control mechanisms might be implemented, a workaround is disabling interrupts within driver's I/O-operations, if they aren't taking too much time (say, less than 1 ms) -- there's even a disable interrupts call in my API, in case of a protection device is installed.
- Current documentation is non-existent but I hope to solve it as soon as I get the GitHub thing running (and understood by this poor brain of mine!). Certainly, I shoud explain about the goals, the hardware requisites, directions for porting to other architectures and many other things...
Whew... my apologies for the long brainstorming session. I hope to reply some other threads in the next few days. Certainly, I haven't made much progress on it... rewriting the source code to the new naming convention (but still to be assembled and tried, to check that no errors were added) and writing a menu-driven monitor/debugger useable on the LED-keypad but also suitable for any ASCII I/O device, like the keyboard I made Once again, many thanks for your contribution. See you soon!
_________________ ---
Carlos J. Santisteban
IES Turaniana
Roquetas de Mar, Almeria (Spain)
|
|