FreeDOS source code study - compile kernel and make bootable images
Compile FreeDOS kernel and freecom
Get FreeDOS kernel source code
Get FreeDOS kernel source code from here.
Put the downloaded file to D:\freedos_build\freedos_kernel.zip.
Get FreeDOS freecom source code
Get FreeDOS freecom source code from here.
Put the downloaded file to D:\freedos_build\freedos_freecom.zip.
Create echoto and echolib source code
The echoto.bat and echolib.bat programs that come with FreeDOS kernel and
freecom source code somehow do not work correctly. We need to replace the two
programs.
Create D:\freedos_build\echoto.c:
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *file;
char* fileName;
int i;
if (argc <= 1)
{
return 0;
}
fileName = argv[1];
file = fopen(fileName, "a");
if (file == NULL) {
return 1;
}
for (i = 2; i < argc; i++)
{
fprintf(file, "%s ", argv[i]);
}
fclose(file);
return 0;
}
Create D:\freedos_build\echolib.c:
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *file;
char* fileName;
int i;
if (argc <= 1)
{
return 0;
}
fileName = argv[1];
file = fopen(fileName, "a");
if (file == NULL) {
return 1;
}
for (i = 2; i < argc; i++)
{
fprintf(file, "%s ", argv[i]);
}
fprintf(file, "%s", "&");
fclose(file);
return 0;
}Get Turbo C Turbo C++ and NASM
The author of this kernel compiling process video has provided an archive that contains Turbo C 2.01, Turbo C++ 1.01 and NASM 0.98.
Put the downloaded file to D:\freedos_build\freedos_compilers.zip.
Get WinRAR
Download WinRAR from here. The version matters because it will be installed in Windows 98.
Put the downloaded file to D:\freedos_build\winrar3.80.exe.
Run Windows 98 in a virtual machine
To build the FreeDOS kernel and freecom, a Windows 98 or Windows XP environment is needed.
Download VirtualBox from here.
Download Windows 98 SE VirtualBox hard disk image from here.
Set up a virtual machine in VirtualBox. Set the operating system to be Windows 98. Attach the downloaded hard disk image. Set the network adapter to be Host-only adapter.
Start the virtual machine.
Transfer files to the virtual machine
To transfer files to the Windows 98 virtual machine, we need to run an HTTP server on the host OS. HFS is a very easy to use HTTP server. Download HFS from here.
Decompress the archive to D:\freedos_build\hfs. Run D:\freedos_build\hfs\hfs.exe.
In menu Menu - IP address, select 192.168.56.1. This is the IP of VirtualBox's host-only adapter on the host OS.
Drag D:\freedos_build\freedos_kernel.zip to HFS, it should be available to download via URL http://192.168.56.1/freedos_kernel.zip (The port number may be different depending on whether port 80 was occupied when HFS starts up.).
In the virtual machine, open the URL to download the file to C:\freedos_build\freedos_kernel.zip.
Drag D:\freedos_build\freedos_freecom.zip to HFS. In the virtual machine, download it to C:\freedos_build\freedos_freecom.zip.
Drag D:\freedos_build\echoto.c to HFS. In the virtual machine, download it to C:\freedos_build\echoto.c.
Drag D:\freedos_build\echolib.c to HFS. In the virtual machine, download it to C:\freedos_build\echolib.c.
Drag D:\freedos_build\freedos_compilers.zip to HFS. In the virtual machine, download it to C:\freedos_build\freedos_compilers.zip.
Drag D:\freedos_build\winrar3.80.exe to HFS. In the virtual machine, download it to C:\freedos_build\winrar3.80.exe.
Install WinRAR
In the virtual machine, run C:\freedos_build\winrar3.80.exe to install WinRAR.
Install NASM
In the virtual machine, decompress C:\freedos_build\freedos_compilers.zip to C:\freedos_build\freedos_compilers_temp.
Move directory C:\freedos_build\freedos_compilers_temp\FreeDOS 1.2 to C:\freedos_build\freedos_compilers.
Remove C:\freedos_build\freedos_compilers_temp.
Make sure file C:\freedos_build\freedos_compilers\nasm098.exe is there.
Install Turbo C
In the command console, run:
cd C:\freedos_build\freedos_compilers\tc201inst
install.exeIn the prompt Enter the SOURCE drive to use:, enter C.
In the prompt Turbo C Directory:, enter C:\TC201.
In other prompts simply use default settings.
Install Turbo C++
In the command console, run:
cd C:\freedos_build\freedos_compilers\tc101inst
install.exeIn the prompt Enter the SOURCE drive to use:, enter C.
In the prompt Turbo C++ Directory:, enter C:\TCPP.
In other prompts simply use default settings.
Compile echoto and echolib
In the command console, run:
cd C:\freedos_build
SET PATH=%PATH%;C:\tc201
tcc -IC:\tc201\INCLUDE -LC:\tc201\LIB echoto.c
tcc -IC:\tc201\INCLUDE -LC:\tc201\LIB echolib.cThe result files are C:\freedos_build\echoto.exe and C:\freedos_build\echolib.exe.
Compile FreeDOS kernel
Decompress C:\freedos_build\freedos_kernel.zip to C:\freedos_build\freedos_kernel
Rename C:\freedos_build\freedos_kernel\utils\echoto.bat to C:\freedos_build\freedos_kernel\utils\echoto.bat.bak.
Copy C:\freedos_build\echoto.exe to C:\freedos_build\freedos_kernel\utils\echoto.exe.
Edit C:\freedos_build\freedos_kernel\kernek\makefile, change
$(TARGET).lnk: turboc.cfg makefile ../mkfiles/generic.mak ../mkfiles/$(COMPILER).mak
-$(RM) *.lnk
$(ECHOTO) $(TARGET).lnk $(OBJS1)+
$(ECHOTO) $(TARGET).lnk $(OBJS2)+
$(ECHOTO) $(TARGET).lnk $(OBJS3)+
$(ECHOTO) $(TARGET).lnk $(OBJS4)+
$(ECHOTO) $(TARGET).lnk $(OBJS5)+
$(ECHOTO) $(TARGET).lnk $(OBJS6)+
$(ECHOTO) $(TARGET).lnk $(OBJS7)+
$(ECHOTO) $(TARGET).lnk $(OBJS8)
$(ECHOTO) $(TARGET).lnk kernel.exe
$(ECHOTO) $(TARGET).lnk kernel.map
$(ECHOTO) $(TARGET).lnk $(LIBS)to
$(TARGET).lnk: turboc.cfg makefile ../mkfiles/generic.mak ../mkfiles/$(COMPILER).mak
-$(RM) *.lnk
$(ECHOTO) $(TARGET).lnk $(OBJS1)+
$(ECHOTO) $(TARGET).lnk $(OBJS2)+
$(ECHOTO) $(TARGET).lnk $(OBJS3)+
$(ECHOTO) $(TARGET).lnk $(OBJS4)+
$(ECHOTO) $(TARGET).lnk $(OBJS5)+
$(ECHOTO) $(TARGET).lnk $(OBJS6)+
$(ECHOTO) $(TARGET).lnk $(OBJS7)+
$(ECHOTO) $(TARGET).lnk $(OBJS8)+
$(ECHOTO) $(TARGET).lnk , kernel.exe
$(ECHOTO) $(TARGET).lnk , kernel.map
$(ECHOTO) $(TARGET).lnk , $(LIBS)Notice the added one + and three ,.
Copy C:\freedos_build\freedos_kernel\config.b to C:\freedos_build\freedos_kernel\config.bat.
Edit C:\freedos_build\freedos_kernel\config.bat:
set XNASM=nasm098.exe
set COMPILER=TC2
set TC2_BASE=c:\tc201
set XLINK=tlink /m/c/s/l
set PATH=%PATH%;%TC2_BASE%;C:\freedos_build\freedos_compilers
set MAKE=%TC2_BASE%\make
set XCPU=86
set XFAT=32Comment out other variables.
In the command console, run:
cd C:\freedos_build\freedos_kernel
clobber.bat
build.bat
The result files are:
C:\freedos_build\freedos_kernel\bin\country.sysC:\freedos_build\freedos_kernel\bin\kernel.sysC:\freedos_build\freedos_kernel\bin\ktc8632.mapC:\freedos_build\freedos_kernel\bin\ktc8632.sysC:\freedos_build\freedos_kernel\bin\sys.comC:\freedos_build\freedos_kernel\boot\fat12com.bin
The C:\freedos_build\freedos_kernel\bin directory also contains:
C:\freedos_build\freedos_kernel\bin\autoexec.batC:\freedos_build\freedos_kernel\bin\config.sysC:\freedos_build\freedos_kernel\bin\install.bat
Compile FreeDOS freecom
Decompress C:\freedos_build\freedos_freecom.zip to C:\freedos_build\freedos_freecom
Rename C:\freedos_build\freedos_freecom\scripts\echoto.bat to C:\freedos_build\freedos_freecom\scripts\echoto.bat.bak.
Rename C:\freedos_build\freedos_freecom\scripts\echolib.bat to C:\freedos_build\freedos_freecom\scripts\echolib.bat.bak.
Copy C:\freedos_build\echoto.exe to C:\freedos_build\freedos_freecom\scripts\echoto.exe.
Copy C:\freedos_build\echolib.exe to C:\freedos_build\freedos_freecom\scripts\echolib.exe.
Edit C:\freedos_build\freedos_freecom\cmd\cmd.mak, change
echolib.bat : ../scripts/echolib.bat
$(CP) ..$(DIRSEP)scripts$(DIRSEP)echolib.bat .
cmds.rsp : echolib.bat cmd.makto
echolib.exe : ../scripts/echolib.exe
$(CP) ..$(DIRSEP)scripts$(DIRSEP)echolib.exe .
cmds.rsp : echolib.exe cmd.makNotice four .bat have been changed to .exe.
Edit C:\freedos_build\freedos_freecom\lib\lib.mak, change
echolib.bat : ../scripts/echolib.bat
$(CP) ..$(DIRSEP)scripts$(DIRSEP)echolib.bat .
freecom.rsp : echolib.bat $(OBJ16) $(OBJ17) $(OBJ18) $(OBJ19) $(OBJ20) \to
echolib.exe : ../scripts/echolib.exe
$(CP) ..$(DIRSEP)scripts$(DIRSEP)echolib.exe .
freecom.rsp : echolib.exe $(OBJ16) $(OBJ17) $(OBJ18) $(OBJ19) $(OBJ20) \Notice four .bat have been changed to .exe.
Edit C:\freedos_build\freedos_freecom\shell\command.mak, change
echoto.bat: ../scripts/echoto.bat
$(CP) ..$(DIRSEP)scripts$(DIRSEP)echoto.bat .
command.rsp : echoto.bat
$(RMFILES) command.rsp
$(ECHOTO0) command.rsp $(OBJ1)+
$(ECHOTO0) command.rsp $(OBJ2)+
$(ECHOTO0) command.rsp $(OBJ3)+
$(ECHOTO0) command.rsp $(OBJ4)
$(ECHOTO0) command.rsp command.exe
$(ECHOTO0) command.rsp command.map
$(ECHOTO0) command.rsp $(LIBS)to
echoto.exe: ../scripts/echoto.exe
$(CP) ..$(DIRSEP)scripts$(DIRSEP)echoto.exe .
command.rsp : echoto.exe
$(RMFILES) command.rsp
$(ECHOTO0) command.rsp $(OBJ1)+
$(ECHOTO0) command.rsp $(OBJ2)+
$(ECHOTO0) command.rsp $(OBJ3)+
$(ECHOTO0) command.rsp $(OBJ4)+
$(ECHOTO0) command.rsp , command.exe
$(ECHOTO0) command.rsp , command.map
$(ECHOTO0) command.rsp , $(LIBS)Notice four .bat have been changed to .exe, and the added one + and three ,.
Edit C:\freedos_build\freedos_freecom\suppl\src\suppl.mak, change
echolib.bat: ../../scripts/echolib.bat
$(CP) ..$(DIRSEP)..$(DIRSEP)scripts$(DIRSEP)echolib.bat .
# Prepare Linker Response File
objlist.txt: echolib.bat suppl.makto
echolib.exe: ../../scripts/echolib.exe
$(CP) ..$(DIRSEP)..$(DIRSEP)scripts$(DIRSEP)echolib.exe .
# Prepare Linker Response File
objlist.txt: echolib.exe suppl.makNotice four .bat have been changed to .exe.
Copy C:\freedos_build\freedos_freecom\config.std to C:\freedos_build\freedos_freecom\config.mak.
Copy C:\freedos_build\freedos_freecom\config.b to C:\freedos_build\freedos_freecom\config.bat.
Edit C:\freedos_build\freedos_freecom\config.bat:
set XNASM=nasm098.exe
set COMPILER=TURBOCPP
set TP1_BASE=c:\tcpp
set PATH=%PATH%;%TP1_BASE%\bin;C:\freedos_build\freedos_compilers
In the command console, run:
cd C:\freedos_build\freedos_freecom
clean.bat
build.bat -r xms-swap englishThe result file is C:\freedos_build\freedos_freecom\command.com.
Make FreeDOS bootable images
Transfer files to the host OS
In the virtual machine, run:
mkdir C:\freedos_build\freedos_fd
COPY C:\freedos_build\freedos_kernel\bin\* C:\freedos_build\freedos_fd
COPY C:\freedos_build\freedos_kernel\boot\fat12com.bin C:\freedos_build\freedos_fd
COPY C:\freedos_build\freedos_freecom\command.com C:\freedos_build\freedos_fdUse WinRAR to create an archive file C:\freedos_build\freedos_fd.zip.
To transfer C:\freedos_build\freedos_fd.zip to the host OS, we run an HTTP file
upload service on the host OS. The service is written in Python. Create file D:\freedos_build\http_file_upload_service.py:
# coding: utf-8
from __future__ import absolute_import
import os
from flask import abort
from flask import Flask
from flask import request
from werkzeug import secure_filename
UPLOAD_FOLDER = 'D:/freedos_build'
FLASK_APP = Flask(__name__)
@FLASK_APP.route('/', methods=['GET', 'POST'])
def index_handler():
if request.method == 'GET':
html = r"""
<!doctype html>
<html>
<body>
<h1>Upload file</h1>
<form action="" method=post enctype=multipart/form-data>
<p><input type=file name=file><input type=submit value=Upload></p>
</form>
</body>
<html>
"""
return html
if request.method == 'POST':
file = request.files['file']
if not file or not file.filename:
abort(400)
file_name = secure_filename(file.filename)
file_path = os.path.join(UPLOAD_FOLDER, file_name)
file.save(file_path)
return 'SUCCESS'
abort(405)
if __name__ == '__main__':
FLASK_APP.run(host='192.168.56.1', port=8000)Install flask:
python -m pip install flaskRun the service:
python D:\freedos_build\http_file_upload_service.pyOpen http://192.168.56.1:8000/ in the virtual machine.
Upload C:\freedos_build\freedos_fd.zip to the service.
The file will be put to D:\freedos_build\freedos_fd.zip in the host OS.
Make FreeDOS bootable images on Windows
Install bfi
bfi is used to create a floppy image that contains FreeDOS' files. The floppy
image will then be used to create a CD image in floppy emulation mode.
Download bfi from here.
Decompress the archive put bfi.exe to D:\freedos_build\bfi\bfi.exe
Install mkisofs
mkisofs is used to create a CD image.
Download CDR-Tools from here.
Run CDR-Tools.exe and it will install mkisofs.exe to C:\Program Files (x86)\cdrtools\mkisofs.exe.
Make bootable FD image
Decompress D:\freedos_build\freedos_fd.zip to D:\freedos_build\freedos_fd.
Run:
D:\freedos_build\bfi\bfi.exe -b=D:\freedos_build\freedos_fd\fat12com.bin -f=D:\freedos_build\freedos.ima D:\freedos_build\freedos_fdThe FD image is D:\freedos_build\freedos_cd\freedos.ima.
Make bootable CD image
Run:
mkdir D:\freedos_build\freedos_cd
COPY D:\freedos_build\freedos.ima D:\freedos_build\freedos_cd\freedos.ima
"C:\Program Files (x86)\cdrtools\mkisofs.exe" -J -N -l -v -relaxed-filenames -V FreeDOS -b freedos.ima -o D:\freedos_build\freedos.iso D:\freedos_build\freedos_cdThe CD image is D:\freedos_build\freedos.iso.
Make FreeDOS bootable images on Linux
Make bootable FD image
Create empty floppy image:
mkfs.vfat -C ~/freedos_build/freedos.ima 1440
Install FreeDOS' boot sector to the floppy image:
cd ~/freedos_build
unzip freedos_fd.zip
dd conv=notrunc if=~/freedos_build/freedos_fd/fat12com.bin of=~/freedos_build/freedos.ima bs=512 count=1
Copy FreeDOS' files to the floppy image:
mkdir -v ~/freedos_build/freedos_fd_mount
mount -o loop -t vfat ~/freedos_build/freedos.ima ~/freedos_build/freedos_fd_mount
cp -v ~/freedos_build/freedos_fd/* ~/freedos_build/freedos_fd_mount
umount ~/freedos_build/freedos_fd_mountThe FD image is ~/freedos_build/freedos.ima.
Make bootable CD image
Run:
mkdir -v ~/freedos_build/freedos_cd
cp -v ~/freedos_build/freedos.ima freedos_cd/freedos.ima
mkisofs -J -N -l -v -relaxed-filenames -V FreeDOS -b freedos.ima -o ~/freedos_build/freedos.iso freedos_cdThe CD image is ~/freedos_build/freedos.iso.
Comments: