Welcome to FoolOS ================= Disclaimer ---------- THIS IS WORK IN PROGRESS. This is a simple and useless "operating system", with very basic features, sorry. It is the fruit of my fundamental explorations of the 32-bit protected mode, interrupt handling, memory management and some other things. ![Screenshot of FoolOS](/screenshots/foolos.png?raw=true "FoolOs Kernel") Copyright M.Idziorek 2014 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Issues ------ * memory map may be larger than mbr, but 0x0000 is used to check for end. * memory map location is hardcoded * ~4 first 4mb of physical mem are reserved by mem manager (hardcoded) * bootloader loads only 15sectors of kernel into mem. ~7KB? * Makefile is hardcoded and contains mistakes too! * size of bitmap to track free blocks of physical memory is hardcoded to max. * physical memory manager allocator naively implemented. * kernel should run in high memory (~3gb) virutal mem. why? except v86 tasks? * redesign keyboard interrupt handler (faster!) * redesign command handling (not inside the interrupt!!!) * implement a real shell (in user mode) MY NOTES BELOW THIS LINE ======================== Linux Startup x86 ----------------- Some notes on the Linux statup process, or at least how I understand it. 1. arch/x86/boot/header.S Contains the header and linux 16 bit code. This code should be entered with a bootloader at the address specified within the header (as _start) which will put us at 'start_of_setup' Direct loading will put us at 'start2' at the very start which will show an error message If everyhing goes right we will enter the 16-bit real mode C module with: call main ; should not return 2. arch/x86/boot/main.c void main(void) will do some checks and detections (cpu,mem,..) and invoke: go_to_protected_mode(); 3. arch/x86/boot/pm.c go_to_protected_mode() - will disable interrupts and set up the initial idt and gdt descriptor tables before calling: protected_mode_jump() and passing the address of code32_start. 4. arch/x86/boot/pmjump.S back in assembly-world the actual transition is made inside 'protected_mode_jump' and we move on to 'in_pm32' where the data segment is set up and we jmpl to the 32-bit entry point of the kernel. 5. arch/x86/kernel/head32.c (assumption!?) void i386_start_kernel(void) 6. init/main.c start_kernel(void) setup_arch()!! Interrupts ---------- arch/x86/include/asm/irq_vectors.h each entry is 8 bytes ISA interrupts: 0x30 0x0000 0x0000 0x0000 0x0000 0x31 0x32 .. 0x3f TODOS ----- * study LINUX KERNEL * GNU HURD * MINIX * FreeBSD etc. look at following linux drivers: * e1000 notes ----- * posix - minimal set of function calls! * distributed os * caches L1,L2,L3 * controller -> ide inteface of device * probe memory! * a20~ wrap * ssd card reader * cobol fortran algol? compilers? * quotation: ontogeny nrecapitulates phylogeny * own simple sell check: apertium? clang freebsd user-mode-linux REFERENCES ========== * http://www.brokenthorn.com/Resources/OSDev17.html * http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html * http://pdos.csail.mit.edu/6.828/2011/labs/lab6/ * http://wiki.osdev.org/Virtual_8086_Mode