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

News

15-Nov-2024

Welcome to FiwixOS 3.4

FiwixOS 3.4 is a completely free, open source, UNIX-like hobby operating system based on the Fiwix kernel. This is a true self-hosting operating system, which means that all packages supplied (including the kernel) have been compiled natively and no other operating system has been used in the process.

All binaries are linked statically and are built to use pure 80386 code. This is intended to make sure that FiwixOS 3.4 will run in very old hardware.

Hardware Requirements

FiwixOS 3.4 runs only in the 32-bit i386 architecture with the following minimal requirements:
  • Standard IBM PC-AT architecture.
  • CPU: 80386 or compatible (with floating-point processor).
  • RAM: 4MiB (recommended 128MiB).
  • ATA Hard disk: 1GiB (minimal install requires only ~200MiB).
  • ATAPI CD-ROM drive.

New in FiwixOS 3.4

This section provides an overview of the major highlights in this release.

  • Fiwix kernel version 1.6.0 (see detailed changes below).
  • Newlib C library version 4.4.0.
  • Added the following system calls (also included support in Newlib C):
    • sys_mmap2
    • sys_truncate64
    • sys_stat64
    • sys_lstat64
    • sys_fstat64
    • sys_fcntl64
    • sys_getdents64
    • sys_chown32
    • sys_utimes
  • Added UNIX-domain sockets using the Berkeley socket API.
  • Added support for building Fiwix using the Tiny C compiler (TCC).
  • Improved the kexec feature by supporting the Linux boot protocol.
  • Added support for PS/2 mice with the new device /dev/psaux.
  • The new I/O block requests improves dramatically the disk accesses, reduces a lot the number of context switches, and it overall boosts the performance of the system.
  • Improved the efficiency of the buffer cache.
  • Introducing the colored prompt for the shell bash, which should help to find commands when scrolling up the console.
  • Added the option set writedelay=1 in /etc/vimrc to fix a scroll bug in VIM 7.4.
  • The GNU Toolchain and Newlib are now built using the global script makeall.sh.
  • Improvements and bug fixes in the system environment.

My special thanks again to Richard R. Masters for his major contribution to the kernel.
Also thanks to Gregory Haerr as a valuable contributor.

Installation-Related Notes

This section outlines those issues that are related to the installation procedure.

  • The floppy disk cannot start the installation procedure; only the CD-ROM is able to. Still, if you have an old PC that is unable to boot from CD-ROM, you can boot from the floppy disk and use the CD-ROM as the root filesystem to proceed with the installation. To do so, you need to boot from the floppy disk and then modify the kernel command-line in the GRUB menu by changing the root device to CD-ROM (e.g: root=/dev/hdc or wherever the CD-ROM drive resides), and also appending the kernel parameters rootfstype=iso9660 ramdisksize=4096.
  • The installation script install.sh accepts an argument (with the same syntax as if it would be specified in mke2fs) to specify the default block size in all the filesystems except /boot. E.g: ./install.sh "-b 4096".
  • Perl hasn't been rebuilt because it seems not possible to tell it that the system has support for UNIX domain sockets but not for the AF_INET domain and TCP/IP protocols. That's the reason why FiwixOS 3.4 still uses the same Perl package of FiwixOS 3.3.

Package Changes

This is a list of packages that have changed since the previous release:

  • byacc-20240109
  • bzip2-1.0.8
  • cpio-2.15
  • ddrescue-1.28
  • dialog-1.3-20240619
  • diffstat-1.66
  • diffutils-3.10
  • dmidecode-3.6
  • dos2unix-7.5.2
  • e2fsprogs-1.37
  • ed-1.20.2
  • file-5.45
  • global-6.6.13
  • grep-3.11
  • groff-1.23.0
  • gsl-2.8
  • gzip-1.13
  • indent-2.2.13
  • jpeg-9f
  • lcms2-2.16
  • less-661
  • libarchive-3.7.4
  • libffi-3.4.6
  • libpng-1.6.43
  • libxcrypt-4.4.36
  • logrotate-3.22.0
  • lua-5.4.7
  • lzip-1.24.1
  • mpc-1.3.1
  • mpfr-4.2.1
  • nano-8.1
  • nasm-2.16.03
  • ncompress-5.0
  • ncurses-examples-20211021
  • newlib-4.4.0
  • pciutils-3.13.0
  • sed-4.7
  • stress-1.0.7
  • tar-1.35
  • tiff-4.5.1
  • units-2.23
  • vttest-20240218
  • zlib-1.3.1

This is a list of packages new in this version:

  • autoconf264-2.64
  • automake1111-1.11.1
  • e2fsprogs-libs-1.37
  • freetype-2.10.4
  • moe-1.14

This is a list of packages removed in this version:

  • libuuid-1.0.3 (superseded by e2fsprogs-libs-1.37)

Kernel changes

The following is a complete list of changes.

