Fork me on GitHub
Fiwix symbol
Welcome to the Fiwix project
Your small UNIX-like kernel



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 Requirements

FiwixOS 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 dialog tool.
  • 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/meminfo now 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 mandoc.
  • More improvements and bug fixes in the operating system environment.

Installation-Related Notes

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 rootfstype=iso9660.

Package Changes

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)
  • byacc-20210808
  • dash-
  • dialog-1.3-20210621
  • diffstat-1.64
  • expat-2.2.10
  • file-5.41
  • gmp-5.1.3
  • grep-3.1
  • grub-0.97 (added VBE support (original patch here) plus a small patch)
  • lcms2-2.12
  • less-563
  • lookbusy-1.4 (small change)
  • lua-5.4.3
  • lzip-1.22
  • mingetty-1.08 (small change)
  • mpc-1.0.3
  • mpfr-3.1.3
  • newlib-3.2.0
  • pcre-8.45
  • procps-3.2.8 (small change)
  • sysvinit-2.84 (small change)
  • units-2.21

This is a list of packages new in this version:

  • aalib-1.4.0
  • chkconfig-
  • crontabs-1.10
  • dmidecode-2.12
  • dos2unix-7.4.2
  • logrotate-3.18.1
  • mandoc-1.14.6
  • newt-r0-52-21
  • popt-1.18
  • slang-2.3.2
  • vixie-cron-4.1

Kernel changes

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
- 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
- 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
- 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
- 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
- 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
- Small fixes and cosmetic changes.
- Cleaned up a lot of code.

Known Issues

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 instruction during the execution of certain commands. Rebuilding these commands with the GCC flag -fsingle-precision-constant might help to avoid the use of some floating-point instructions in the code (like FLDZ, and others). This has not been tested though.

First   Previous   Next   Last