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 parametersrootfstype=iso9660 ramdisksize=4096
. - The installation script
install.sh
accepts an argument (with the same syntax as if it would be specified inmke2fs
) 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 valuessb->dirty
,inode->locked
andinode->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 checkdiff_dev
variable before accessingtmp_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 parameterbga=
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.