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

FreeNOS源码编译相关推荐

  1. java调用clang编译的so_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实

    好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...

  2. 5单个编译总会编译全部_玩转Android10(五)源码编译开发中常用命令

    源码开发编译中,熟练掌握常用命令,可以提高开发工作效率.Android源码中,将相关的命令分为如下几类: 1.初始化源码编译环境 初始化编译环境,为后续提供如lunch.make.xxgrep.god ...

  3. mono和monodevelop源码编译安装

    之所以用源码编译的方式安装mono和monodevelop,是因为通过yum安装的mono不是最新版本,而且monodevelop不能建 asp.net MVC3的工程. 而且通过源码安装,可以进一步 ...

  4. nginx源码编译、负载均衡及模块的扩展

    1.nginx源码编译 实验环境: iptables和selinux关闭 redhat6.5 nginx:test1: 172.25.1.11 [root@test1 ~]# ls nginx-1.1 ...

  5. mac通过tree源码编译安装tree

    通过tree源码编译安装  下载源码:curl -O ftp://mama.indstate.edu/linux/tree/tree-1.6.0.tgz  解压源码:tar xzvf tree-1.6 ...

  6. 干货|TensorFlow开发环境搭建(Ubuntu16.04+GPU+TensorFlow源码编译)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习算法工程师 安装平台 1 平台 目前Tensor ...

  7. Nginx 源码编译安装

    Nginx 源码编译安装环境 Centos7 Nginx1.8.1    下载地址:http://nginx.org/download/ 选择自己想要的版本 我这边使用1.8.1,下载地址:http: ...

  8. 基本lnmp平台的搭建(源码编译)

    lnmp :linux ,nginx ,mysql ,php 系统环境:rhel6.0    selinux and iptables disabled  (这里我们都只用源码编译的方式) 1 ste ...

  9. 源码编译安装percona-xtrabackup-2.3.2

    一.系统包需求 rpm -q libaio-devel libgpg-error-devel libgcrypt-devel autoconf automake libidn-devel libcur ...

最新文章

  1. 解决fitz模块报错
  2. Fast RCNN 训练自己数据集 (1编译配置)
  3. 【Kotlin】抽象类 ( 声明 | 抽象类成员 | 抽象类继承 | 抽象方法覆盖 | 抽象方法实现 )
  4. vue项目中批量打印二维码
  5. 一个简单的Android音乐播放器
  6. VSTS TFS 强制删除签出锁定项 解除 锁定
  7. 笨办法学 Python · 续 练习 42:SQL 删除
  8. apache配置防盗链
  9. python 随机密码生成_python生成随机密码,包含大小写和数字
  10. 生活随记 - NBA总决赛第6场 球迷有感
  11. Python爬取链家的数据并绘制热力图
  12. 《液晶显示器和液晶电视维修核心教程》——第1章 液晶显示器维修概要1.1 液晶显示器的基本知识...
  13. 十一课堂|通过小游戏学习Ethereum DApps编程(1)
  14. 计算机组成原理 | 第八章《计算机的外围设备》、第九章《输入/输出系统》 学习笔记
  15. 双硬盘+win10+Ubuntu20.04双系统安装安装教程(UEFI)
  16. 阿里云入门级服务器和企业级服务器有什么区别?
  17. (Cisco)思科网院所有模块测试题答案整理汇总_计算机网络
  18. 《首先,打破一切常规》附录:发现12个问题
  19. Winsock LSP劫持导致无法上网
  20. arcgis fishnet 单位_【转载】ArcGIS生成规则网格(Fishnet)

热门文章

  1. 电为啥要分交流、直流?
  2. python执行sqlserver存储过程_python – 从SqlAlchemy调用MSSQL存储过程
  3. contourf参数 python_Python机器学习(六)
  4. go channel 缓冲区最大限制_一起攻克面试难关:Go 面试每天一篇(第 40 天)
  5. 事务流程java怎么实现_使用队列和事务实现采集数据实例流程
  6. Gcd HDU - 6545 (基础数论)
  7. Ansible入门及组件介绍
  8. JZOJ5944信标
  9. SpringMVC的启动过程
  10. 深入解析thinkphp中的addAll方法