FreeNOS是一个使用C++编写的一个具有完整多任务调度,进程间通信以及中断处理等功能作系统,还包括文件系统挂载,文件节点创建,基本上涵盖了一个操作系统启动初期的实地址模式到保护模式的跳转,初始化硬件资源以及实现内核态与用户态的陷阱门接口,加载设备驱动,最后进入shell终端,是学习操作系统很好的一个开源项目。
项目主页 www.freenos.org,也即是FreeNOS的官网,如下:
该项目源码使用C++编写,使用了许多经典的设计模式,模块类,虚函数也运用的十分巧妙,对深刻学习理解C++编程有很大的帮助作用。
编译过程会遇到很多坑,如果读者遇到了坑,看看《编译FreeNOS遇到的坑汇总》是否有解决方法了。
读者可以从官网上下载源码,也可以从GitHub上下载源码。截至2022年2月2日,最新的版本为1.0.3版本,GitHub历史版本有很多,如下:
编译过程基本上是按照官网documentation描述来的,如下:
之后就跳转到FreeNOS/README.md at master · nieklinnenbank/FreeNOS · GitHub 页面,按页面的来就行,也可以在源码目录的根目录下,找到README.md文件,里面也有编译过程的说明。
下面就以1.0.3版本,以64位x86架构的机器,以Ubuntu 16.04操作系统为例子来讲解编译过程,基本上是翻译README.md文件的内容,只是对坑做了重点说明。
首先需要在机器上安装一些依赖库或工具。FreeNOS需要SCons和C++编译器,如:g++,用于编译生成镜像文件。
1:执行如下命令,以便更新系统库缓冲和安装一些必要的开发工具:
sudo apt-get update
sudo apt-get install build-essential scons genisoimage xorriso qemu-system binutils-multiarch u-boot-tools
说明:scons是Linux下的一种自动构建工具,类似于cmake,在安装scons之前,需要确保已经安装过python,Ubuntu16.04自带python2.7,所以不需要重复安装python。
2:如果系统是64位的,你需要执行如下命令以安装GCC multilib package包以便能交叉编译以适应32位的架构。
sudo apt-get install gcc-multilib g++-multilib
3:下载源码,执行如下命令下载最新源码:
git clone https://github.com/nieklinnenbank/FreeNOS
4:为了编译构建FreeNOS,执行如下命令:(注意:该命令采用默认设置构建,默认是指:Intel架构的cpu,采用gcc的debug模式)
scons
注意这里有2个坑: 坑1:编译时会弹出如下错误: scons: Building targets ..、ISO build/intel/pc/boot.iso grub-mkrescue: error: /usr/lib/grub/i386-pc/modinfo.sh doesn't exist、Please specify --target or --directory 这个坑请参考《编译FreeNOS报/usr/lib/grub/i386-pc/modinfo.sh doesn‘t exist错误》博文解决。 坑2: importError: No module named pysvn这个坑请参考《编译FreeNOS遇到的坑汇总》的坑4描述解决。
如果一切没问题,在freeNOS/FreeNOS-1.0.3/build/intel/pc目录下会生成boot.iso文件,如果没生成,证明编译构建没成功!
为了在编译时将所有的构建命令输出到控制台,可以采用如下命令编译构建:
scons VERBOSE=True
为了在编译构建过程中开启编译器优化功能,可以采用如下命令编译构建:
scons DEBUG=False
但是这样的话,将会导致GDB调试功能失效。为了清除构建目录,可以执行如下命令:
scons -c
为了删除编译构建过程中产生的scons临时文件,可以执行如下命令:
rm -rf build .sconf_temp .sconsign.dblite
以上说明的是基于intel+X86_64的编译构建方法,对于ARM的请参见上文提到的README.md文件描述。
参考链接:https://blog.csdn.net/weixin_38134600/article/details/88329971