Welcome to FiwixOS 3.1
FiwixOS 3.1 is a completely free, open source, hobby operating system based on the Fiwix kernel. This is a true self-hosting operating system, which means that all packages supplied have been compiled natively. All executables are linked statically.
Hardware RequirementsFiwixOS 3.1 runs only in the 32-bit i386 architecture with the following minimal requirements:
- Standard IBM PC-AT architecture.
- Minimum CPU: 80386 or compatible (with floating-point processor).
- Minimum of RAM: 3MB. Recommended 128MB.
- ATA Hard disk: 1GB. Recommended 2GB.
- ATAPI CD-ROM drive.
New in FiwixOS 3.1
This section provides an overview of the major highlights in this release.
- Fiwix kernel version 1.3.0 (see changes below).
- Newlib 3.2 C library with extra functions.
- Completely new installation procedure using the
- Nested interrupts are possible in this new kernel version.
- GRUB 0.97 has been patched to include support for VESA VBE 2.0+ compliant cards.
- Kernel is now capable to boot using a frame buffer console.
- The file
/proc/meminfonow shows the amount of dirty memory.
- Added support to handle two ATA/ATAPI devices in the same IDE controller.
- Added support for the magic SysRq key combination to help to diagnose kernel's state.
- Massive kernel bug fixing.
- Man pages are now even more readable thanks to the port of
- More improvements and bug fixes in the operating system environment.
This section outlines those issues that are related to the installation procedure.
- From now on, the floppy disk cannot start the installation procedure; only the CD-ROM is able to. Still, if you have an old PC with a BIOS unable to boot from CD-ROM, you can boot from the floppy disk and modify in GRUB the kernel parameter (
root=) to use the CD-ROM as the root device:
root=/dev/hdc(or wherever the CD-ROM drive resides), and also add the kernel parameter
This is a list of packages that have been upgraded since the previous release:
- at-3.1.13 (changes in the init script and added the logrotate script)
- bc-1.07.1 (now uses readline library)
- grub-0.97 (added VBE support (original patch here) plus a small patch)
- lookbusy-1.4 (small change)
- mingetty-1.08 (small change)
- procps-3.2.8 (small change)
- sysvinit-2.84 (small change)
This is a list of packages new in this version:
The following is a complete list of changes.
1.3.0 - 08-Dec-2021 =================== - Added support for interrupt nesting. - Added framebuffer device support for VESA VBE 2.0+ compliant graphics cards. - Added support for the framebuffer console (fbcon). - Completely rewrite the console to support VGA text and framebuffer screens. - Improved the speed of VGA text consoles by using double-buffering and fixing also a fair number of bugs. - Updated the header file to support the latest GRUB Multiboot Specification v1. - Moved 'cpu_idle()' to a C function to include more easily some tasks to do. - Isolated the multiboot code in order to prepare the kernel to support multiple bootloader protocols. - Arrange boot.S to be compatible only with GRUB Multiboot Specification v1. - Changed from 0x90000 to 0x50000 the memory location of the 4MB temporary Page Directory to be able to hold bigger initrd images. - Changed from 5% to 1% the amount of memory that will use the inode table. - Added the ability to insert extra regions to the memory map provided by the boot loader. - Added support to detect non-contiguous areas of available memory in the BIOS memory map. - Added support for the 'magic SysRq key' to help to know the cause of a kernel freeze on a disaster situation. - Added some basic checks on data received during IDE identify to make sure it makes sense. - Added support to handle two ATA/ATAPI devices in the same IDE controller. - Reduced the size of the buffer area used in floppy I/O operations. - Increased to 50 the maximum of BIOS memory map entries. - Removed CLI() functions in ide_hd and ide_cd. - Improved the handling of the inode free list and the locking mechanism. - Improved the handling of buffer and memory page free lists. - Improved the way how is counted the first megabyte of memory. - Changed bread_page() to reuse buffers and reduce disk I/O activity. - Honour POSIX.1-2008 by returning ELOOP if flag O_NOFOLLOW is set and the trailing component (basename) of the pathname in open() is a symbolic link. - Disabled interrupts during the context switch. - Moved the values buffer->valid, buffer->locked and buffer->dirty to flags. - Moved the value pg->locked to a flag. - Changed kernel_process() to accept also the name of the process. - Removed a sizeof(void) in sys_signal() as it is not covered by the C standard. - Disabled interrupts during early boot up. - Added the configure option CONFIG_VERBOSE_SEGFAULTS (disabled by default). - Added a separate queue for all running processes. - Disabled default screen blanking. - Added a new linked list in the buffer structure to better handle the dirty buffers. - Added the 'Dirty' line in '/proc/meminfo' to keep track the amount of memory waiting to be written back to the disk. - Wakeup the INIT process (if it's sleeping on sys_wait4()) if one of the new processes inherited during the sys_exit() call is a zombie. - Saved some CPU cycles in irq_handler() by isolating unused IRQs. - Fixed the RAMdisk driver to not access blocks beyond its size. - Fixed a race condition in floppy drive when the interrupt occurred right before going to sleep. - Fixed a bug during the RAMdisk memory initialization that reserved twice the size of the initrd image. - Fixed to return EISDIR when trying to read a directory in procfs. - Fixed a memory corruption bug in procfs_readlink() that was leading to instability in user programs that read the procfs. - Fixed to use a simple assignment in elf_create_stack() instead of using a function to copy a numeric value. - Fixed a long standing memory corruption bug when returning the contents of the '/proc/
/cmdline' file. - Fixed a possible memory corruption bug when returning the contents of the '/proc/ /environ' file. - Fixed a missing queue handling in the serial driver. - Fixed to remove the calls to reset termios and tty on tty_close(). - Fixed an extra buffer_head assignment in get_free_buffer() which reduced to 50% the buffer space, and could also potentially use an already locked buffer. - Fixed a very long standing buffer corruption bug, in rename functions of ext2 and minix filesystems, that led to crashes with the message 'getblk(): no more buffers on free list!' after a heavy filesystem use. - Fixed the tty_queue_room() function and aligned to 8 the number of cblocks per queue. - Fixed the way how release_page() and reclaim_buffers() cooperate when there are no more free memory pages, in order to avoid killing the current process prematurely. - Fixed to avoid sleeping during console_flush_log_buf(). - Fixed to return ENOSPC when trying to write beyond the size of a block device. - Fixed get_proc_by_pid() to not PANIC anymore if the process didn't exist. - Fixed to avoid multiple calls to tty_queue_init(). - Fixed to return ENXIO when the device does not exist. - Fixed the CSI J Erase in Display (ED) and other sequences in console. - Fixed /dev/kmem to not access beyond the end of the virtual memory. - Fixed to make sure that disk partitions with status value other than 0x00 and 0x80 are invalid. - Fixed a race condition in ATA identify/read when the interrupt occurred right before going to sleep. - Fixed a buffer overrun in iso9660_dir_readdir(). - Fixed a bug in iso9660_dir_readdir() that prevented from including some files in the user dirent structure under certain conditions. - Fixed a very long standing bug in the memory page hashing mechanism that led to kernel freezes after a long use. - Fixed a very long standing bug in all inode lookup functions that ate an extra inode on every call, leading to the premature message "WARNING: no more inodes on free list!". - Fixed certain values to be signed instead of unsigned in kstat structure. - Fixed a bug in tty->canon_data that corrects a bad behavior in select(). - Fixed to decrease rss memory from the zombie process instead from its parent in remove_zombie(). - Fixed to name correctly the IDLE process by assigning 'idle' to argv0. - Fixed to honour the select() function when handling pipes. - Fixed to reduce over-scheduling in tty_write() by calling do_sched() only if needed. - Fixed a long standing bug in do_exit() that made some processes returning from the death. - Fixed the inode reference counter when moving directories (sys_rename) in ext2 and minix filesystems. - Fixed to update the parent directory when moving directories (sys_rename) in ext2 and minix filesystems. - Fixed to wake up all processes in select() after a console_write(). - Fixed an incomplete copy of in-memory superblock data during a remount from RO to RW, in ext2 and minix filesystems, that led to not save all changes in superblock. - Fixed to decrease the number of children either when the process is exiting, and from the correct parent after reaping a zombie process. - Fixed a long standing bug, in ext2_dir_readdir() and minix_dir_readdir(), that prevented from listening directory entries if there were blank blocks in the middle. - Small fixes and cosmetic changes. - Cleaned up a lot of code.
This is a list of known issues pending to be resolved:
- After the introduction of interrupt nesting some new issues have appeared: the kernel may sometimes panic under a heavy disk I/O and the kernel seems a bit slower than the previous version. It looks like it is losing interrupts. I expect to solve all these issues in the next versions.
- If you need to rebuild a big-sized application you'll probably have to increase the value of VMA_REGIONS in
include/fiwix/config.h(and rebuild the kernel) in order to avoid running out of mmap regions.
- If you are running FiwixOS 3.1 on a very old 80386 without floating-point processor, you might see the kernel message
EXCEPTION: Device Not Available (No Math Coprocessor) ... Illegal instructionduring the execution of certain commands. Rebuilding these commands with the GCC flag
-fsingle-precision-constantmight help to avoid the use of some floating-point instructions in the code (like
FLDZ, and others). This has not been tested though.