In late June this year, FreeDOS released an updated kernel. Thanks to the hard work of our kernel developers, maintained by Jeremy Davis, the new kernel includes a ton of new work aimed at supporting Windows 3.1 in “386 Enhanced” mode. FreeDOS has been able to run Windows 3.1 in “Standard” mode for years, but “Enhanced” mode requires supporting a lot of compatibility “edge” cases for Windows 3.1. It is no small feat to add this support.
Since that time, we’ve included this updated kernel in every monthly test release starting with FreeDOS T2607 (July 2026). If you install the test release, you’ll automatically install the new kernel. Please help us to test the new kernel; the test release will become the next FreeDOS distribution.
FreeDOS 1.4 (kernel version 2043)
But what if you’re already running FreeDOS 1.4 and don’t want to re-install just to try out the new kernel? Installing a new FreeDOS kernel is actually quite easy. Let’s demonstrate by upgrading FreeDOS 1.4 to use the new kernel.
For this demonstration, I started with a tiny QEMU disk image. I don’t need to install all of FreeDOS 1.4 just to test this, so a few megabytes would be enough. I created a virtual QCOW2 disk image that was 10 megabytes in size:
$ qemu-img create -f qcow2 tiny.q 10M
Formatting 'tiny.q', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=10485760 lazy_refcounts=off refcount_bits=16
I already downloaded the FreeDOS 1.4 installation media as FD14LIVE.iso in a 1.4 directory. I booted QEMU with the LiveCD as the “CD-ROM” image, and the tiny.q disk image as the “C:” drive:
$ qemu-system-i386 -cdrom 1.4/FD14LIVE.iso -hda tiny.q
The LiveCD boots into a DOS prompt by default, so I used the fdisk command to verify that the “C:” drive was empty, then created a new partition on it. You can use fdisk either as an interactive program or as a command line tool; I used it from the command line:
D:\>fdisk 1 /info
Current fixed disk drive: 1 20160 sectors, geometry 20/016/63
No partitions defined.
Largest continuous free space for primary partition = 9 MBytes
D:\>fdisk 1 /auto
D:\>fdisk 1 /info
Current fixed disk drive: 1 20160 sectors, geometry 20/016/63
Partition Status Mbytes System Usage Start CHS End CHS
C: 1 1 A 9 FAT-12 100% 0/001/01 19/015/63
Largest continuous free space for primary partition = 0 MBytes
Like any DOS, the FreeDOS kernel only reads the disk partition information when it boots up. If you add or delete partitions on the disk, you need to reboot before FreeDOS will “see” them. After rebooting the system using the reboot command (which is really an alias to fdapm with the /warmboot command line option) I was back at DOS prompt and could create a DOS filesystem on the “C:” drive using the format command. To make the disk bootable with a kernel and a copy of the command.com shell, add the /S (“system”) option to the format command line.
D:\>format C: /S
DRIVE C: WILL BE LOST! PLEASE CONFIRM!
Proceed with Format (YES/NO)?YES
## Boot sector unreadable, disk not yet formatted
Disk size: 10 Mbytes, FAT12. ***
Cannot find existing format - not saving UNFORMAT data.
Please enter volume label (max. 11 chars): TINY
QuickFormatting (only flushing metadata)
Warning: Resets bad cluster marks if any.
Preparing FAT area...
100 percent completed.
QuickFormat complete.
Running SYS in a shell: sys C:
System transferred.
10,289,664 bytes total disk space (disk size)
10,264,576 bytes available on disk (free clusters)
4,096 bytes in each allocation unit.
2,506 allocation units on disk.
Volume Serial Number is 2021-1824
To make it easier to shut down the virtual machine later, I also copied the fdapm command to the new virtual disk. When I was done, my new “C:” drive had a copy of the kernel as KERNEL.SYS, the command shell as COMMAND.COM, and the Advanced Power Management command as FDAPM.COM:
D:\>copy \freedos\bin\FDAPM.COM C:
\freedos\bin\FDAPM.COM =>> C:FDAPM.COM
D:\>dir C: /w
Volume in drive C is TINY
Volume Serial Number is 2021-1824
Directory of C:\
COMMAND.COM FDAPM.COM KERNEL.SYS
3 file(s) 141,462 bytes
0 dir(s) 10,117,120 bytes free
Having installed a minimal version of “FreeDOS 1.4,” I could shut down using fdapm one more time:
D:\>fdapm /poweroff
If you boot back into the “tiny” virtual disk, you can see that the FreeDOS kernel identifies itself as version 2043:
$ qemu-system-i386 -hda tiny.q
Booting from Hard Disk...
FreeDOS kernel 2043 (build 2043 OEM:0xfd) [compiled May 14 2021]
Kernel compatibility 7.10 - WATCOMC - 80386 CPU required - FAT32 support
(C) Copyright 1995-2012 Pasquale J. Villani and The FreeDOS Project.
All Rights Reserved. This is free software and comes with ABSOLUTELY NO
WARRANTY; you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation;
either version 2, or (at your option) any later version.
Upgrading the kernel (version 2046)
To install the new kernel without reinstalling FreeDOS, you can just replace the KERNEL.SYS file. It’s that easy because of how DOS boots up: I’ll skip over some of the details, but eventually the system starts the FreeDOS boot loader which looks for a kernel called KERNEL.SYS. If you replace that system file with another one, the boot loader will load the new kernel.
Let’s replace the “FreeDOS 1.4” kernel with the one from the latest FreeDOS test release (FreeDOS T2610, October 2026). One way to do that is to boot the virtual machine with the FreeDOS T2610 installation media as a separate drive, and copy the kernel to the “C:” drive.
Since my “tiny” virtual disk doesn’t have a CD-ROM driver, I couldn’t use the LiveCD image from the FreeDOS test release—at least, not if I wanted to do the work from the virtual disk. Instead, I downloaded the FreeDOS T2610 “Full USB” image as T2610FULL.img and booted with that as the “D:” drive. I used the tiny.q virtual disk image as the “C:” drive:
$ qemu-system-i386 -hda tiny.q -hdb T2610/T2610FULL.img
By default, the FreeDOS kernel looks for its configuration file as \FDCONFIG.SYS; if it can’t find that file, it also looks for \CONFIG.SYS. Since I didn’t create this file on my virtual disk, the FreeDOS kernel assumes some defaults and loads \COMMAND.COM as the command shell. The shell looks for \AUTOEXEC.BAT to set the initial environment; but this doesn’t exist either so the command shell prompts for the date and time, then puts me into a shell prompt where I can type commands:
Booting from Hard Disk...
FreeDOS kernel 2043 (build 2043 OEM:0xfd) [compiled May 14 2021]
Kernel compatibility 7.10 - WATCOMC - 80386 CPU required - FAT32 support
(C) Copyright 1995-2012 Pasquale J. Villani and The FreeDOS Project.
All Rights Reserved. This is free software and comes with ABSOLUTELY NO
WARRANTY; you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation;
either version 2, or (at your option) any later version.
C: HD1, Pri[ 1], CHS= 0-1-1, start= 0 MB, size= 9 MB
D: HD2, Pri[ 1], CHS= 0-1-1, start= 0 MB, size= 1023 MB
FreeCom version 0.86 - WATCOMC - XMS_Swap [Dec 30 2024 22:10:51]
Current date is Sat 10-03-2026
Enter new date (mm-dd-[cc]yy):
Current time is 5:12:22 pm
Enter new time:
C:\>
I first made a backup of the KERNEL.SYS kernel file, then copied the new kernel from the “D:” drive to the “C:” drive. You can do this with the shell’s built-in copy command:
C:\>copy kernel.sys kernel.000
kernel.sys =>> kernel.000
C:\>copy D:\kernel.sys kernel.sys
Overwrite 'kernel.sys' (Yes/No/All/Quit) ? y
D:\kernel.sys =>> kernel.sys
That’s it! I now have a backup copy of the “old” kernel as KERNEL.000 and the “new” kernel is KERNEL.SYS. You can see that the files are different using the dir command:
C:\>dir kernel.*
Volume in drive C is TINY
Volume Serial Number is 2021-1824
Directory of C:\
KERNEL SYS 48,889 10-01-26 10:14a
KERNEL 000 46,256 04-02-25 10:22a
2 file(s) 95,145 bytes
0 dir(s) 10,067,968 bytes free
After I reboot the system using the fdapm command with the /warmboot option, I can verify the system is now running with the new kernel:
Booting from Hard Disk...
..............123
FreeDOS kernel 2046 (build 2046 OEM:0xfd) [compiled Jun 29 2026]
Kernel compatibility 7.10 - WATCOMC - 80386 CPU required - FAT32 support
(C) Copyright 1995-2023 Pasquale J. Villani and The FreeDOS Project.
All Rights Reserved. This is free software and comes with ABSOLUTELY NO
WARRANTY; you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation;
either version 2, or (at your option) any later version.
You can power off the virtual machine using the fdapm command one more time, with the /poweroff option.
D:\>fdapm /poweroff
By design, DOS is a simple operating system. And this simplicity makes DOS a great way to learn how computers work. You can see all of the “moving parts” in DOS: when the kernel boots up, it looks for its “config” file, which sets systemwide parameters. Then the kernel starts the command shell, which uses its own “bat” file to set the initial environment. After that, you’re at the command line and can enter commands and run programs.
Please help us test the next version of FreeDOS! Thanks to Jerome Shidel, our distribution manager, we are able to share a new “test” distribution every month. These monthly releases collect all new changes, and act as a “test bed” to become the next official FreeDOS distribution, and we would like your help to test it. The new “T2610” test release includes updates to VSBHDA, SBEMU, Himem, TinyAsm, Blocek, Lynx, FDNPKG16, plus several new translations. Since August, we’ve also included the updated kernel and other tools. Download the test release and let us know if you have any problems.