News
15-Nov-2025
Welcome to FiwixOS 3.5
FiwixOS 3.5 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 was 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.5 will run in very old hardware.
Hardware Requirements
FiwixOS 3.5 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 (at least 16MiB are needed for the installation).
- ATA Hard disk: 1GiB (minimal installation requires only ~200MiB).
- ATAPI CD-ROM drive.
New in FiwixOS 3.5
This section provides an overview of the major highlights in this release.
- Fiwix kernel version 1.7.0 (see detailed changes below).
- Newlib C library version 4.5.0 with the following extra changes:
- Added the system call
sys_syslog. - Added the following functions:
posix_openptgranptunlockptptsnameopenptygetdtablesizesetlogmaskcloselogopenlogsyslogvsyslogklogctlsetpgrp- Added the following C headers:
pty.hsgtty.h(stub)values.hsyslog.hsys/klog.hsys/ttydefaults.hbits/posix_opt.h- Added the following constants in
paths.h: _PATH_DEVPTMX_PATH_DEVPTS_PATH_LOG- Increased
OPEN_MAXfrom 64 to 256. - Added support for UNIX98 pseudoterminals (pty).
- Added support for the devpts filesystem.
- Added support for system logging.
- Improved PCI driver and added PCI information in /proc filesystem.
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/hdcor wherever the CD-ROM drive resides), and also appending the kernel parametersrootfstype=iso9660 ramdisksize=4096. - The installation script
install.shaccepts an argument (with the same syntax as inmke2fs) to specify the default block size in all the filesystems except/boot(e.g:./install.sh "-b 4096").
Package Changes
This is a list of packages that have changed since the previous release:
- at-3.2.5.
- bc-1.08.
- byacc-20241231.
- coreutils-9.1 (fixed
lsto show correctly the major numbers greater than 128). - ddrescue-1.29.
- dialog-1.3-20250817.
- diffstat-1.68.
- diffutils-3.12.
- e3-2.7.1 (fixed the path of the man pages).
- e2fsprogs-1.40.11.
- e2fsprogs-libs-1.40.11.
- ed-1.22.2.
- file-5.46.
- gmp-6.3.0.
- gperf-3.3.
- grep-3.12.
- gzip-1.14.
- indent-2.2.13.
- lcms2-2.17.
- less-679.
- libarchive-3.7.9.
- libffi-3.5.2.
- libiconv-1.18.
- libpng-1.6.50.
- libtool-2.5.4.
- libxcrypt-4.4.38.
- lua-5.4.8.
- lxdoom-1.4.4 (now it searches first
doom1.wadand thendoom2.wadfiles). - lzip-1.25.
- moe-1.15.
- mpfr-4.2.2.
- nano-8.5.
- newlib-4.5.0-20241231.
- newt-r0-52-24.
- patch-2.8.
- pciutils-3.14.0.
- perl-5.24.4.
- readline-8.1.2.
- sed-4.9.
- sysvinit-2.87dsf (fixed some issues).
- tiff-4.6.0.
- tree-2.2.1.
- units-2.24.
- util-linux-ng-2.18 (enabled
dmesg,blockdevandmore). - vttest-20241208.
- which-2.23.
This is a list of packages new in this version:
- ZEsarUX-13.0
- A Zx80/Zx81/Z88, Zx Spectrum 16/48/128/+2/+2A and ZX-Uno emulator with ULAPlus support. See this video.
- figlet-2.2.5
- A program for making large letters out of ordinary text.
- glheretic-1.2
- A version of the Id Software game Heretic for SVGAlib.
- musl-gcc-1.0.5
- A wrapper around
gccto compile programs and libraries with musl easily. musl is a C standard library. It is lightweight, fast, simple, free, and strives to be correct in the sense of standards conformance and safety. Given that Fiwix is mostly 100% compatible with Linux 2.0 i386 ABI, binaries compiled with this version of musl should run without any problems under FiwixOS. Also, musl includes support for networking which will be helpful during the process of including networking support to the Fiwix kernel.
- A wrapper around
- screen-4.2.1
- A screen manager that supports multiple logins on one terminal.
This is a list of packages removed in this version:
Kernel changes
The following is a complete list of changes.
1.7.0 - 15-Nov-2025 =================== - Added support for UNIX98 pseudoterminals (pty). - Added support for the devpts filesystem. - Added support for system logging via sys_syslog() and /proc/kmsg. - Added the member s_blocksize_bits in the superblock struct to use bitwise shift instead of division in ext2_bmap() and ext2_truncate(). - Added the RSS column in the list of processes generated by the Magic SysRq key 't'. - Added the 'fd' structure as a new argument in ioctl() and select() methods. - Added a free data pointer called 'private_data', in 'fd' structure, which is mostly used by the tty driver for now. - Added support for the command TIOCINQ in tty_ioctl(). - Added the new kernel parameter 'ps2_noreset=' (which defaults to 0, disabled) to avoid reseting the PS/2 controller (specially useful on systems that don't has any PS/2 controller. - Added support for the '/proc/pci/ and '/proc/bus/pci/devices' files. - Added the support for the ioctls BLKSSZGET and BLKBSZGET on ATA and floppy drivers, and also added the missing BLKFLSBUF to the floppy driver. - Changed modulo operations by bitwise (where possible) to reduce dependency from libgcc. - Changed static array tty_table to dynamic. - Rewritten mostly the PCI driver. - Removed some flags from LDFLAGS in the main Makefile that prevented compile the kernel with newer GCC versions. [#97] - Removed the dir_write method from the ext2 and minix filesystems. - Removed a condition in do_sched() because it has no effect. - Removed an unneeded assignment to need_resched in do_exit() and reduced the abuse of using need_resched because it costs excessive context switches. - Renamed the functions *_dir_readdir() and *_dir_readdir64() to *_readdir() and *_readdir64(). - Renamed all *fd_table function arguments to avoid shadowing the global fd_table array. - Simplified a do.while() in reclaim_siblings() also with small improvements in reclaim_buffers(). - Reverted 49393d0 and fixed 'memksize' in all cases to be able to boot again on systems with 4MiB of memory. - Reverted 39c0097 because an existing bug prevents a complete installation on systems with less than 64MiB of memory. - Update LICENSE file with additional contributor information. - Fixed ext2_balloc() and ext2_ialloc() to return -ENOSPC when there is not space on device. - Fixed fs.h to include fd.h when CONFIG_NET is not set. - Fixed some kernel crashes with the message 'WARNING: page_head returned NULL! (free_pages = 0)' when using a RAMdisk drive as the root filesystem. [#98] - Fixed ext2_file_write() to avoid to brelse() a NULL buffer. [#98] - Fixed sys_open() to catch early an attempt to write on a directory. - Fixed to add some missing iput() in procfs_lookup() and procfs_followlink(). - Fixed sys_mount() to also save the mount point for nodev filesystems. - Fixed an unintended fall-through in set_color() of fbcon.c. - Fixed a long standing bug in send_sig() that missed to add SIGCONT, SIGWINCH and SIGUSR to the list of signals to ignore when the disposition is set to SIG_DFL. - Fixed an always true comparison in get_procfs_by_inode(). - Fixed a long standing bug in sys_kill() that prevented from sending the signal zero. - Fixed a long standing bug in sys_select() that returned always -EBADF when 'nfds' is equal to FD_SETSIZE. - Fixed a long standing bug in tty_read() that always returned VMIN bytes regardless of the amount of data available. - Fixed a possible null pointer dereference in proc_list(). - Fixed a long standing bug in sys_select() that didn't return -EINTR if it was interrupted by a signal. - Fixed sys_fork() to share the remaining CPU time of the parent with the new child. - Fixed to avoid a division by zero in SLEEP_HASH() macro when NR_PROCS is less than 10. - Fixed a long standing bug in data_proc_pid_cmdline() and data_proc_pid_environ() functions that led to the kernel panic. - Fixed an accidental fall through in opost(). - Fixed a missing iput() when freeing or merging a vma region. - Fixed get_free_buffer() to not create new buffers if free memory pages are lower than minimal. - Fixed inefficient code by reducing excessive calls to wakeup(&buffer_wait) in fs/buffer.c. - Fixed a bug in sys_open() that allowed to create a file on a read-only filesystem. - Small fixes, code cleanup 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 the config option
INODE_PERCENTAGEis less than 5. So in order to continue be able to install on these constrained memory system, I'll keep such option to 5 while I try to discover the cause. - There are other bugs here and there. Some of them are hurtless, others are annoying but only a few of them can sometimes panic the kernel.
- Regarding the filesystem, file corruption cases are really low but not 100% free. I recommend to make periodic filesystem checks with
fsck.ext2and backups, to make sure you can recover from a serious situation.
Definitely this code needs more eyeballs to help to catch all these bugs.