1.6.0 - 15-Nov-2024
===================
- Added support for UNIX-domain sockets (with the Berkeley socket API). [#36]
- Added support for sys_truncate64, sys_ftruncate64, sys_stat64, sys_lstat64,
  sys_fstat64 and sys_fcntl64 system calls. [#49]
- Added support for sys_getdents64. [#51]
- Added support for sys_chown32. [#53]
- Added support for sys_utimes. [#57]
- Added support for building Fiwix with the TCC compiler. [#63]
- Added support for the Linux boot protocol in kexec. [#65]
- Added support for the PS/2 mouse with the new device /dev/psaux. [#94]
- Added the new configuration option PAGE_HASH_PERCENTAGE (0.1% by default) to
  set the size of the page_hash_table relative to the number of physical memory
  pages, with a mininum of 1 page and a maximum of 16 pages. The kernel now
  shows the hash tables sizes during the boot.
- Added to sync drives when kernel stops because no more user processes exist.
  [#70]
- Added the flag PF_NOTINTERRUPT to avoid waking up a process sleeping in the
  non-interruptible mode.
- Added a consistency check on every directory entry during ext2_lookup().
- Added a call to invalidate_buffers() before reread the partition table in the
  ioctl BLKRRPART.
- Rewritten how multiple I/O block requests are managed. Now the new I/O block
  layer enqueues a block request group with all the buffers needed in a read or
  write operation, and keeps sleeping until the whole transaction has been
  completed. This improves dramatically the disk accesses, reduces a lot the
  number of context switches, and it overall boosts the performance of the
  system.
- Changed the file position for reads to be set to zero when a file is opened
  with O_APPEND. [#76]
- Implement mapping framebuffer physical address to user space using mmap. [#79]
- Changed the inode cache mechanism to avoid caching inodes from
  pseudo-filesystems.
- Changed count_active_procs() to also count processes that are sleeping as
  non-interruptible.
- Changed the tty sleeping address to be process specific in order to reduce
  the wakeup latency.
- Moved the values sb->dirty, inode->locked and inode->dirty to flags.
- Moved the call to sysrq() into the keyboard interrupt bottom half.
- Improved code compaction and efficiency in ATA disk read/write.
- Improved the efficiency of the buffer cache.
- Improved ext2_file_write() to use a multiblock request with gbread() when the
  count is greater than the blocksize.
- Reorganized and improved the system console related code.
- Pass through 64-bit PAE memory entries as part of kexec. [#67]
- Make sure that the early system log will be shown in all system consoles.
- Removed unneeded low memory kernel virtual address mappings. [#88]
- Reduced a number of functions in the timer interrupt by moving them to the
  bottom half.
- Reorganized the code of the keyboard driver.
- Renamed and reorganized tty_queue into charq to make it more generic.
- Fixed sys_mount() to avoid mounting a device already mounted.
- Fixed compilation errors when CONFIG_PCI is not defined.
- Fixed to allow removing a directory in use. [#59]
- Fixed in sys_getcwd() to check diff_dev variable before accessing
  tmp_inode. [#61]
- Fixed vconsole_select() to not switch to an unexistent vconsole.
- Fixed ata_hd_init() to make sure that the command SET_FEATURES is sent in all
  cases.
- Fixed the kernel stack backtrace to skip the first 5 stack values.
- Fixed an scrolling bug with 'vi' in fbcon_scroll_screen(). [#81]
- Fixed UNIX sockets working with select(). [#83]
- Fixed serial system console table overindex. [#87]
- Fixed a major problem in do_switch routine. [#89]
- Fixed incorrect passing of e820 memory map to Linux kexec guests. [#72]
- Fixed EXT2_DESC_PER_BLOCK() to avoid redundant calculations.
- Fixed kswapd() to enable interrupts after initializing devices.
- Fixed a long standing bug during bitmap calculation in the ext2 filesystem.
- Fixed CHECK_IF_NESTED_INTERRUPT by comparing KERNEL_CS against CS.
- Fixed a kernel crash on boot when PCI is disabled and the kernel parameter
  bga= is supplied.
- Fixed sleep() to avoid race conditions by executing CLI() earlier.
- Fixed a bug introduced in 4317cbe that prevented from continuing to the next
  running process in stop_kernel().
- Fixed read_msdos_partition() to use the default device block size instead of
  BLKSIZE_1K.
- Fixed to flag the superblock as dirty in ext2_ialloc(), ext2_ifree(),
  ext2_balloc() and ext2_bfree().
- Fixed fbcon_blank_screen() to not show cursor. [#94]
- Fixed a lack of schedule randomization introduced in b935b3d.
- Fixed reclaim_buffers() to run with interrupts enabled.
- Fixed to initialize the new vma struct in merge_vma_regions().
- Fixed to reset the flag before calling some functions to avoid reentrancy
  in irq_keyboard_bh().
- Fixed a long standing bug in vconsole_select() that prevented from switching
  between consoles in VT_PROCESS mode.
- Fixed permissions in the ioctl VT_WAITACTIVE.
- Fixed a long standing bug in wakeup() that put as running one in two processes
  sleeping, leading to frequent cases where some processes keep sleeping.
- Small fixes and cosmetic changes.

Known Issues

This is a list of known issues pending to be resolved:

  • There is an known bug that prevents FiwixOS from installing on systems with 64MiB or less of memory when there is a small number of inodes. It appeared when the option INODE_PERCENTAGE was changed from 5 to 1, so it must be related to the inode subsystem somehow.
  • Regarding the filesystem, file corruption cases are really low but not 100% free. I recommend to make periodic filesystem checks with fsck.ext2 and backups, to make sure you can recover from a serious situation.

Definitely the kernel needs more eye balls to help to catch all these bugs.


First   Previous